From 3bf6386f2fd5864bf0d87cf492ab66bc1f931885 Mon Sep 17 00:00:00 2001 From: Igor Soarez Date: Tue, 27 Oct 2026 08:24:20 +0000 Subject: pirc-extension 0.1.9-dev+af2a8deec30f --- package.json | 2 +- pirc.js | 118 ++++++++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 89 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index 2823e0f..e694b71 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pirc-extension", - "version": "0.1.9-dev+ec7f4fbbe262", + "version": "0.1.9-dev+af2a8deec30f", "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 5b82d77..171ec72 100644 --- a/pirc.js +++ b/pirc.js @@ -1,4 +1,4 @@ -// PiRC extension 0.1.9-dev+ec7f4fbbe262. Third-party code in this file: @bufbuild/protobuf@2.16.0, ws@8.22.0; see NOTICE. +// PiRC extension 0.1.9-dev+af2a8deec30f. 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; @@ -7140,17 +7140,17 @@ 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("ChtwaXJjL3YxYWxwaGExL3Nlc3Npb24ucHJvdG8SDXBpcmMudjFhbHBoYTEipwMKE1Nlc3Npb25Bbm5vdW5jZW1lbnQSDAoEbmFtZRgBIAEoCRILCgNjd2QYAiABKAkSEAoIaG9zdG5hbWUYAyABKAkSIwoFbW9kZWwYBCABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsEjQKDnRoaW5raW5nX2xldmVsGAUgASgOMhwucGlyYy52MWFscGhhMS5UaGlua2luZ0xldmVsEg8KB3dvcmtpbmcYBiABKAgSLgoKc3RhcnRlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASGwoTcmVwbGFjZXNfc2Vzc2lvbl9pZBgIIAEoCRIsCgZvcmlnaW4YCSABKA4yHC5waXJjLnYxYWxwaGExLlNlc3Npb25PcmlnaW4SEgoKcGlfdmVyc2lvbhgKIAEoCRIZChFleHRlbnNpb25fdmVyc2lvbhgLIAEoCRISCgpjb21wYWN0aW5nGAwgASgIEiMKBXBsYWNlGA0gASgLMhQucGlyYy52MWFscGhhMS5QbGFjZRIUCgxmaXJzdF9wcm9tcHQYDiABKAkirQEKBVBsYWNlEgwKBGtpbmQYASABKAkSDQoFZ3JvdXAYAiABKAkSGQoMZ3JvdXBfbnVtYmVyGAMgASgNSACIAQESDgoGd2luZG93GAQgASgJEhoKDXdpbmRvd19udW1iZXIYBSABKA1IAYgBARIMCgRwYW5lGAYgASgJEg8KB2Rpc3BsYXkYByABKAlCDwoNX2dyb3VwX251bWJlckIQCg5fd2luZG93X251bWJlciIzCgVNb2RlbBIQCghwcm92aWRlchgBIAEoCRIKCgJpZBgCIAEoCRIMCgRuYW1lGAMgASgJIt0GCg5TZXNzaW9uTWVzc2FnZRInCgZwcm9tcHQYASABKAsyFS5waXJjLnYxYWxwaGExLlByb21wdEgAEiUKBWFib3J0GAIgASgLMhQucGlyYy52MWFscGhhMS5BYm9ydEgAEjgKD2hpc3RvcnlfcmVxdWVzdBgDIAEoCzIdLnBpcmMudjFhbHBoYTEuSGlzdG9yeVJlcXVlc3RIABIwCgtsaXN0X21vZGVscxgEIAEoCzIZLnBpcmMudjFhbHBoYTEuTGlzdE1vZGVsc0gAEiwKCXNldF9tb2RlbBgFIAEoCzIXLnBpcmMudjFhbHBoYTEuU2V0TW9kZWxIABI9ChJzZXRfdGhpbmtpbmdfbGV2ZWwYBiABKAsyHy5waXJjLnYxYWxwaGExLlNldFRoaW5raW5nTGV2ZWxIABIpCgdjb21wYWN0GAcgASgLMhYucGlyYy52MWFscGhhMS5Db21wYWN0SAASMAoLbmV3X3Nlc3Npb24YCCABKAsyGS5waXJjLnYxYWxwaGExLk5ld1Nlc3Npb25IABInCgZyZW5hbWUYCSABKAsyFS5waXJjLnYxYWxwaGExLlJlbmFtZUgAEjQKDXN0YXRzX3JlcXVlc3QYESABKAsyGy5waXJjLnYxYWxwaGExLlN0YXRzUmVxdWVzdEgAEjQKDWxpc3RfY29tbWFuZHMYEiABKAsyGy5waXJjLnYxYWxwaGExLkxpc3RDb21tYW5kc0gAEiwKBWV2ZW50GAogASgLMhsucGlyYy52MWFscGhhMS5TZXNzaW9uRXZlbnRIABIpCgdoaXN0b3J5GAsgASgLMhYucGlyYy52MWFscGhhMS5IaXN0b3J5SAASKwoIYWNjZXB0ZWQYDCABKAsyFy5waXJjLnYxYWxwaGExLkFjY2VwdGVkSAASJQoFZXJyb3IYDSABKAsyFC5waXJjLnYxYWxwaGExLkVycm9ySAASJwoGbW9kZWxzGA4gASgLMhUucGlyYy52MWFscGhhMS5Nb2RlbHNIABIlCgVzdGF0cxgPIAEoCzIULnBpcmMudjFhbHBoYTEuU3RhdHNIABIrCghjb21tYW5kcxgQIAEoCzIXLnBpcmMudjFhbHBoYTEuQ29tbWFuZHNIAEIGCgRib2R5IiAKCkxpc3RNb2RlbHMSEgoKcmVxdWVzdF9pZBgBIAEoCSJxCgZNb2RlbHMSEgoKcmVxdWVzdF9pZBgBIAEoCRIoCgZtb2RlbHMYAiADKAsyGC5waXJjLnYxYWxwaGExLk1vZGVsSW5mbxIpCgdjdXJyZW50GAMgASgLMhgucGlyYy52MWFscGhhMS5Nb2RlbEluZm8iawoJTW9kZWxJbmZvEiMKBW1vZGVsGAEgASgLMhQucGlyYy52MWFscGhhMS5Nb2RlbBIRCglyZWFzb25pbmcYAiABKAgSFgoOY29udGV4dF93aW5kb3cYAyABKAQSDgoGaW1hZ2VzGAQgASgIIkMKCFNldE1vZGVsEhIKCnJlcXVlc3RfaWQYASABKAkSIwoFbW9kZWwYAiABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsIlMKEFNldFRoaW5raW5nTGV2ZWwSEgoKcmVxdWVzdF9pZBgBIAEoCRIrCgVsZXZlbBgCIAEoDjIcLnBpcmMudjFhbHBoYTEuVGhpbmtpbmdMZXZlbCIzCgdDb21wYWN0EhIKCnJlcXVlc3RfaWQYASABKAkSFAoMaW5zdHJ1Y3Rpb25zGAIgASgJIiAKCk5ld1Nlc3Npb24SEgoKcmVxdWVzdF9pZBgBIAEoCSIqCgZSZW5hbWUSEgoKcmVxdWVzdF9pZBgBIAEoCRIMCgRuYW1lGAIgASgJIiIKDFN0YXRzUmVxdWVzdBISCgpyZXF1ZXN0X2lkGAEgASgJIogBCgVTdGF0cxISCgpyZXF1ZXN0X2lkGAEgASgJEiMKBXRvdGFsGAIgASgLMhQucGlyYy52MWFscGhhMS5Vc2FnZRIbCg5jb250ZXh0X3Rva2VucxgDIAEoBEgAiAEBEhYKDmNvbnRleHRfd2luZG93GAQgASgEQhEKD19jb250ZXh0X3Rva2VucyIiCgxMaXN0Q29tbWFuZHMSEgoKcmVxdWVzdF9pZBgBIAEoCSJMCghDb21tYW5kcxISCgpyZXF1ZXN0X2lkGAEgASgJEiwKCGNvbW1hbmRzGAIgAygLMhoucGlyYy52MWFscGhhMS5Db21tYW5kSW5mbyJeCgtDb21tYW5kSW5mbxIMCgRuYW1lGAEgASgJEhMKC2Rlc2NyaXB0aW9uGAIgASgJEiwKBnNvdXJjZRgDIAEoDjIcLnBpcmMudjFhbHBoYTEuQ29tbWFuZFNvdXJjZSJ7CgZQcm9tcHQSEgoKcmVxdWVzdF9pZBgBIAEoCRIMCgR0ZXh0GAIgASgJEiQKBmltYWdlcxgDIAMoCzIULnBpcmMudjFhbHBoYTEuSW1hZ2USKQoIZGVsaXZlcnkYBCABKA4yFy5waXJjLnYxYWxwaGExLkRlbGl2ZXJ5IigKBUltYWdlEhEKCW1pbWVfdHlwZRgBIAEoCRIMCgRkYXRhGAIgASgMIhsKBUFib3J0EhIKCnJlcXVlc3RfaWQYASABKAkiMwoOSGlzdG9yeVJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRINCgVsaW1pdBgCIAEoDSJtCgdIaXN0b3J5EhIKCnJlcXVlc3RfaWQYASABKAkSLgoFaXRlbXMYAiADKAsyHy5waXJjLnYxYWxwaGExLkNvbnZlcnNhdGlvbkl0ZW0SCwoDc2VxGAMgASgEEhEKCXRydW5jYXRlZBgEIAEoCCIeCghBY2NlcHRlZBISCgpyZXF1ZXN0X2lkGAEgASgJIuICCgxTZXNzaW9uRXZlbnQSCwoDc2VxGAEgASgEEiYKAmF0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIvCgRpdGVtGAMgASgLMh8ucGlyYy52MWFscGhhMS5Db252ZXJzYXRpb25JdGVtSAASOAoPYXNzaXN0YW50X2RlbHRhGAQgASgLMh0ucGlyYy52MWFscGhhMS5Bc3Npc3RhbnREZWx0YUgAEjQKDXRvb2xfcHJvZ3Jlc3MYBSABKAsyGy5waXJjLnYxYWxwaGExLlRvb2xQcm9ncmVzc0gAEjgKD3dvcmtpbmdfY2hhbmdlZBgGIAEoCzIdLnBpcmMudjFhbHBoYTEuV29ya2luZ0NoYW5nZWRIABI6Cgxhbm5vdW5jZW1lbnQYByABKAsyIi5waXJjLnYxYWxwaGExLlNlc3Npb25Bbm5vdW5jZW1lbnRIAEIGCgRib2R5IugCChBDb252ZXJzYXRpb25JdGVtEhAKCGVudHJ5X2lkGAEgASgJEg8KB3R1cm5faWQYAiABKAkSJgoCYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjIKDHVzZXJfbWVzc2FnZRgEIAEoCzIaLnBpcmMudjFhbHBoYTEuVXNlck1lc3NhZ2VIABI8ChFhc3Npc3RhbnRfbWVzc2FnZRgFIAEoCzIfLnBpcmMudjFhbHBoYTEuQXNzaXN0YW50TWVzc2FnZUgAEiwKCXRvb2xfY2FsbBgGIAEoCzIXLnBpcmMudjFhbHBoYTEuVG9vbENhbGxIABIwCgt0b29sX3Jlc3VsdBgHIAEoCzIZLnBpcmMudjFhbHBoYTEuVG9vbFJlc3VsdEgAEi8KCmNvbXBhY3Rpb24YCCABKAsyGS5waXJjLnYxYWxwaGExLkNvbXBhY3Rpb25IAEIGCgRib2R5IlUKC1VzZXJNZXNzYWdlEgwKBHRleHQYASABKAkSJAoGaW1hZ2VzGAIgAygLMhQucGlyYy52MWFscGhhMS5JbWFnZRISCgpyZXF1ZXN0X2lkGAMgASgJIuUBChBBc3Npc3RhbnRNZXNzYWdlEhIKCm1lc3NhZ2VfaWQYASABKAkSLAoHY29udGVudBgCIAMoCzIbLnBpcmMudjFhbHBoYTEuQ29udGVudEJsb2NrEiMKBXVzYWdlGAMgASgLMhQucGlyYy52MWFscGhhMS5Vc2FnZRIuCgtzdG9wX3JlYXNvbhgEIAEoDjIZLnBpcmMudjFhbHBoYTEuU3RvcFJlYXNvbhIjCgVtb2RlbBgFIAEoCzIULnBpcmMudjFhbHBoYTEuTW9kZWwSFQoNZXJyb3JfbWVzc2FnZRgGIAEoCSI6CgxDb250ZW50QmxvY2sSDgoEdGV4dBgBIAEoCUgAEhIKCHRoaW5raW5nGAIgASgJSABCBgoEYm9keSJ5CgVVc2FnZRIUCgxpbnB1dF90b2tlbnMYASABKAQSFQoNb3V0cHV0X3Rva2VucxgCIAEoBBIZChFjYWNoZV9yZWFkX3Rva2VucxgDIAEoBBIaChJjYWNoZV93cml0ZV90b2tlbnMYBCABKAQSDAoEY29zdBgFIAEoASJ2Cg5Bc3Npc3RhbnREZWx0YRISCgptZXNzYWdlX2lkGAEgASgJEg8KB3R1cm5faWQYAiABKAkSEwoLYmxvY2tfaW5kZXgYAyABKA0SDgoEdGV4dBgEIAEoCUgAEhIKCHRoaW5raW5nGAUgASgJSABCBgoEYm9keSJLCghUb29sQ2FsbBIUCgx0b29sX2NhbGxfaWQYASABKAkSEQoJdG9vbF9uYW1lGAIgASgJEhYKDmFyZ3VtZW50c19qc29uGAMgASgJIkIKClRvb2xSZXN1bHQSFAoMdG9vbF9jYWxsX2lkGAEgASgJEhAKCGlzX2Vycm9yGAIgASgIEgwKBHRleHQYAyABKAkiQwoMVG9vbFByb2dyZXNzEhQKDHRvb2xfY2FsbF9pZBgBIAEoCRIPCgd0dXJuX2lkGAIgASgJEgwKBHRleHQYAyABKAkiIQoOV29ya2luZ0NoYW5nZWQSDwoHd29ya2luZxgBIAEoCCI0CgpDb21wYWN0aW9uEg8KB3N1bW1hcnkYASABKAkSFQoNdG9rZW5zX2JlZm9yZRgCIAEoBCqyAQoNU2Vzc2lvbk9yaWdpbhIeChpTRVNTSU9OX09SSUdJTl9VTlNQRUNJRklFRBAAEhoKFlNFU1NJT05fT1JJR0lOX1NUQVJUVVAQARIWChJTRVNTSU9OX09SSUdJTl9ORVcQAhIZChVTRVNTSU9OX09SSUdJTl9SRVNVTUUQAxIXChNTRVNTSU9OX09SSUdJTl9GT1JLEAQSGQoVU0VTU0lPTl9PUklHSU5fUkVMT0FEEAUq4QEKDVRoaW5raW5nTGV2ZWwSHgoaVEhJTktJTkdfTEVWRUxfVU5TUEVDSUZJRUQQABIWChJUSElOS0lOR19MRVZFTF9PRkYQARIaChZUSElOS0lOR19MRVZFTF9NSU5JTUFMEAISFgoSVEhJTktJTkdfTEVWRUxfTE9XEAMSGQoVVEhJTktJTkdfTEVWRUxfTUVESVVNEAQSFwoTVEhJTktJTkdfTEVWRUxfSElHSBAFEhgKFFRISU5LSU5HX0xFVkVMX1hISUdIEAYSFgoSVEhJTktJTkdfTEVWRUxfTUFYEAcqggEKDUNvbW1hbmRTb3VyY2USHgoaQ09NTUFORF9TT1VSQ0VfVU5TUEVDSUZJRUQQABIcChhDT01NQU5EX1NPVVJDRV9FWFRFTlNJT04QARIZChVDT01NQU5EX1NPVVJDRV9QUk9NUFQQAhIYChRDT01NQU5EX1NPVVJDRV9TS0lMTBADKlAKCERlbGl2ZXJ5EhgKFERFTElWRVJZX1VOU1BFQ0lGSUVEEAASEgoOREVMSVZFUllfU1RFRVIQARIWChJERUxJVkVSWV9GT0xMT1dfVVAQAiq7AQoKU3RvcFJlYXNvbhIbChdTVE9QX1JFQVNPTl9VTlNQRUNJRklFRBAAEhQKEFNUT1BfUkVBU09OX1NUT1AQARIWChJTVE9QX1JFQVNPTl9MRU5HVEgQAhIYChRTVE9QX1JFQVNPTl9UT09MX1VTRRADEhcKE1NUT1BfUkVBU09OX0FCT1JURUQQBBIVChFTVE9QX1JFQVNPTl9FUlJPUhAFEhgKFFNUT1BfUkVBU09OX0RFRkVSUkVEEAZCrQEKEWNvbS5waXJjLnYxYWxwaGExQgxTZXNzaW9uUHJvdG9QAVo1cGlyYy5kZXYvcmVsYXkvaW50ZXJuYWwvcGIvcGlyYy92MWFscGhhMTtwaXJjdjFhbHBoYTGiAgNQWFiqAg1QaXJjLlYxYWxwaGExygINUGlyY1xWMWFscGhhMeICGVBpcmNcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAg5QaXJjOjpWMWFscGhhMWIGcHJvdG8z", [file_google_protobuf_timestamp, file_pirc_v1alpha1_common]); +var file_pirc_v1alpha1_session = /* @__PURE__ */ fileDesc("ChtwaXJjL3YxYWxwaGExL3Nlc3Npb24ucHJvdG8SDXBpcmMudjFhbHBoYTEipwMKE1Nlc3Npb25Bbm5vdW5jZW1lbnQSDAoEbmFtZRgBIAEoCRILCgNjd2QYAiABKAkSEAoIaG9zdG5hbWUYAyABKAkSIwoFbW9kZWwYBCABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsEjQKDnRoaW5raW5nX2xldmVsGAUgASgOMhwucGlyYy52MWFscGhhMS5UaGlua2luZ0xldmVsEg8KB3dvcmtpbmcYBiABKAgSLgoKc3RhcnRlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASGwoTcmVwbGFjZXNfc2Vzc2lvbl9pZBgIIAEoCRIsCgZvcmlnaW4YCSABKA4yHC5waXJjLnYxYWxwaGExLlNlc3Npb25PcmlnaW4SEgoKcGlfdmVyc2lvbhgKIAEoCRIZChFleHRlbnNpb25fdmVyc2lvbhgLIAEoCRISCgpjb21wYWN0aW5nGAwgASgIEiMKBXBsYWNlGA0gASgLMhQucGlyYy52MWFscGhhMS5QbGFjZRIUCgxmaXJzdF9wcm9tcHQYDiABKAkirQEKBVBsYWNlEgwKBGtpbmQYASABKAkSDQoFZ3JvdXAYAiABKAkSGQoMZ3JvdXBfbnVtYmVyGAMgASgNSACIAQESDgoGd2luZG93GAQgASgJEhoKDXdpbmRvd19udW1iZXIYBSABKA1IAYgBARIMCgRwYW5lGAYgASgJEg8KB2Rpc3BsYXkYByABKAlCDwoNX2dyb3VwX251bWJlckIQCg5fd2luZG93X251bWJlciIzCgVNb2RlbBIQCghwcm92aWRlchgBIAEoCRIKCgJpZBgCIAEoCRIMCgRuYW1lGAMgASgJIqkHCg5TZXNzaW9uTWVzc2FnZRInCgZwcm9tcHQYASABKAsyFS5waXJjLnYxYWxwaGExLlByb21wdEgAEiUKBWFib3J0GAIgASgLMhQucGlyYy52MWFscGhhMS5BYm9ydEgAEjgKD2hpc3RvcnlfcmVxdWVzdBgDIAEoCzIdLnBpcmMudjFhbHBoYTEuSGlzdG9yeVJlcXVlc3RIABIwCgtsaXN0X21vZGVscxgEIAEoCzIZLnBpcmMudjFhbHBoYTEuTGlzdE1vZGVsc0gAEiwKCXNldF9tb2RlbBgFIAEoCzIXLnBpcmMudjFhbHBoYTEuU2V0TW9kZWxIABI9ChJzZXRfdGhpbmtpbmdfbGV2ZWwYBiABKAsyHy5waXJjLnYxYWxwaGExLlNldFRoaW5raW5nTGV2ZWxIABIpCgdjb21wYWN0GAcgASgLMhYucGlyYy52MWFscGhhMS5Db21wYWN0SAASMAoLbmV3X3Nlc3Npb24YCCABKAsyGS5waXJjLnYxYWxwaGExLk5ld1Nlc3Npb25IABInCgZyZW5hbWUYCSABKAsyFS5waXJjLnYxYWxwaGExLlJlbmFtZUgAEjQKDXN0YXRzX3JlcXVlc3QYESABKAsyGy5waXJjLnYxYWxwaGExLlN0YXRzUmVxdWVzdEgAEjQKDWxpc3RfY29tbWFuZHMYEiABKAsyGy5waXJjLnYxYWxwaGExLkxpc3RDb21tYW5kc0gAEiMKBGZvcmsYEyABKAsyEy5waXJjLnYxYWxwaGExLkZvcmtIABIlCgVjbG9uZRgUIAEoCzIULnBpcmMudjFhbHBoYTEuQ2xvbmVIABIsCgVldmVudBgKIAEoCzIbLnBpcmMudjFhbHBoYTEuU2Vzc2lvbkV2ZW50SAASKQoHaGlzdG9yeRgLIAEoCzIWLnBpcmMudjFhbHBoYTEuSGlzdG9yeUgAEisKCGFjY2VwdGVkGAwgASgLMhcucGlyYy52MWFscGhhMS5BY2NlcHRlZEgAEiUKBWVycm9yGA0gASgLMhQucGlyYy52MWFscGhhMS5FcnJvckgAEicKBm1vZGVscxgOIAEoCzIVLnBpcmMudjFhbHBoYTEuTW9kZWxzSAASJQoFc3RhdHMYDyABKAsyFC5waXJjLnYxYWxwaGExLlN0YXRzSAASKwoIY29tbWFuZHMYECABKAsyFy5waXJjLnYxYWxwaGExLkNvbW1hbmRzSABCBgoEYm9keSIgCgpMaXN0TW9kZWxzEhIKCnJlcXVlc3RfaWQYASABKAkicQoGTW9kZWxzEhIKCnJlcXVlc3RfaWQYASABKAkSKAoGbW9kZWxzGAIgAygLMhgucGlyYy52MWFscGhhMS5Nb2RlbEluZm8SKQoHY3VycmVudBgDIAEoCzIYLnBpcmMudjFhbHBoYTEuTW9kZWxJbmZvImsKCU1vZGVsSW5mbxIjCgVtb2RlbBgBIAEoCzIULnBpcmMudjFhbHBoYTEuTW9kZWwSEQoJcmVhc29uaW5nGAIgASgIEhYKDmNvbnRleHRfd2luZG93GAMgASgEEg4KBmltYWdlcxgEIAEoCCJDCghTZXRNb2RlbBISCgpyZXF1ZXN0X2lkGAEgASgJEiMKBW1vZGVsGAIgASgLMhQucGlyYy52MWFscGhhMS5Nb2RlbCJTChBTZXRUaGlua2luZ0xldmVsEhIKCnJlcXVlc3RfaWQYASABKAkSKwoFbGV2ZWwYAiABKA4yHC5waXJjLnYxYWxwaGExLlRoaW5raW5nTGV2ZWwiMwoHQ29tcGFjdBISCgpyZXF1ZXN0X2lkGAEgASgJEhQKDGluc3RydWN0aW9ucxgCIAEoCSIgCgpOZXdTZXNzaW9uEhIKCnJlcXVlc3RfaWQYASABKAkiLAoERm9yaxISCgpyZXF1ZXN0X2lkGAEgASgJEhAKCGVudHJ5X2lkGAIgASgJIhsKBUNsb25lEhIKCnJlcXVlc3RfaWQYASABKAkiKgoGUmVuYW1lEhIKCnJlcXVlc3RfaWQYASABKAkSDAoEbmFtZRgCIAEoCSIiCgxTdGF0c1JlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCSKIAQoFU3RhdHMSEgoKcmVxdWVzdF9pZBgBIAEoCRIjCgV0b3RhbBgCIAEoCzIULnBpcmMudjFhbHBoYTEuVXNhZ2USGwoOY29udGV4dF90b2tlbnMYAyABKARIAIgBARIWCg5jb250ZXh0X3dpbmRvdxgEIAEoBEIRCg9fY29udGV4dF90b2tlbnMiIgoMTGlzdENvbW1hbmRzEhIKCnJlcXVlc3RfaWQYASABKAkiTAoIQ29tbWFuZHMSEgoKcmVxdWVzdF9pZBgBIAEoCRIsCghjb21tYW5kcxgCIAMoCzIaLnBpcmMudjFhbHBoYTEuQ29tbWFuZEluZm8iXgoLQ29tbWFuZEluZm8SDAoEbmFtZRgBIAEoCRITCgtkZXNjcmlwdGlvbhgCIAEoCRIsCgZzb3VyY2UYAyABKA4yHC5waXJjLnYxYWxwaGExLkNvbW1hbmRTb3VyY2UiewoGUHJvbXB0EhIKCnJlcXVlc3RfaWQYASABKAkSDAoEdGV4dBgCIAEoCRIkCgZpbWFnZXMYAyADKAsyFC5waXJjLnYxYWxwaGExLkltYWdlEikKCGRlbGl2ZXJ5GAQgASgOMhcucGlyYy52MWFscGhhMS5EZWxpdmVyeSIoCgVJbWFnZRIRCgltaW1lX3R5cGUYASABKAkSDAoEZGF0YRgCIAEoDCIbCgVBYm9ydBISCgpyZXF1ZXN0X2lkGAEgASgJIjMKDkhpc3RvcnlSZXF1ZXN0EhIKCnJlcXVlc3RfaWQYASABKAkSDQoFbGltaXQYAiABKA0ibQoHSGlzdG9yeRISCgpyZXF1ZXN0X2lkGAEgASgJEi4KBWl0ZW1zGAIgAygLMh8ucGlyYy52MWFscGhhMS5Db252ZXJzYXRpb25JdGVtEgsKA3NlcRgDIAEoBBIRCgl0cnVuY2F0ZWQYBCABKAgiHgoIQWNjZXB0ZWQSEgoKcmVxdWVzdF9pZBgBIAEoCSLiAgoMU2Vzc2lvbkV2ZW50EgsKA3NlcRgBIAEoBBImCgJhdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoEaXRlbRgDIAEoCzIfLnBpcmMudjFhbHBoYTEuQ29udmVyc2F0aW9uSXRlbUgAEjgKD2Fzc2lzdGFudF9kZWx0YRgEIAEoCzIdLnBpcmMudjFhbHBoYTEuQXNzaXN0YW50RGVsdGFIABI0Cg10b29sX3Byb2dyZXNzGAUgASgLMhsucGlyYy52MWFscGhhMS5Ub29sUHJvZ3Jlc3NIABI4Cg93b3JraW5nX2NoYW5nZWQYBiABKAsyHS5waXJjLnYxYWxwaGExLldvcmtpbmdDaGFuZ2VkSAASOgoMYW5ub3VuY2VtZW50GAcgASgLMiIucGlyYy52MWFscGhhMS5TZXNzaW9uQW5ub3VuY2VtZW50SABCBgoEYm9keSLoAgoQQ29udmVyc2F0aW9uSXRlbRIQCghlbnRyeV9pZBgBIAEoCRIPCgd0dXJuX2lkGAIgASgJEiYKAmF0GAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIyCgx1c2VyX21lc3NhZ2UYBCABKAsyGi5waXJjLnYxYWxwaGExLlVzZXJNZXNzYWdlSAASPAoRYXNzaXN0YW50X21lc3NhZ2UYBSABKAsyHy5waXJjLnYxYWxwaGExLkFzc2lzdGFudE1lc3NhZ2VIABIsCgl0b29sX2NhbGwYBiABKAsyFy5waXJjLnYxYWxwaGExLlRvb2xDYWxsSAASMAoLdG9vbF9yZXN1bHQYByABKAsyGS5waXJjLnYxYWxwaGExLlRvb2xSZXN1bHRIABIvCgpjb21wYWN0aW9uGAggASgLMhkucGlyYy52MWFscGhhMS5Db21wYWN0aW9uSABCBgoEYm9keSJVCgtVc2VyTWVzc2FnZRIMCgR0ZXh0GAEgASgJEiQKBmltYWdlcxgCIAMoCzIULnBpcmMudjFhbHBoYTEuSW1hZ2USEgoKcmVxdWVzdF9pZBgDIAEoCSLlAQoQQXNzaXN0YW50TWVzc2FnZRISCgptZXNzYWdlX2lkGAEgASgJEiwKB2NvbnRlbnQYAiADKAsyGy5waXJjLnYxYWxwaGExLkNvbnRlbnRCbG9jaxIjCgV1c2FnZRgDIAEoCzIULnBpcmMudjFhbHBoYTEuVXNhZ2USLgoLc3RvcF9yZWFzb24YBCABKA4yGS5waXJjLnYxYWxwaGExLlN0b3BSZWFzb24SIwoFbW9kZWwYBSABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsEhUKDWVycm9yX21lc3NhZ2UYBiABKAkiOgoMQ29udGVudEJsb2NrEg4KBHRleHQYASABKAlIABISCgh0aGlua2luZxgCIAEoCUgAQgYKBGJvZHkieQoFVXNhZ2USFAoMaW5wdXRfdG9rZW5zGAEgASgEEhUKDW91dHB1dF90b2tlbnMYAiABKAQSGQoRY2FjaGVfcmVhZF90b2tlbnMYAyABKAQSGgoSY2FjaGVfd3JpdGVfdG9rZW5zGAQgASgEEgwKBGNvc3QYBSABKAEidgoOQXNzaXN0YW50RGVsdGESEgoKbWVzc2FnZV9pZBgBIAEoCRIPCgd0dXJuX2lkGAIgASgJEhMKC2Jsb2NrX2luZGV4GAMgASgNEg4KBHRleHQYBCABKAlIABISCgh0aGlua2luZxgFIAEoCUgAQgYKBGJvZHkiSwoIVG9vbENhbGwSFAoMdG9vbF9jYWxsX2lkGAEgASgJEhEKCXRvb2xfbmFtZRgCIAEoCRIWCg5hcmd1bWVudHNfanNvbhgDIAEoCSJCCgpUb29sUmVzdWx0EhQKDHRvb2xfY2FsbF9pZBgBIAEoCRIQCghpc19lcnJvchgCIAEoCBIMCgR0ZXh0GAMgASgJIkMKDFRvb2xQcm9ncmVzcxIUCgx0b29sX2NhbGxfaWQYASABKAkSDwoHdHVybl9pZBgCIAEoCRIMCgR0ZXh0GAMgASgJIiEKDldvcmtpbmdDaGFuZ2VkEg8KB3dvcmtpbmcYASABKAgiNAoKQ29tcGFjdGlvbhIPCgdzdW1tYXJ5GAEgASgJEhUKDXRva2Vuc19iZWZvcmUYAiABKAQqsgEKDVNlc3Npb25PcmlnaW4SHgoaU0VTU0lPTl9PUklHSU5fVU5TUEVDSUZJRUQQABIaChZTRVNTSU9OX09SSUdJTl9TVEFSVFVQEAESFgoSU0VTU0lPTl9PUklHSU5fTkVXEAISGQoVU0VTU0lPTl9PUklHSU5fUkVTVU1FEAMSFwoTU0VTU0lPTl9PUklHSU5fRk9SSxAEEhkKFVNFU1NJT05fT1JJR0lOX1JFTE9BRBAFKuEBCg1UaGlua2luZ0xldmVsEh4KGlRISU5LSU5HX0xFVkVMX1VOU1BFQ0lGSUVEEAASFgoSVEhJTktJTkdfTEVWRUxfT0ZGEAESGgoWVEhJTktJTkdfTEVWRUxfTUlOSU1BTBACEhYKElRISU5LSU5HX0xFVkVMX0xPVxADEhkKFVRISU5LSU5HX0xFVkVMX01FRElVTRAEEhcKE1RISU5LSU5HX0xFVkVMX0hJR0gQBRIYChRUSElOS0lOR19MRVZFTF9YSElHSBAGEhYKElRISU5LSU5HX0xFVkVMX01BWBAHKoIBCg1Db21tYW5kU291cmNlEh4KGkNPTU1BTkRfU09VUkNFX1VOU1BFQ0lGSUVEEAASHAoYQ09NTUFORF9TT1VSQ0VfRVhURU5TSU9OEAESGQoVQ09NTUFORF9TT1VSQ0VfUFJPTVBUEAISGAoUQ09NTUFORF9TT1VSQ0VfU0tJTEwQAypQCghEZWxpdmVyeRIYChRERUxJVkVSWV9VTlNQRUNJRklFRBAAEhIKDkRFTElWRVJZX1NURUVSEAESFgoSREVMSVZFUllfRk9MTE9XX1VQEAIquwEKClN0b3BSZWFzb24SGwoXU1RPUF9SRUFTT05fVU5TUEVDSUZJRUQQABIUChBTVE9QX1JFQVNPTl9TVE9QEAESFgoSU1RPUF9SRUFTT05fTEVOR1RIEAISGAoUU1RPUF9SRUFTT05fVE9PTF9VU0UQAxIXChNTVE9QX1JFQVNPTl9BQk9SVEVEEAQSFQoRU1RPUF9SRUFTT05fRVJST1IQBRIYChRTVE9QX1JFQVNPTl9ERUZFUlJFRBAGQq0BChFjb20ucGlyYy52MWFscGhhMUIMU2Vzc2lvblByb3RvUAFaNXBpcmMuZGV2L3JlbGF5L2ludGVybmFsL3BiL3BpcmMvdjFhbHBoYTE7cGlyY3YxYWxwaGExogIDUFhYqgINUGlyYy5WMWFscGhhMcoCDVBpcmNcVjFhbHBoYTHiAhlQaXJjXFYxYWxwaGExXEdQQk1ldGFkYXRh6gIOUGlyYzo6VjFhbHBoYTFiBnByb3RvMw", [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, 18); -var HistorySchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 21); -var ConversationItemSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 24); -var ContentBlockSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 27); -var UsageSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 28); +var ImageSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 20); +var HistorySchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 23); +var ConversationItemSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 26); +var ContentBlockSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 29); +var UsageSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 30); // relay-client/keys.ts import { createPrivateKey, createPublicKey, generateKeyPairSync, randomBytes, sign } from "node:crypto"; @@ -7451,6 +7451,7 @@ import { appendFileSync } from "node:fs"; // extension/src/live.ts import { randomBytes as randomBytes2 } from "node:crypto"; +import { existsSync } from "node:fs"; import { hostname as hostname2 } from "node:os"; // extension/src/convert.ts @@ -7681,6 +7682,18 @@ var CONFIRM_MS = 3e4; var PERSIST_MS = 2e3; var SHOWN = /* @__PURE__ */ new Set(["user", "assistant", "toolResult"]); var NEW_SESSION_COMMAND = "pirc:new"; +var FORK_COMMAND = "pirc:fork"; +var CLONE_COMMAND = "pirc:clone"; +function forkProblem(ctx, id, position) { + const sm = ctx.sessionManager; + const e = id ? sm.getEntry(id) : void 0; + if (!e) return position === "at" ? "nothing to clone yet" : "no such entry in this session"; + if (position === "before" && !(e.type === "message" && e.message.role === "user")) return "not a user message of this session"; + const target = position === "at" ? e.id : e.parentId; + const file = sm.getSessionFile(); + if (target && file && !existsSync(file)) return "pi has not saved this session yet: it has no reply to keep"; + return void 0; +} var BUILTIN_COMMANDS = /* @__PURE__ */ new Set([ "settings", "model", @@ -7712,6 +7725,8 @@ var ACTION_FOR = { thinking: "set thinking level", name: "rename", new: "new session", + fork: "fork", + clone: "clone", compact: "compact", session: "stats" }; @@ -7758,7 +7773,8 @@ var Live = class { unconfirmed = []; // A Compact being run, answered when pi finishes it. compaction; - // A NewSession under way, answered when pi shuts this session down. + // A NewSession, Fork or Clone under way, answered when pi shuts this + // session down for that reason ("new" or "fork"). replacement; turnId; firstPrompt; @@ -7818,20 +7834,21 @@ var Live = class { this.compaction = void 0; if (this.replacement) { clearTimeout(this.replacement.timer); - this.replacement.respond(errorReply("", 7 /* SESSION_GONE */, "the session ended other than by the new session")); + this.replacement.respond(errorReply("", 7 /* SESSION_GONE */, "the session ended other than by the replacement asked for")); this.replacement = void 0; } } - // pi is shutting this session down; a NewSession waiting for that is + // pi is shutting this session down; a replacement waiting for that is // answered now, before the session's end goes out. onShutdown(reason) { const r = this.replacement; - if (!r || reason !== "new") return; + if (!r || reason !== r.reason) return; this.replacement = void 0; clearTimeout(r.timer); r.respond(accepted("")); } - // The /pirc:new handler found the switch cancelled, or failed. + // The /pirc:new, :fork or :clone handler found the switch cancelled, or + // failed. onReplaceFailed(why) { const r = this.replacement; if (!r) return; @@ -8056,11 +8073,28 @@ 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 "a new session is being started"; + if (this.replacement) return "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; } + // Replaces the session through one of PiRC's commands, answered when pi + // shuts this session down for `reason` (onShutdown). + replace(requestId, reason, command, timeout, respond) { + 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; + respond(errorReply(requestId, 9 /* TIMEOUT */, timeout)); + }), CONFIRM_MS); + this.replacement = { respond: (r) => respond(withRequestId(r, requestId)), timer, reason }; + try { + this.pi.sendUserMessage(command, { deliverAs: "followUp", expandPromptTemplates: true }); + } catch (e) { + this.onReplaceFailed(e?.message ?? String(e)); + } + } // Handles one request, answering it through respond, now or later. onRequest(clientKey, m, respond) { const body = m.body; @@ -8164,22 +8198,19 @@ var Live = class { }); return; } - case "newSession": { + case "newSession": + return this.replace(body.value.requestId, "new", `/${NEW_SESSION_COMMAND}`, "pi did not start a new session", respond); + case "fork": { + const { requestId, entryId } = body.value; + const problem = forkProblem(this.ctx, entryId, "before"); + if (problem) return respond(errorReply(requestId, 4 /* INVALID */, problem)); + return this.replace(requestId, "fork", `/${FORK_COMMAND} ${entryId}`, "pi did not fork the session", respond); + } + case "clone": { const { requestId } = body.value; - const why = this.busy(); - if (why) return respond(errorReply(requestId, 8 /* BUSY */, why)); - const timer = setTimeout(this.guard("new session", () => { - if (this.replacement?.timer !== timer) return; - this.replacement = void 0; - respond(errorReply(requestId, 9 /* TIMEOUT */, "pi did not start a new session")); - }), CONFIRM_MS); - this.replacement = { respond: (r) => respond(withRequestId(r, requestId)), timer }; - try { - this.pi.sendUserMessage(`/${NEW_SESSION_COMMAND}`, { deliverAs: "followUp", expandPromptTemplates: true }); - } catch (e) { - this.onReplaceFailed(e?.message ?? String(e)); - } - return; + const problem = forkProblem(this.ctx, this.ctx.sessionManager.getLeafId() ?? "", "at"); + if (problem) return respond(errorReply(requestId, 4 /* INVALID */, problem)); + return this.replace(requestId, "fork", `/${CLONE_COMMAND}`, "pi did not clone the session", respond); } case "statsRequest": { const usage = this.ctx.getContextUsage(); @@ -8745,7 +8776,7 @@ function requestIdOf(m) { } // extension/src/index.ts -var EXTENSION_VERSION = true ? "0.1.9-dev+ec7f4fbbe262" : "dev"; +var EXTENSION_VERSION = true ? "0.1.9-dev+af2a8deec30f" : "dev"; function piVersion() { try { let dir = dirname3(realpathSync(process.argv[1])); @@ -8760,7 +8791,7 @@ function piVersion() { } return "unknown"; } -var LOAD = true ? "0.1.9-dev+ec7f4fbbe262" : `dev ${randomBytes3(4).toString("hex")}`; +var LOAD = true ? "0.1.9-dev+af2a8deec30f" : `dev ${randomBytes3(4).toString("hex")}`; var KEY = /* @__PURE__ */ Symbol.for("pirc.extension"); var proc = globalThis[KEY] ??= {}; if (!proc.host || proc.load !== LOAD) { @@ -8834,6 +8865,33 @@ function index_default(pi) { } } }); + const failed = (why) => proc.host.liveFor(pi)?.onReplaceFailed(why); + pi.registerCommand(FORK_COMMAND, { + description: "PiRC: fork before a user message (used by PiRC's clients)", + handler: async (args, ctx) => { + const id = args.trim(); + const problem = forkProblem(ctx, id, "before"); + if (problem) return failed(problem); + try { + if ((await ctx.fork(id)).cancelled) failed("another extension cancelled the fork"); + } catch (err) { + failed(err?.message ?? String(err)); + } + } + }); + pi.registerCommand(CLONE_COMMAND, { + description: "PiRC: clone the session as it is (used by PiRC's clients)", + handler: async (_args, ctx) => { + const leaf = ctx.sessionManager.getLeafId() ?? ""; + const problem = forkProblem(ctx, leaf, "at"); + if (problem) return failed(problem); + try { + if ((await ctx.fork(leaf, { position: "at" })).cancelled) failed("another extension cancelled the clone"); + } catch (err) { + failed(err?.message ?? String(err)); + } + } + }); pi.registerCommand("pirc", { description: "PiRC: status, enrol [token], reconnect", handler: async (args, ctx) => { -- cgit v1.2.3