aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--package.json2
-rw-r--r--pirc.js192
2 files changed, 150 insertions, 44 deletions
diff --git a/package.json b/package.json
index ece79f8..b202d15 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "pirc-extension",
- "version": "0.1.9-dev+ffb2c286e582",
+ "version": "0.1.9-dev+517e92a48990",
"description": "PiRC: puts every interactive pi session on a PiRC relay",
"license": "MIT",
"homepage": "https://pirc.dev",
diff --git a/pirc.js b/pirc.js
index 42481da..8d8d475 100644
--- a/pirc.js
+++ b/pirc.js
@@ -1,4 +1,4 @@
-// PiRC extension 0.1.9-dev+ffb2c286e582. Third-party code in this file: @bufbuild/protobuf@2.16.0, ws@8.22.0; see NOTICE.
+// PiRC extension 0.1.9-dev+517e92a48990. Third-party code in this file: @bufbuild/protobuf@2.16.0, ws@8.22.0; see NOTICE.
import { createRequire as __pircCreateRequire } from "node:module";
const require = __pircCreateRequire(import.meta.url);
var __create = Object.create;
@@ -6759,13 +6759,16 @@ var TimestampSchema = /* @__PURE__ */ messageDesc(file_google_protobuf_timestamp
function timestampFromDate(date) {
return timestampFromMs(date.getTime());
}
-function timestampFromMs(timestampMs) {
- const seconds = Math.floor(timestampMs / 1e3);
+function timestampFromMs(timestampMs2) {
+ const seconds = Math.floor(timestampMs2 / 1e3);
return create(TimestampSchema, {
seconds: protoInt64.parse(seconds),
- nanos: (timestampMs - seconds * 1e3) * 1e6
+ nanos: (timestampMs2 - seconds * 1e3) * 1e6
});
}
+function timestampMs(timestamp) {
+ return Number(timestamp.seconds) * 1e3 + Math.round(timestamp.nanos / 1e6);
+}
// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/to-binary.js
var IMPLICIT3 = 2;
@@ -7140,17 +7143,18 @@ var file_pirc_v1alpha1_relay = /* @__PURE__ */ fileDesc("ChlwaXJjL3YxYWxwaGExL3J
var FrameSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_relay, 0);
// protocol/gen/pirc/v1alpha1/session_pb.ts
-var file_pirc_v1alpha1_session = /* @__PURE__ */ fileDesc("ChtwaXJjL3YxYWxwaGExL3Nlc3Npb24ucHJvdG8SDXBpcmMudjFhbHBoYTEiuQMKE1Nlc3Npb25Bbm5vdW5jZW1lbnQSDAoEbmFtZRgBIAEoCRILCgNjd2QYAiABKAkSEAoIaG9zdG5hbWUYAyABKAkSIwoFbW9kZWwYBCABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsEjQKDnRoaW5raW5nX2xldmVsGAUgASgOMhwucGlyYy52MWFscGhhMS5UaGlua2luZ0xldmVsEg8KB3dvcmtpbmcYBiABKAgSLgoKc3RhcnRlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASGwoTcmVwbGFjZXNfc2Vzc2lvbl9pZBgIIAEoCRIsCgZvcmlnaW4YCSABKA4yHC5waXJjLnYxYWxwaGExLlNlc3Npb25PcmlnaW4SEgoKcGlfdmVyc2lvbhgKIAEoCRIZChFleHRlbnNpb25fdmVyc2lvbhgLIAEoCRISCgpjb21wYWN0aW5nGAwgASgIEiMKBXBsYWNlGA0gASgLMhQucGlyYy52MWFscGhhMS5QbGFjZRIUCgxmaXJzdF9wcm9tcHQYDiABKAkSEAoIcmVxdWVzdHMYDyADKAkirQEKBVBsYWNlEgwKBGtpbmQYASABKAkSDQoFZ3JvdXAYAiABKAkSGQoMZ3JvdXBfbnVtYmVyGAMgASgNSACIAQESDgoGd2luZG93GAQgASgJEhoKDXdpbmRvd19udW1iZXIYBSABKA1IAYgBARIMCgRwYW5lGAYgASgJEg8KB2Rpc3BsYXkYByABKAlCDwoNX2dyb3VwX251bWJlckIQCg5fd2luZG93X251bWJlciIzCgVNb2RlbBIQCghwcm92aWRlchgBIAEoCRIKCgJpZBgCIAEoCRIMCgRuYW1lGAMgASgJIoQJCg5TZXNzaW9uTWVzc2FnZRISCgpyZXF1ZXN0X2lkGDIgASgJEicKBnByb21wdBgBIAEoCzIVLnBpcmMudjFhbHBoYTEuUHJvbXB0SAASJQoFYWJvcnQYAiABKAsyFC5waXJjLnYxYWxwaGExLkFib3J0SAASOAoPaGlzdG9yeV9yZXF1ZXN0GAMgASgLMh0ucGlyYy52MWFscGhhMS5IaXN0b3J5UmVxdWVzdEgAEjAKC2xpc3RfbW9kZWxzGAQgASgLMhkucGlyYy52MWFscGhhMS5MaXN0TW9kZWxzSAASLAoJc2V0X21vZGVsGAUgASgLMhcucGlyYy52MWFscGhhMS5TZXRNb2RlbEgAEj0KEnNldF90aGlua2luZ19sZXZlbBgGIAEoCzIfLnBpcmMudjFhbHBoYTEuU2V0VGhpbmtpbmdMZXZlbEgAEikKB2NvbXBhY3QYByABKAsyFi5waXJjLnYxYWxwaGExLkNvbXBhY3RIABIwCgtuZXdfc2Vzc2lvbhgIIAEoCzIZLnBpcmMudjFhbHBoYTEuTmV3U2Vzc2lvbkgAEicKBnJlbmFtZRgJIAEoCzIVLnBpcmMudjFhbHBoYTEuUmVuYW1lSAASNAoNc3RhdHNfcmVxdWVzdBgRIAEoCzIbLnBpcmMudjFhbHBoYTEuU3RhdHNSZXF1ZXN0SAASNAoNbGlzdF9jb21tYW5kcxgSIAEoCzIbLnBpcmMudjFhbHBoYTEuTGlzdENvbW1hbmRzSAASIwoEZm9yaxgTIAEoCzITLnBpcmMudjFhbHBoYTEuRm9ya0gAEiUKBWNsb25lGBQgASgLMhQucGlyYy52MWFscGhhMS5DbG9uZUgAEj0KEmxpc3RfcGFzdF9zZXNzaW9ucxgVIAEoCzIfLnBpcmMudjFhbHBoYTEuTGlzdFBhc3RTZXNzaW9uc0gAEicKBnJlc3VtZRgWIAEoCzIVLnBpcmMudjFhbHBoYTEuUmVzdW1lSAASJwoGcmVsb2FkGBggASgLMhUucGlyYy52MWFscGhhMS5SZWxvYWRIABIsCgVldmVudBgKIAEoCzIbLnBpcmMudjFhbHBoYTEuU2Vzc2lvbkV2ZW50SAASKQoHaGlzdG9yeRgLIAEoCzIWLnBpcmMudjFhbHBoYTEuSGlzdG9yeUgAEisKCGFjY2VwdGVkGAwgASgLMhcucGlyYy52MWFscGhhMS5BY2NlcHRlZEgAEiUKBWVycm9yGA0gASgLMhQucGlyYy52MWFscGhhMS5FcnJvckgAEicKBm1vZGVscxgOIAEoCzIVLnBpcmMudjFhbHBoYTEuTW9kZWxzSAASJQoFc3RhdHMYDyABKAsyFC5waXJjLnYxYWxwaGExLlN0YXRzSAASKwoIY29tbWFuZHMYECABKAsyFy5waXJjLnYxYWxwaGExLkNvbW1hbmRzSAASNAoNcGFzdF9zZXNzaW9ucxgXIAEoCzIbLnBpcmMudjFhbHBoYTEuUGFzdFNlc3Npb25zSABCBgoEYm9keSIgCgpMaXN0TW9kZWxzEhIKCnJlcXVlc3RfaWQYASABKAkicQoGTW9kZWxzEhIKCnJlcXVlc3RfaWQYASABKAkSKAoGbW9kZWxzGAIgAygLMhgucGlyYy52MWFscGhhMS5Nb2RlbEluZm8SKQoHY3VycmVudBgDIAEoCzIYLnBpcmMudjFhbHBoYTEuTW9kZWxJbmZvImsKCU1vZGVsSW5mbxIjCgVtb2RlbBgBIAEoCzIULnBpcmMudjFhbHBoYTEuTW9kZWwSEQoJcmVhc29uaW5nGAIgASgIEhYKDmNvbnRleHRfd2luZG93GAMgASgEEg4KBmltYWdlcxgEIAEoCCJDCghTZXRNb2RlbBISCgpyZXF1ZXN0X2lkGAEgASgJEiMKBW1vZGVsGAIgASgLMhQucGlyYy52MWFscGhhMS5Nb2RlbCJTChBTZXRUaGlua2luZ0xldmVsEhIKCnJlcXVlc3RfaWQYASABKAkSKwoFbGV2ZWwYAiABKA4yHC5waXJjLnYxYWxwaGExLlRoaW5raW5nTGV2ZWwiMwoHQ29tcGFjdBISCgpyZXF1ZXN0X2lkGAEgASgJEhQKDGluc3RydWN0aW9ucxgCIAEoCSIgCgpOZXdTZXNzaW9uEhIKCnJlcXVlc3RfaWQYASABKAkiLAoERm9yaxISCgpyZXF1ZXN0X2lkGAEgASgJEhAKCGVudHJ5X2lkGAIgASgJIhsKBUNsb25lEhIKCnJlcXVlc3RfaWQYASABKAkiOwoQTGlzdFBhc3RTZXNzaW9ucxISCgpyZXF1ZXN0X2lkGAEgASgJEhMKC2FsbF9mb2xkZXJzGAIgASgIImMKDFBhc3RTZXNzaW9ucxISCgpyZXF1ZXN0X2lkGAEgASgJEiwKCHNlc3Npb25zGAIgAygLMhoucGlyYy52MWFscGhhMS5QYXN0U2Vzc2lvbhIRCgl0cnVuY2F0ZWQYAyABKAgi2AEKC1Bhc3RTZXNzaW9uEgwKBHBhdGgYASABKAkSEgoKc2Vzc2lvbl9pZBgCIAEoCRILCgNjd2QYAyABKAkSDAoEbmFtZRgEIAEoCRIUCgxmaXJzdF9wcm9tcHQYBSABKAkSLgoKY3JlYXRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoLbW9kaWZpZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhUKDW1lc3NhZ2VfY291bnQYCCABKA0iKgoGUmVzdW1lEhIKCnJlcXVlc3RfaWQYASABKAkSDAoEcGF0aBgCIAEoCSIcCgZSZWxvYWQSEgoKcmVxdWVzdF9pZBgBIAEoCSIqCgZSZW5hbWUSEgoKcmVxdWVzdF9pZBgBIAEoCRIMCgRuYW1lGAIgASgJIiIKDFN0YXRzUmVxdWVzdBISCgpyZXF1ZXN0X2lkGAEgASgJIogBCgVTdGF0cxISCgpyZXF1ZXN0X2lkGAEgASgJEiMKBXRvdGFsGAIgASgLMhQucGlyYy52MWFscGhhMS5Vc2FnZRIbCg5jb250ZXh0X3Rva2VucxgDIAEoBEgAiAEBEhYKDmNvbnRleHRfd2luZG93GAQgASgEQhEKD19jb250ZXh0X3Rva2VucyIiCgxMaXN0Q29tbWFuZHMSEgoKcmVxdWVzdF9pZBgBIAEoCSJMCghDb21tYW5kcxISCgpyZXF1ZXN0X2lkGAEgASgJEiwKCGNvbW1hbmRzGAIgAygLMhoucGlyYy52MWFscGhhMS5Db21tYW5kSW5mbyJeCgtDb21tYW5kSW5mbxIMCgRuYW1lGAEgASgJEhMKC2Rlc2NyaXB0aW9uGAIgASgJEiwKBnNvdXJjZRgDIAEoDjIcLnBpcmMudjFhbHBoYTEuQ29tbWFuZFNvdXJjZSJ7CgZQcm9tcHQSEgoKcmVxdWVzdF9pZBgBIAEoCRIMCgR0ZXh0GAIgASgJEiQKBmltYWdlcxgDIAMoCzIULnBpcmMudjFhbHBoYTEuSW1hZ2USKQoIZGVsaXZlcnkYBCABKA4yFy5waXJjLnYxYWxwaGExLkRlbGl2ZXJ5IigKBUltYWdlEhEKCW1pbWVfdHlwZRgBIAEoCRIMCgRkYXRhGAIgASgMIhsKBUFib3J0EhIKCnJlcXVlc3RfaWQYASABKAkiMwoOSGlzdG9yeVJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRINCgVsaW1pdBgCIAEoDSJtCgdIaXN0b3J5EhIKCnJlcXVlc3RfaWQYASABKAkSLgoFaXRlbXMYAiADKAsyHy5waXJjLnYxYWxwaGExLkNvbnZlcnNhdGlvbkl0ZW0SCwoDc2VxGAMgASgEEhEKCXRydW5jYXRlZBgEIAEoCCIeCghBY2NlcHRlZBISCgpyZXF1ZXN0X2lkGAEgASgJIuICCgxTZXNzaW9uRXZlbnQSCwoDc2VxGAEgASgEEiYKAmF0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIvCgRpdGVtGAMgASgLMh8ucGlyYy52MWFscGhhMS5Db252ZXJzYXRpb25JdGVtSAASOAoPYXNzaXN0YW50X2RlbHRhGAQgASgLMh0ucGlyYy52MWFscGhhMS5Bc3Npc3RhbnREZWx0YUgAEjQKDXRvb2xfcHJvZ3Jlc3MYBSABKAsyGy5waXJjLnYxYWxwaGExLlRvb2xQcm9ncmVzc0gAEjgKD3dvcmtpbmdfY2hhbmdlZBgGIAEoCzIdLnBpcmMudjFhbHBoYTEuV29ya2luZ0NoYW5nZWRIABI6Cgxhbm5vdW5jZW1lbnQYByABKAsyIi5waXJjLnYxYWxwaGExLlNlc3Npb25Bbm5vdW5jZW1lbnRIAEIGCgRib2R5IugCChBDb252ZXJzYXRpb25JdGVtEhAKCGVudHJ5X2lkGAEgASgJEg8KB3R1cm5faWQYAiABKAkSJgoCYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjIKDHVzZXJfbWVzc2FnZRgEIAEoCzIaLnBpcmMudjFhbHBoYTEuVXNlck1lc3NhZ2VIABI8ChFhc3Npc3RhbnRfbWVzc2FnZRgFIAEoCzIfLnBpcmMudjFhbHBoYTEuQXNzaXN0YW50TWVzc2FnZUgAEiwKCXRvb2xfY2FsbBgGIAEoCzIXLnBpcmMudjFhbHBoYTEuVG9vbENhbGxIABIwCgt0b29sX3Jlc3VsdBgHIAEoCzIZLnBpcmMudjFhbHBoYTEuVG9vbFJlc3VsdEgAEi8KCmNvbXBhY3Rpb24YCCABKAsyGS5waXJjLnYxYWxwaGExLkNvbXBhY3Rpb25IAEIGCgRib2R5IlUKC1VzZXJNZXNzYWdlEgwKBHRleHQYASABKAkSJAoGaW1hZ2VzGAIgAygLMhQucGlyYy52MWFscGhhMS5JbWFnZRISCgpyZXF1ZXN0X2lkGAMgASgJIuUBChBBc3Npc3RhbnRNZXNzYWdlEhIKCm1lc3NhZ2VfaWQYASABKAkSLAoHY29udGVudBgCIAMoCzIbLnBpcmMudjFhbHBoYTEuQ29udGVudEJsb2NrEiMKBXVzYWdlGAMgASgLMhQucGlyYy52MWFscGhhMS5Vc2FnZRIuCgtzdG9wX3JlYXNvbhgEIAEoDjIZLnBpcmMudjFhbHBoYTEuU3RvcFJlYXNvbhIjCgVtb2RlbBgFIAEoCzIULnBpcmMudjFhbHBoYTEuTW9kZWwSFQoNZXJyb3JfbWVzc2FnZRgGIAEoCSI6CgxDb250ZW50QmxvY2sSDgoEdGV4dBgBIAEoCUgAEhIKCHRoaW5raW5nGAIgASgJSABCBgoEYm9keSJ5CgVVc2FnZRIUCgxpbnB1dF90b2tlbnMYASABKAQSFQoNb3V0cHV0X3Rva2VucxgCIAEoBBIZChFjYWNoZV9yZWFkX3Rva2VucxgDIAEoBBIaChJjYWNoZV93cml0ZV90b2tlbnMYBCABKAQSDAoEY29zdBgFIAEoASJ2Cg5Bc3Npc3RhbnREZWx0YRISCgptZXNzYWdlX2lkGAEgASgJEg8KB3R1cm5faWQYAiABKAkSEwoLYmxvY2tfaW5kZXgYAyABKA0SDgoEdGV4dBgEIAEoCUgAEhIKCHRoaW5raW5nGAUgASgJSABCBgoEYm9keSJLCghUb29sQ2FsbBIUCgx0b29sX2NhbGxfaWQYASABKAkSEQoJdG9vbF9uYW1lGAIgASgJEhYKDmFyZ3VtZW50c19qc29uGAMgASgJIkIKClRvb2xSZXN1bHQSFAoMdG9vbF9jYWxsX2lkGAEgASgJEhAKCGlzX2Vycm9yGAIgASgIEgwKBHRleHQYAyABKAkiQwoMVG9vbFByb2dyZXNzEhQKDHRvb2xfY2FsbF9pZBgBIAEoCRIPCgd0dXJuX2lkGAIgASgJEgwKBHRleHQYAyABKAkiIQoOV29ya2luZ0NoYW5nZWQSDwoHd29ya2luZxgBIAEoCCI0CgpDb21wYWN0aW9uEg8KB3N1bW1hcnkYASABKAkSFQoNdG9rZW5zX2JlZm9yZRgCIAEoBCqyAQoNU2Vzc2lvbk9yaWdpbhIeChpTRVNTSU9OX09SSUdJTl9VTlNQRUNJRklFRBAAEhoKFlNFU1NJT05fT1JJR0lOX1NUQVJUVVAQARIWChJTRVNTSU9OX09SSUdJTl9ORVcQAhIZChVTRVNTSU9OX09SSUdJTl9SRVNVTUUQAxIXChNTRVNTSU9OX09SSUdJTl9GT1JLEAQSGQoVU0VTU0lPTl9PUklHSU5fUkVMT0FEEAUq4QEKDVRoaW5raW5nTGV2ZWwSHgoaVEhJTktJTkdfTEVWRUxfVU5TUEVDSUZJRUQQABIWChJUSElOS0lOR19MRVZFTF9PRkYQARIaChZUSElOS0lOR19MRVZFTF9NSU5JTUFMEAISFgoSVEhJTktJTkdfTEVWRUxfTE9XEAMSGQoVVEhJTktJTkdfTEVWRUxfTUVESVVNEAQSFwoTVEhJTktJTkdfTEVWRUxfSElHSBAFEhgKFFRISU5LSU5HX0xFVkVMX1hISUdIEAYSFgoSVEhJTktJTkdfTEVWRUxfTUFYEAcqggEKDUNvbW1hbmRTb3VyY2USHgoaQ09NTUFORF9TT1VSQ0VfVU5TUEVDSUZJRUQQABIcChhDT01NQU5EX1NPVVJDRV9FWFRFTlNJT04QARIZChVDT01NQU5EX1NPVVJDRV9QUk9NUFQQAhIYChRDT01NQU5EX1NPVVJDRV9TS0lMTBADKlAKCERlbGl2ZXJ5EhgKFERFTElWRVJZX1VOU1BFQ0lGSUVEEAASEgoOREVMSVZFUllfU1RFRVIQARIWChJERUxJVkVSWV9GT0xMT1dfVVAQAiq7AQoKU3RvcFJlYXNvbhIbChdTVE9QX1JFQVNPTl9VTlNQRUNJRklFRBAAEhQKEFNUT1BfUkVBU09OX1NUT1AQARIWChJTVE9QX1JFQVNPTl9MRU5HVEgQAhIYChRTVE9QX1JFQVNPTl9UT09MX1VTRRADEhcKE1NUT1BfUkVBU09OX0FCT1JURUQQBBIVChFTVE9QX1JFQVNPTl9FUlJPUhAFEhgKFFNUT1BfUkVBU09OX0RFRkVSUkVEEAZCrQEKEWNvbS5waXJjLnYxYWxwaGExQgxTZXNzaW9uUHJvdG9QAVo1cGlyYy5kZXYvcmVsYXkvaW50ZXJuYWwvcGIvcGlyYy92MWFscGhhMTtwaXJjdjFhbHBoYTGiAgNQWFiqAg1QaXJjLlYxYWxwaGExygINUGlyY1xWMWFscGhhMeICGVBpcmNcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAg5QaXJjOjpWMWFscGhhMWIGcHJvdG8z", [file_google_protobuf_timestamp, file_pirc_v1alpha1_common]);
+var file_pirc_v1alpha1_session = /* @__PURE__ */ fileDesc("ChtwaXJjL3YxYWxwaGExL3Nlc3Npb24ucHJvdG8SDXBpcmMudjFhbHBoYTEiuQMKE1Nlc3Npb25Bbm5vdW5jZW1lbnQSDAoEbmFtZRgBIAEoCRILCgNjd2QYAiABKAkSEAoIaG9zdG5hbWUYAyABKAkSIwoFbW9kZWwYBCABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsEjQKDnRoaW5raW5nX2xldmVsGAUgASgOMhwucGlyYy52MWFscGhhMS5UaGlua2luZ0xldmVsEg8KB3dvcmtpbmcYBiABKAgSLgoKc3RhcnRlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASGwoTcmVwbGFjZXNfc2Vzc2lvbl9pZBgIIAEoCRIsCgZvcmlnaW4YCSABKA4yHC5waXJjLnYxYWxwaGExLlNlc3Npb25PcmlnaW4SEgoKcGlfdmVyc2lvbhgKIAEoCRIZChFleHRlbnNpb25fdmVyc2lvbhgLIAEoCRISCgpjb21wYWN0aW5nGAwgASgIEiMKBXBsYWNlGA0gASgLMhQucGlyYy52MWFscGhhMS5QbGFjZRIUCgxmaXJzdF9wcm9tcHQYDiABKAkSEAoIcmVxdWVzdHMYDyADKAkirQEKBVBsYWNlEgwKBGtpbmQYASABKAkSDQoFZ3JvdXAYAiABKAkSGQoMZ3JvdXBfbnVtYmVyGAMgASgNSACIAQESDgoGd2luZG93GAQgASgJEhoKDXdpbmRvd19udW1iZXIYBSABKA1IAYgBARIMCgRwYW5lGAYgASgJEg8KB2Rpc3BsYXkYByABKAlCDwoNX2dyb3VwX251bWJlckIQCg5fd2luZG93X251bWJlciIzCgVNb2RlbBIQCghwcm92aWRlchgBIAEoCRIKCgJpZBgCIAEoCRIMCgRuYW1lGAMgASgJIo0KCg5TZXNzaW9uTWVzc2FnZRISCgpyZXF1ZXN0X2lkGDIgASgJEicKBnByb21wdBgBIAEoCzIVLnBpcmMudjFhbHBoYTEuUHJvbXB0SAASJQoFYWJvcnQYAiABKAsyFC5waXJjLnYxYWxwaGExLkFib3J0SAASOAoPaGlzdG9yeV9yZXF1ZXN0GAMgASgLMh0ucGlyYy52MWFscGhhMS5IaXN0b3J5UmVxdWVzdEgAEjAKC2xpc3RfbW9kZWxzGAQgASgLMhkucGlyYy52MWFscGhhMS5MaXN0TW9kZWxzSAASLAoJc2V0X21vZGVsGAUgASgLMhcucGlyYy52MWFscGhhMS5TZXRNb2RlbEgAEj0KEnNldF90aGlua2luZ19sZXZlbBgGIAEoCzIfLnBpcmMudjFhbHBoYTEuU2V0VGhpbmtpbmdMZXZlbEgAEikKB2NvbXBhY3QYByABKAsyFi5waXJjLnYxYWxwaGExLkNvbXBhY3RIABIwCgtuZXdfc2Vzc2lvbhgIIAEoCzIZLnBpcmMudjFhbHBoYTEuTmV3U2Vzc2lvbkgAEicKBnJlbmFtZRgJIAEoCzIVLnBpcmMudjFhbHBoYTEuUmVuYW1lSAASNAoNc3RhdHNfcmVxdWVzdBgRIAEoCzIbLnBpcmMudjFhbHBoYTEuU3RhdHNSZXF1ZXN0SAASNAoNbGlzdF9jb21tYW5kcxgSIAEoCzIbLnBpcmMudjFhbHBoYTEuTGlzdENvbW1hbmRzSAASIwoEZm9yaxgTIAEoCzITLnBpcmMudjFhbHBoYTEuRm9ya0gAEiUKBWNsb25lGBQgASgLMhQucGlyYy52MWFscGhhMS5DbG9uZUgAEj0KEmxpc3RfcGFzdF9zZXNzaW9ucxgVIAEoCzIfLnBpcmMudjFhbHBoYTEuTGlzdFBhc3RTZXNzaW9uc0gAEicKBnJlc3VtZRgWIAEoCzIVLnBpcmMudjFhbHBoYTEuUmVzdW1lSAASJwoGcmVsb2FkGBggASgLMhUucGlyYy52MWFscGhhMS5SZWxvYWRIABI0Cg1uYXZpZ2F0ZV90cmVlGBkgASgLMhsucGlyYy52MWFscGhhMS5OYXZpZ2F0ZVRyZWVIABIsCglsaXN0X3RyZWUYGiABKAsyFy5waXJjLnYxYWxwaGExLkxpc3RUcmVlSAASLAoFZXZlbnQYCiABKAsyGy5waXJjLnYxYWxwaGExLlNlc3Npb25FdmVudEgAEikKB2hpc3RvcnkYCyABKAsyFi5waXJjLnYxYWxwaGExLkhpc3RvcnlIABIrCghhY2NlcHRlZBgMIAEoCzIXLnBpcmMudjFhbHBoYTEuQWNjZXB0ZWRIABIlCgVlcnJvchgNIAEoCzIULnBpcmMudjFhbHBoYTEuRXJyb3JIABInCgZtb2RlbHMYDiABKAsyFS5waXJjLnYxYWxwaGExLk1vZGVsc0gAEiUKBXN0YXRzGA8gASgLMhQucGlyYy52MWFscGhhMS5TdGF0c0gAEisKCGNvbW1hbmRzGBAgASgLMhcucGlyYy52MWFscGhhMS5Db21tYW5kc0gAEjQKDXBhc3Rfc2Vzc2lvbnMYFyABKAsyGy5waXJjLnYxYWxwaGExLlBhc3RTZXNzaW9uc0gAEiMKBHRyZWUYGyABKAsyEy5waXJjLnYxYWxwaGExLlRyZWVIAEIGCgRib2R5IiAKCkxpc3RNb2RlbHMSEgoKcmVxdWVzdF9pZBgBIAEoCSJxCgZNb2RlbHMSEgoKcmVxdWVzdF9pZBgBIAEoCRIoCgZtb2RlbHMYAiADKAsyGC5waXJjLnYxYWxwaGExLk1vZGVsSW5mbxIpCgdjdXJyZW50GAMgASgLMhgucGlyYy52MWFscGhhMS5Nb2RlbEluZm8iawoJTW9kZWxJbmZvEiMKBW1vZGVsGAEgASgLMhQucGlyYy52MWFscGhhMS5Nb2RlbBIRCglyZWFzb25pbmcYAiABKAgSFgoOY29udGV4dF93aW5kb3cYAyABKAQSDgoGaW1hZ2VzGAQgASgIIkMKCFNldE1vZGVsEhIKCnJlcXVlc3RfaWQYASABKAkSIwoFbW9kZWwYAiABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsIlMKEFNldFRoaW5raW5nTGV2ZWwSEgoKcmVxdWVzdF9pZBgBIAEoCRIrCgVsZXZlbBgCIAEoDjIcLnBpcmMudjFhbHBoYTEuVGhpbmtpbmdMZXZlbCIzCgdDb21wYWN0EhIKCnJlcXVlc3RfaWQYASABKAkSFAoMaW5zdHJ1Y3Rpb25zGAIgASgJIiAKCk5ld1Nlc3Npb24SEgoKcmVxdWVzdF9pZBgBIAEoCSIsCgRGb3JrEhIKCnJlcXVlc3RfaWQYASABKAkSEAoIZW50cnlfaWQYAiABKAkiGwoFQ2xvbmUSEgoKcmVxdWVzdF9pZBgBIAEoCSI7ChBMaXN0UGFzdFNlc3Npb25zEhIKCnJlcXVlc3RfaWQYASABKAkSEwoLYWxsX2ZvbGRlcnMYAiABKAgiYwoMUGFzdFNlc3Npb25zEhIKCnJlcXVlc3RfaWQYASABKAkSLAoIc2Vzc2lvbnMYAiADKAsyGi5waXJjLnYxYWxwaGExLlBhc3RTZXNzaW9uEhEKCXRydW5jYXRlZBgDIAEoCCLYAQoLUGFzdFNlc3Npb24SDAoEcGF0aBgBIAEoCRISCgpzZXNzaW9uX2lkGAIgASgJEgsKA2N3ZBgDIAEoCRIMCgRuYW1lGAQgASgJEhQKDGZpcnN0X3Byb21wdBgFIAEoCRIuCgpjcmVhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIvCgttb2RpZmllZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASFQoNbWVzc2FnZV9jb3VudBgIIAEoDSIqCgZSZXN1bWUSEgoKcmVxdWVzdF9pZBgBIAEoCRIMCgRwYXRoGAIgASgJIhwKBlJlbG9hZBISCgpyZXF1ZXN0X2lkGAEgASgJIkcKDE5hdmlnYXRlVHJlZRISCgpyZXF1ZXN0X2lkGAEgASgJEhAKCGVudHJ5X2lkGAIgASgJEhEKCXN1bW1hcml6ZRgDIAEoCCIeCghMaXN0VHJlZRISCgpyZXF1ZXN0X2lkGAEgASgJIlYKBFRyZWUSEgoKcmVxdWVzdF9pZBgBIAEoCRInCghicmFuY2hlcxgCIAMoCzIVLnBpcmMudjFhbHBoYTEuQnJhbmNoEhEKCXRydW5jYXRlZBgDIAEoCCKQAQoGQnJhbmNoEg8KB2xlYWZfaWQYASABKAkSDwoHY3VycmVudBgCIAEoCBIOCgZwcm9tcHQYAyABKAkSDAoEbGFzdBgEIAEoCRIvCgttb2RpZmllZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASFQoNbWVzc2FnZV9jb3VudBgGIAEoDSIqCgZSZW5hbWUSEgoKcmVxdWVzdF9pZBgBIAEoCRIMCgRuYW1lGAIgASgJIiIKDFN0YXRzUmVxdWVzdBISCgpyZXF1ZXN0X2lkGAEgASgJIogBCgVTdGF0cxISCgpyZXF1ZXN0X2lkGAEgASgJEiMKBXRvdGFsGAIgASgLMhQucGlyYy52MWFscGhhMS5Vc2FnZRIbCg5jb250ZXh0X3Rva2VucxgDIAEoBEgAiAEBEhYKDmNvbnRleHRfd2luZG93GAQgASgEQhEKD19jb250ZXh0X3Rva2VucyIiCgxMaXN0Q29tbWFuZHMSEgoKcmVxdWVzdF9pZBgBIAEoCSJMCghDb21tYW5kcxISCgpyZXF1ZXN0X2lkGAEgASgJEiwKCGNvbW1hbmRzGAIgAygLMhoucGlyYy52MWFscGhhMS5Db21tYW5kSW5mbyJeCgtDb21tYW5kSW5mbxIMCgRuYW1lGAEgASgJEhMKC2Rlc2NyaXB0aW9uGAIgASgJEiwKBnNvdXJjZRgDIAEoDjIcLnBpcmMudjFhbHBoYTEuQ29tbWFuZFNvdXJjZSJ7CgZQcm9tcHQSEgoKcmVxdWVzdF9pZBgBIAEoCRIMCgR0ZXh0GAIgASgJEiQKBmltYWdlcxgDIAMoCzIULnBpcmMudjFhbHBoYTEuSW1hZ2USKQoIZGVsaXZlcnkYBCABKA4yFy5waXJjLnYxYWxwaGExLkRlbGl2ZXJ5IigKBUltYWdlEhEKCW1pbWVfdHlwZRgBIAEoCRIMCgRkYXRhGAIgASgMIhsKBUFib3J0EhIKCnJlcXVlc3RfaWQYASABKAkiMwoOSGlzdG9yeVJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRINCgVsaW1pdBgCIAEoDSJtCgdIaXN0b3J5EhIKCnJlcXVlc3RfaWQYASABKAkSLgoFaXRlbXMYAiADKAsyHy5waXJjLnYxYWxwaGExLkNvbnZlcnNhdGlvbkl0ZW0SCwoDc2VxGAMgASgEEhEKCXRydW5jYXRlZBgEIAEoCCIeCghBY2NlcHRlZBISCgpyZXF1ZXN0X2lkGAEgASgJIpoDCgxTZXNzaW9uRXZlbnQSCwoDc2VxGAEgASgEEiYKAmF0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIvCgRpdGVtGAMgASgLMh8ucGlyYy52MWFscGhhMS5Db252ZXJzYXRpb25JdGVtSAASOAoPYXNzaXN0YW50X2RlbHRhGAQgASgLMh0ucGlyYy52MWFscGhhMS5Bc3Npc3RhbnREZWx0YUgAEjQKDXRvb2xfcHJvZ3Jlc3MYBSABKAsyGy5waXJjLnYxYWxwaGExLlRvb2xQcm9ncmVzc0gAEjgKD3dvcmtpbmdfY2hhbmdlZBgGIAEoCzIdLnBpcmMudjFhbHBoYTEuV29ya2luZ0NoYW5nZWRIABI6Cgxhbm5vdW5jZW1lbnQYByABKAsyIi5waXJjLnYxYWxwaGExLlNlc3Npb25Bbm5vdW5jZW1lbnRIABI2Cg5icmFuY2hfY2hhbmdlZBgIIAEoCzIcLnBpcmMudjFhbHBoYTEuQnJhbmNoQ2hhbmdlZEgAQgYKBGJvZHkioAMKEENvbnZlcnNhdGlvbkl0ZW0SEAoIZW50cnlfaWQYASABKAkSDwoHdHVybl9pZBgCIAEoCRImCgJhdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASMgoMdXNlcl9tZXNzYWdlGAQgASgLMhoucGlyYy52MWFscGhhMS5Vc2VyTWVzc2FnZUgAEjwKEWFzc2lzdGFudF9tZXNzYWdlGAUgASgLMh8ucGlyYy52MWFscGhhMS5Bc3Npc3RhbnRNZXNzYWdlSAASLAoJdG9vbF9jYWxsGAYgASgLMhcucGlyYy52MWFscGhhMS5Ub29sQ2FsbEgAEjAKC3Rvb2xfcmVzdWx0GAcgASgLMhkucGlyYy52MWFscGhhMS5Ub29sUmVzdWx0SAASLwoKY29tcGFjdGlvbhgIIAEoCzIZLnBpcmMudjFhbHBoYTEuQ29tcGFjdGlvbkgAEjYKDmJyYW5jaF9zdW1tYXJ5GAkgASgLMhwucGlyYy52MWFscGhhMS5CcmFuY2hTdW1tYXJ5SABCBgoEYm9keSJVCgtVc2VyTWVzc2FnZRIMCgR0ZXh0GAEgASgJEiQKBmltYWdlcxgCIAMoCzIULnBpcmMudjFhbHBoYTEuSW1hZ2USEgoKcmVxdWVzdF9pZBgDIAEoCSLlAQoQQXNzaXN0YW50TWVzc2FnZRISCgptZXNzYWdlX2lkGAEgASgJEiwKB2NvbnRlbnQYAiADKAsyGy5waXJjLnYxYWxwaGExLkNvbnRlbnRCbG9jaxIjCgV1c2FnZRgDIAEoCzIULnBpcmMudjFhbHBoYTEuVXNhZ2USLgoLc3RvcF9yZWFzb24YBCABKA4yGS5waXJjLnYxYWxwaGExLlN0b3BSZWFzb24SIwoFbW9kZWwYBSABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsEhUKDWVycm9yX21lc3NhZ2UYBiABKAkiOgoMQ29udGVudEJsb2NrEg4KBHRleHQYASABKAlIABISCgh0aGlua2luZxgCIAEoCUgAQgYKBGJvZHkieQoFVXNhZ2USFAoMaW5wdXRfdG9rZW5zGAEgASgEEhUKDW91dHB1dF90b2tlbnMYAiABKAQSGQoRY2FjaGVfcmVhZF90b2tlbnMYAyABKAQSGgoSY2FjaGVfd3JpdGVfdG9rZW5zGAQgASgEEgwKBGNvc3QYBSABKAEidgoOQXNzaXN0YW50RGVsdGESEgoKbWVzc2FnZV9pZBgBIAEoCRIPCgd0dXJuX2lkGAIgASgJEhMKC2Jsb2NrX2luZGV4GAMgASgNEg4KBHRleHQYBCABKAlIABISCgh0aGlua2luZxgFIAEoCUgAQgYKBGJvZHkiSwoIVG9vbENhbGwSFAoMdG9vbF9jYWxsX2lkGAEgASgJEhEKCXRvb2xfbmFtZRgCIAEoCRIWCg5hcmd1bWVudHNfanNvbhgDIAEoCSJCCgpUb29sUmVzdWx0EhQKDHRvb2xfY2FsbF9pZBgBIAEoCRIQCghpc19lcnJvchgCIAEoCBIMCgR0ZXh0GAMgASgJIkMKDFRvb2xQcm9ncmVzcxIUCgx0b29sX2NhbGxfaWQYASABKAkSDwoHdHVybl9pZBgCIAEoCRIMCgR0ZXh0GAMgASgJIiEKDldvcmtpbmdDaGFuZ2VkEg8KB3dvcmtpbmcYASABKAgiNAoKQ29tcGFjdGlvbhIPCgdzdW1tYXJ5GAEgASgJEhUKDXRva2Vuc19iZWZvcmUYAiABKAQiIAoNQnJhbmNoU3VtbWFyeRIPCgdzdW1tYXJ5GAEgASgJIiAKDUJyYW5jaENoYW5nZWQSDwoHbGVhZl9pZBgBIAEoCSqyAQoNU2Vzc2lvbk9yaWdpbhIeChpTRVNTSU9OX09SSUdJTl9VTlNQRUNJRklFRBAAEhoKFlNFU1NJT05fT1JJR0lOX1NUQVJUVVAQARIWChJTRVNTSU9OX09SSUdJTl9ORVcQAhIZChVTRVNTSU9OX09SSUdJTl9SRVNVTUUQAxIXChNTRVNTSU9OX09SSUdJTl9GT1JLEAQSGQoVU0VTU0lPTl9PUklHSU5fUkVMT0FEEAUq4QEKDVRoaW5raW5nTGV2ZWwSHgoaVEhJTktJTkdfTEVWRUxfVU5TUEVDSUZJRUQQABIWChJUSElOS0lOR19MRVZFTF9PRkYQARIaChZUSElOS0lOR19MRVZFTF9NSU5JTUFMEAISFgoSVEhJTktJTkdfTEVWRUxfTE9XEAMSGQoVVEhJTktJTkdfTEVWRUxfTUVESVVNEAQSFwoTVEhJTktJTkdfTEVWRUxfSElHSBAFEhgKFFRISU5LSU5HX0xFVkVMX1hISUdIEAYSFgoSVEhJTktJTkdfTEVWRUxfTUFYEAcqggEKDUNvbW1hbmRTb3VyY2USHgoaQ09NTUFORF9TT1VSQ0VfVU5TUEVDSUZJRUQQABIcChhDT01NQU5EX1NPVVJDRV9FWFRFTlNJT04QARIZChVDT01NQU5EX1NPVVJDRV9QUk9NUFQQAhIYChRDT01NQU5EX1NPVVJDRV9TS0lMTBADKlAKCERlbGl2ZXJ5EhgKFERFTElWRVJZX1VOU1BFQ0lGSUVEEAASEgoOREVMSVZFUllfU1RFRVIQARIWChJERUxJVkVSWV9GT0xMT1dfVVAQAiq7AQoKU3RvcFJlYXNvbhIbChdTVE9QX1JFQVNPTl9VTlNQRUNJRklFRBAAEhQKEFNUT1BfUkVBU09OX1NUT1AQARIWChJTVE9QX1JFQVNPTl9MRU5HVEgQAhIYChRTVE9QX1JFQVNPTl9UT09MX1VTRRADEhcKE1NUT1BfUkVBU09OX0FCT1JURUQQBBIVChFTVE9QX1JFQVNPTl9FUlJPUhAFEhgKFFNUT1BfUkVBU09OX0RFRkVSUkVEEAZCrQEKEWNvbS5waXJjLnYxYWxwaGExQgxTZXNzaW9uUHJvdG9QAVo1cGlyYy5kZXYvcmVsYXkvaW50ZXJuYWwvcGIvcGlyYy92MWFscGhhMTtwaXJjdjFhbHBoYTGiAgNQWFiqAg1QaXJjLlYxYWxwaGExygINUGlyY1xWMWFscGhhMeICGVBpcmNcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAg5QaXJjOjpWMWFscGhhMWIGcHJvdG8z", [file_google_protobuf_timestamp, file_pirc_v1alpha1_common]);
var SessionAnnouncementSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 0);
var PlaceSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 1);
var ModelSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 2);
var SessionMessageSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 3);
var ModelInfoSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 6);
-var ImageSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 25);
-var HistorySchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 28);
-var ConversationItemSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 31);
-var ContentBlockSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 34);
-var UsageSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 35);
+var BranchSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 21);
+var ImageSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 29);
+var HistorySchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 32);
+var ConversationItemSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 35);
+var ContentBlockSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 38);
+var UsageSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 39);
// protocol/helpers.ts
function errorReply(requestId, code, message) {
@@ -7614,19 +7618,68 @@ function atMs(ms) {
function atIso(iso) {
return timestampFromDate(new Date(iso));
}
-function historyItems(branch) {
+function historyItems(branch2) {
const items = [];
let turnId = "";
- for (const e of branch) {
+ for (const e of branch2) {
if (e.type === "message") {
if (e.message.role === "user") turnId = e.id;
items.push(...messageItems(e.message, { entryId: e.id, turnId, at: atIso(e.timestamp) }));
} else if (e.type === "compaction") {
items.push(compactionItem(e, turnId));
+ } else if (e.type === "branch_summary") {
+ items.push(create(ConversationItemSchema, {
+ entryId: e.id,
+ turnId,
+ at: atIso(e.timestamp),
+ body: { case: "branchSummary", value: { summary: clip(e.summary) } }
+ }));
}
}
return items;
}
+function branches(sm) {
+ const current = sm.getLeafId() ?? "";
+ const here = current ? sm.getBranch(current) : [];
+ const onCurrent = new Set(here.map((e) => e.id));
+ const leaves = [];
+ const stack = [...sm.getTree()];
+ while (stack.length > 0) {
+ const n = stack.pop();
+ if (n.children.length === 0) leaves.push(n.entry);
+ else stack.push(...n.children);
+ }
+ const others = [];
+ for (const leaf of leaves) {
+ if (onCurrent.has(leaf.id)) continue;
+ const path = sm.getBranch(leaf.id);
+ let split = path.length;
+ while (split > 0 && !onCurrent.has(path[split - 1].id)) split--;
+ const b = branch(leaf.id, false, path.slice(split), path);
+ if (b.messageCount > 0) others.push(b);
+ }
+ others.sort((a, b) => Number(timestampMs(b.modifiedAt) - timestampMs(a.modifiedAt)));
+ return [branch(current, true, here, here), ...others];
+}
+function branch(leafId, current, own, path) {
+ const messages = own.flatMap((e) => e.type === "message" && (e.message.role === "user" || e.message.role === "assistant") ? [e.message] : []);
+ const said = (m) => {
+ const text = textOf(m.content);
+ return firstLine(m.role === "user" ? promptText(text) : text);
+ };
+ const prompts = messages.filter((m) => m.role === "user");
+ const prompt = current ? prompts[prompts.length - 1] : prompts[0];
+ const last = [...messages].reverse().find((m) => said(m));
+ const end = path[path.length - 1];
+ return create(BranchSchema, {
+ leafId,
+ current,
+ prompt: prompt ? said(prompt) : "",
+ last: last ? said(last) : "",
+ modifiedAt: end ? atIso(end.timestamp) : timestampFromMs(0),
+ messageCount: messages.length
+ });
+}
function compactionItem(e, turnId) {
return create(ConversationItemSchema, {
entryId: e.id,
@@ -7635,15 +7688,15 @@ function compactionItem(e, turnId) {
body: { case: "compaction", value: { summary: clip(e.summary), tokensBefore: count(e.tokensBefore) } }
});
}
-function lastTurnId(branch) {
- for (let i = branch.length - 1; i >= 0; i--) {
- const e = branch[i];
+function lastTurnId(branch2) {
+ for (let i = branch2.length - 1; i >= 0; i--) {
+ const e = branch2[i];
if (e.type === "message" && e.message.role === "user") return e.id;
}
return "";
}
-function firstPrompt(branch) {
- for (const e of branch) {
+function firstPrompt(branch2) {
+ for (const e of branch2) {
if (e.type !== "message" || e.message.role !== "user") continue;
const line = firstLine(promptText(textOf(e.message.content)));
if (line) return line;
@@ -7684,6 +7737,7 @@ function fitItem(item, budget) {
b.value.text = cut2(b.value.text);
break;
case "compaction":
+ case "branchSummary":
b.value.summary = cut2(b.value.summary);
break;
}
@@ -7741,6 +7795,17 @@ var SESSION_COMMANDS = {
timeout: "pi did not resume the session",
run: async (path, ctx) => await resumeProblem(ctx, path) ?? cancelled("resume")(await ctx.switchSession(path))
},
+ // To an entry, its ID the argument, then "summarize" to summarise the
+ // branch left first.
+ tree: {
+ name: "pirc:tree",
+ description: "PiRC: move in the session tree (used by PiRC's clients)",
+ timeout: "pi did not move in the session tree",
+ run: async (args, ctx) => {
+ const [id, summarize] = args.split(" ");
+ return treeProblem(ctx, id) ?? cancelled("move in the session tree")(await ctx.navigateTree(id, { summarize: summarize === "summarize" }));
+ }
+ },
reload: {
name: "pirc:reload",
description: "PiRC: reload pi's resources (used by PiRC's clients)",
@@ -7752,6 +7817,7 @@ var SESSION_COMMANDS = {
}
}
};
+var reasonOf = (which) => SESSION_COMMANDS[which].reason;
var REQUESTS = {
prompt: "change",
abort: "change",
@@ -7763,12 +7829,14 @@ var REQUESTS = {
clone: "change",
resume: "change",
reload: "change",
+ navigateTree: "change",
rename: "change",
historyRequest: "question",
listModels: "question",
statsRequest: "question",
listCommands: "question",
- listPastSessions: "question"
+ listPastSessions: "question",
+ listTree: "question"
};
function forkProblem(ctx, id, position) {
const sm = ctx.sessionManager;
@@ -7780,6 +7848,9 @@ function forkProblem(ctx, id, position) {
if (target && file && !existsSync(file)) return "pi has not saved this session yet: it has no reply to keep";
return void 0;
}
+function treeProblem(ctx, id) {
+ return id && ctx.sessionManager.getEntry(id) ? void 0 : "no such entry in this session";
+}
async function pastSessions(ctx, allFolders) {
const sm = ctx.sessionManager;
const pi = sm.constructor;
@@ -7862,9 +7933,9 @@ var Live = class {
this.seq = seq;
this.sessionId = ctx.sessionManager.getSessionId();
this.origin = ORIGIN[reason] ?? 0 /* UNSPECIFIED */;
- const branch = ctx.sessionManager.getBranch();
- this.turnId = lastTurnId(branch);
- this.firstPrompt = firstPrompt(branch);
+ const branch2 = ctx.sessionManager.getBranch();
+ this.turnId = lastTurnId(branch2);
+ this.firstPrompt = firstPrompt(branch2);
this.working = !ctx.isIdle();
}
pi;
@@ -7882,9 +7953,10 @@ var Live = class {
unconfirmed = [];
// A Compact being run, answered when pi finishes it.
compaction;
- // A NewSession, Fork, Clone, Resume or Reload under way, answered when pi
- // shuts this session down for that reason ("new", "fork", "resume" or
- // "reload").
+ // A NewSession, Fork, Clone, Resume, Reload or NavigateTree under way
+ // (SESSION_COMMANDS), answered when pi shuts this session down for its
+ // command's reason, or for NavigateTree when its command has run. While
+ // pi summarises the branch it leaves, the session is compacting.
replacement;
turnId;
firstPrompt;
@@ -7953,19 +8025,37 @@ var Live = class {
// answered now, before the session's end goes out.
onShutdown(reason) {
const r = this.replacement;
- if (!r || reason !== r.reason) return;
- this.replacement = void 0;
- clearTimeout(r.timer);
+ if (!r || reason !== reasonOf(r.which)) return;
+ this.endReplacement();
r.respond(accepted(""));
}
- // The /pirc:new, :fork, :clone, :resume or :reload handler found the
- // switch cancelled, or failed.
- onReplaceFailed(why) {
+ // One of SESSION_COMMANDS is running: one that keeps the session is
+ // answered when it has run, however long that takes (a summary).
+ onCommandStart(which) {
+ const r = this.replacement;
+ if (r?.which === which && !reasonOf(which)) clearTimeout(r.timer);
+ }
+ // One of SESSION_COMMANDS has run, failing (it was cancelled, or failed)
+ // if failed says why.
+ onCommandRan(which, failed) {
+ const r = this.replacement;
+ if (r?.which !== which || !failed && reasonOf(which)) return;
+ this.endReplacement();
+ r.respond(failed ? errorReply("", 13 /* PI_FAILED */, failed) : accepted(""));
+ }
+ endReplacement() {
const r = this.replacement;
if (!r) return;
this.replacement = void 0;
clearTimeout(r.timer);
- r.respond(errorReply("", 13 /* PI_FAILED */, why));
+ if (r.summarizing) this.onCompactEnd();
+ }
+ // The session moved in its tree, at a client's request or at pi's
+ // terminal: clients ask for the conversation again.
+ onTree(leafId) {
+ this.catchUp();
+ this.turnId = lastTurnId(this.ctx.sessionManager.getBranch());
+ this.emit({ case: "branchChanged", value: { leafId: leafId ?? "" } });
}
// Runs a timer's work, keeping its errors from pi.
guard(where, fn) {
@@ -8180,7 +8270,7 @@ var Live = class {
// Why compacting or replacing the session cannot start now, if so.
busy() {
if (this.compacting || this.compaction) return "pi is compacting the session";
- if (this.replacement) return "the session is being replaced";
+ if (this.replacement) return this.replacement.which === "tree" ? "the session is moving in its tree" : "the session is being replaced";
if (this.unconfirmed.length > 0) return "a prompt is starting";
if (this.working || !this.ctx.isIdle()) return "the agent is working; stop it first";
return void 0;
@@ -8196,23 +8286,25 @@ var Live = class {
(e) => respond(errorReply(requestId, 13 /* PI_FAILED */, errorText(e)))
);
}
- // Replaces the session through one of PiRC's commands, answered when pi
- // shuts this session down for its reason (onShutdown).
- replace(requestId, which, args, respond) {
- const { name, reason, timeout } = SESSION_COMMANDS[which];
+ // Changes the session through one of PiRC's commands, answered when pi
+ // shuts this session down for its reason (onShutdown), or when it has
+ // run (onCommandRan).
+ replace(requestId, which, args, respond, summarizing = false) {
+ const { name, timeout } = SESSION_COMMANDS[which];
const command = args ? `/${name} ${args}` : `/${name}`;
const why = this.busy();
if (why) return respond(errorReply(requestId, 8 /* BUSY */, why));
const timer = setTimeout(this.guard("replacement", () => {
if (this.replacement?.timer !== timer) return;
- this.replacement = void 0;
+ this.endReplacement();
respond(errorReply(requestId, 9 /* TIMEOUT */, timeout));
}), CONFIRM_MS);
- this.replacement = { respond: (r) => respond(withRequestId(r, requestId)), timer, reason };
+ this.replacement = { respond: (r) => respond(withRequestId(r, requestId)), timer, which, summarizing };
+ if (summarizing) this.onCompactStart();
try {
this.pi.sendUserMessage(command, { deliverAs: "followUp", expandPromptTemplates: true });
} catch (e) {
- this.onReplaceFailed(errorText(e));
+ this.onCommandRan(which, errorText(e));
}
}
// Handles one request, answering it through respond, now or later.
@@ -8340,6 +8432,18 @@ var Live = class {
}
case "reload":
return this.replace(body.value.requestId, "reload", "", respond);
+ case "navigateTree": {
+ const { requestId, entryId, summarize } = body.value;
+ const problem = treeProblem(this.ctx, entryId);
+ if (problem) return respond(errorReply(requestId, 4 /* INVALID */, problem));
+ if (summarize && !this.ctx.model) return respond(errorReply(requestId, 13 /* PI_FAILED */, "no model is selected in pi to summarise with"));
+ return this.replace(requestId, "tree", summarize ? `${entryId} summarize` : entryId, respond, summarize);
+ }
+ case "listTree": {
+ const { requestId } = body.value;
+ const all = branches(this.ctx.sessionManager);
+ return respond(fitting(all.slice().reverse(), this.sink.maxPayloadBytes() - 1024, (kept) => create(SessionMessageSchema, { body: { case: "tree", value: { requestId, branches: kept.slice().reverse(), truncated: kept.length < all.length } } })));
+ }
case "statsRequest": {
const usage = this.ctx.getContextUsage();
return respond(create(SessionMessageSchema, {
@@ -8906,7 +9010,7 @@ var Host = class _Host {
};
// extension/src/index.ts
-var EXTENSION_VERSION = true ? "0.1.9-dev+ffb2c286e582" : "dev";
+var EXTENSION_VERSION = true ? "0.1.9-dev+517e92a48990" : "dev";
function piVersion() {
try {
let dir = dirname3(realpathSync(process.argv[1]));
@@ -8921,7 +9025,7 @@ function piVersion() {
}
return "unknown";
}
-var LOAD = true ? "0.1.9-dev+ffb2c286e582" : `dev ${randomBytes3(4).toString("hex")}`;
+var LOAD = true ? "0.1.9-dev+517e92a48990" : `dev ${randomBytes3(4).toString("hex")}`;
var KEY = /* @__PURE__ */ Symbol.for("pirc.extension");
var proc = globalThis[KEY] ??= {};
if (!proc.host || proc.load !== LOAD) {
@@ -8984,17 +9088,19 @@ function index_default(pi) {
pi.on("session_before_compact", on("session_before_compact", (live) => live.onCompactStart()));
pi.on("session_compact", on("session_compact", (live, e) => live.onCompact(e.compactionEntry)));
pi.on("session_compact_failed", on("session_compact_failed", (live) => live.onCompactEnd()));
- for (const c of Object.values(SESSION_COMMANDS)) {
+ pi.on("session_tree", on("session_tree", (live, e) => live.onTree(e.newLeafId)));
+ for (const [which, c] of Object.entries(SESSION_COMMANDS)) {
pi.registerCommand(c.name, {
description: c.description,
handler: async (args, ctx) => {
+ proc.host.liveFor(pi)?.onCommandStart(which);
let failed;
try {
failed = await c.run(args.trim(), ctx);
} catch (err) {
failed = errorText(err);
}
- if (failed) proc.host.liveFor(pi)?.onReplaceFailed(failed);
+ proc.host.liveFor(pi)?.onCommandRan(which, failed);
}
});
}