aboutsummaryrefslogtreecommitdiff
path: root/pirc.js
diff options
context:
space:
mode:
Diffstat (limited to 'pirc.js')
-rw-r--r--pirc.js521
1 files changed, 332 insertions, 189 deletions
diff --git a/pirc.js b/pirc.js
index c60c07a..0d8e16c 100644
--- a/pirc.js
+++ b/pirc.js
@@ -1,4 +1,4 @@
-// PiRC extension 0.1.9-dev+3c5c6f3352f4. Third-party code in this file: @bufbuild/protobuf@2.16.0, ws@8.22.0; see NOTICE.
+// PiRC extension 0.1.9-dev+e9a4f1867958. 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;
@@ -3723,7 +3723,7 @@ var require_websocket_server = __commonJS({
// extension/src/index.ts
import { randomBytes as randomBytes3 } from "node:crypto";
import { readFileSync as readFileSync3, realpathSync } from "node:fs";
-import { dirname as dirname3, join as join2 } from "node:path";
+import { dirname as dirname3, join as join3 } from "node:path";
// node_modules/.pnpm/@bufbuild+protobuf@2.16.0/node_modules/@bufbuild/protobuf/dist/esm/is-message.js
function isMessage(arg, schema) {
@@ -7143,18 +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("ChtwaXJjL3YxYWxwaGExL3Nlc3Npb24ucHJvdG8SDXBpcmMudjFhbHBoYTEiuQMKE1Nlc3Npb25Bbm5vdW5jZW1lbnQSDAoEbmFtZRgBIAEoCRILCgNjd2QYAiABKAkSEAoIaG9zdG5hbWUYAyABKAkSIwoFbW9kZWwYBCABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsEjQKDnRoaW5raW5nX2xldmVsGAUgASgOMhwucGlyYy52MWFscGhhMS5UaGlua2luZ0xldmVsEg8KB3dvcmtpbmcYBiABKAgSLgoKc3RhcnRlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASGwoTcmVwbGFjZXNfc2Vzc2lvbl9pZBgIIAEoCRIsCgZvcmlnaW4YCSABKA4yHC5waXJjLnYxYWxwaGExLlNlc3Npb25PcmlnaW4SEgoKcGlfdmVyc2lvbhgKIAEoCRIZChFleHRlbnNpb25fdmVyc2lvbhgLIAEoCRISCgpjb21wYWN0aW5nGAwgASgIEiMKBXBsYWNlGA0gASgLMhQucGlyYy52MWFscGhhMS5QbGFjZRIUCgxmaXJzdF9wcm9tcHQYDiABKAkSEAoIcmVxdWVzdHMYDyADKAkirQEKBVBsYWNlEgwKBGtpbmQYASABKAkSDQoFZ3JvdXAYAiABKAkSGQoMZ3JvdXBfbnVtYmVyGAMgASgNSACIAQESDgoGd2luZG93GAQgASgJEhoKDXdpbmRvd19udW1iZXIYBSABKA1IAYgBARIMCgRwYW5lGAYgASgJEg8KB2Rpc3BsYXkYByABKAlCDwoNX2dyb3VwX251bWJlckIQCg5fd2luZG93X251bWJlciIzCgVNb2RlbBIQCghwcm92aWRlchgBIAEoCRIKCgJpZBgCIAEoCRIMCgRuYW1lGAMgASgJIo0KCg5TZXNzaW9uTWVzc2FnZRISCgpyZXF1ZXN0X2lkGDIgASgJEicKBnByb21wdBgBIAEoCzIVLnBpcmMudjFhbHBoYTEuUHJvbXB0SAASJQoFYWJvcnQYAiABKAsyFC5waXJjLnYxYWxwaGExLkFib3J0SAASOAoPaGlzdG9yeV9yZXF1ZXN0GAMgASgLMh0ucGlyYy52MWFscGhhMS5IaXN0b3J5UmVxdWVzdEgAEjAKC2xpc3RfbW9kZWxzGAQgASgLMhkucGlyYy52MWFscGhhMS5MaXN0TW9kZWxzSAASLAoJc2V0X21vZGVsGAUgASgLMhcucGlyYy52MWFscGhhMS5TZXRNb2RlbEgAEj0KEnNldF90aGlua2luZ19sZXZlbBgGIAEoCzIfLnBpcmMudjFhbHBoYTEuU2V0VGhpbmtpbmdMZXZlbEgAEikKB2NvbXBhY3QYByABKAsyFi5waXJjLnYxYWxwaGExLkNvbXBhY3RIABIwCgtuZXdfc2Vzc2lvbhgIIAEoCzIZLnBpcmMudjFhbHBoYTEuTmV3U2Vzc2lvbkgAEicKBnJlbmFtZRgJIAEoCzIVLnBpcmMudjFhbHBoYTEuUmVuYW1lSAASNAoNc3RhdHNfcmVxdWVzdBgRIAEoCzIbLnBpcmMudjFhbHBoYTEuU3RhdHNSZXF1ZXN0SAASNAoNbGlzdF9jb21tYW5kcxgSIAEoCzIbLnBpcmMudjFhbHBoYTEuTGlzdENvbW1hbmRzSAASIwoEZm9yaxgTIAEoCzITLnBpcmMudjFhbHBoYTEuRm9ya0gAEiUKBWNsb25lGBQgASgLMhQucGlyYy52MWFscGhhMS5DbG9uZUgAEj0KEmxpc3RfcGFzdF9zZXNzaW9ucxgVIAEoCzIfLnBpcmMudjFhbHBoYTEuTGlzdFBhc3RTZXNzaW9uc0gAEicKBnJlc3VtZRgWIAEoCzIVLnBpcmMudjFhbHBoYTEuUmVzdW1lSAASJwoGcmVsb2FkGBggASgLMhUucGlyYy52MWFscGhhMS5SZWxvYWRIABI0Cg1uYXZpZ2F0ZV90cmVlGBkgASgLMhsucGlyYy52MWFscGhhMS5OYXZpZ2F0ZVRyZWVIABIsCglsaXN0X3RyZWUYGiABKAsyFy5waXJjLnYxYWxwaGExLkxpc3RUcmVlSAASLAoFZXZlbnQYCiABKAsyGy5waXJjLnYxYWxwaGExLlNlc3Npb25FdmVudEgAEikKB2hpc3RvcnkYCyABKAsyFi5waXJjLnYxYWxwaGExLkhpc3RvcnlIABIrCghhY2NlcHRlZBgMIAEoCzIXLnBpcmMudjFhbHBoYTEuQWNjZXB0ZWRIABIlCgVlcnJvchgNIAEoCzIULnBpcmMudjFhbHBoYTEuRXJyb3JIABInCgZtb2RlbHMYDiABKAsyFS5waXJjLnYxYWxwaGExLk1vZGVsc0gAEiUKBXN0YXRzGA8gASgLMhQucGlyYy52MWFscGhhMS5TdGF0c0gAEisKCGNvbW1hbmRzGBAgASgLMhcucGlyYy52MWFscGhhMS5Db21tYW5kc0gAEjQKDXBhc3Rfc2Vzc2lvbnMYFyABKAsyGy5waXJjLnYxYWxwaGExLlBhc3RTZXNzaW9uc0gAEiMKBHRyZWUYGyABKAsyEy5waXJjLnYxYWxwaGExLlRyZWVIAEIGCgRib2R5IiAKCkxpc3RNb2RlbHMSEgoKcmVxdWVzdF9pZBgBIAEoCSJxCgZNb2RlbHMSEgoKcmVxdWVzdF9pZBgBIAEoCRIoCgZtb2RlbHMYAiADKAsyGC5waXJjLnYxYWxwaGExLk1vZGVsSW5mbxIpCgdjdXJyZW50GAMgASgLMhgucGlyYy52MWFscGhhMS5Nb2RlbEluZm8iawoJTW9kZWxJbmZvEiMKBW1vZGVsGAEgASgLMhQucGlyYy52MWFscGhhMS5Nb2RlbBIRCglyZWFzb25pbmcYAiABKAgSFgoOY29udGV4dF93aW5kb3cYAyABKAQSDgoGaW1hZ2VzGAQgASgIIkMKCFNldE1vZGVsEhIKCnJlcXVlc3RfaWQYASABKAkSIwoFbW9kZWwYAiABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsIlMKEFNldFRoaW5raW5nTGV2ZWwSEgoKcmVxdWVzdF9pZBgBIAEoCRIrCgVsZXZlbBgCIAEoDjIcLnBpcmMudjFhbHBoYTEuVGhpbmtpbmdMZXZlbCIzCgdDb21wYWN0EhIKCnJlcXVlc3RfaWQYASABKAkSFAoMaW5zdHJ1Y3Rpb25zGAIgASgJIiAKCk5ld1Nlc3Npb24SEgoKcmVxdWVzdF9pZBgBIAEoCSIsCgRGb3JrEhIKCnJlcXVlc3RfaWQYASABKAkSEAoIZW50cnlfaWQYAiABKAkiGwoFQ2xvbmUSEgoKcmVxdWVzdF9pZBgBIAEoCSI7ChBMaXN0UGFzdFNlc3Npb25zEhIKCnJlcXVlc3RfaWQYASABKAkSEwoLYWxsX2ZvbGRlcnMYAiABKAgiYwoMUGFzdFNlc3Npb25zEhIKCnJlcXVlc3RfaWQYASABKAkSLAoIc2Vzc2lvbnMYAiADKAsyGi5waXJjLnYxYWxwaGExLlBhc3RTZXNzaW9uEhEKCXRydW5jYXRlZBgDIAEoCCLYAQoLUGFzdFNlc3Npb24SDAoEcGF0aBgBIAEoCRISCgpzZXNzaW9uX2lkGAIgASgJEgsKA2N3ZBgDIAEoCRIMCgRuYW1lGAQgASgJEhQKDGZpcnN0X3Byb21wdBgFIAEoCRIuCgpjcmVhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIvCgttb2RpZmllZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASFQoNbWVzc2FnZV9jb3VudBgIIAEoDSIqCgZSZXN1bWUSEgoKcmVxdWVzdF9pZBgBIAEoCRIMCgRwYXRoGAIgASgJIhwKBlJlbG9hZBISCgpyZXF1ZXN0X2lkGAEgASgJIkcKDE5hdmlnYXRlVHJlZRISCgpyZXF1ZXN0X2lkGAEgASgJEhAKCGVudHJ5X2lkGAIgASgJEhEKCXN1bW1hcml6ZRgDIAEoCCIeCghMaXN0VHJlZRISCgpyZXF1ZXN0X2lkGAEgASgJIlYKBFRyZWUSEgoKcmVxdWVzdF9pZBgBIAEoCRInCghicmFuY2hlcxgCIAMoCzIVLnBpcmMudjFhbHBoYTEuQnJhbmNoEhEKCXRydW5jYXRlZBgDIAEoCCKQAQoGQnJhbmNoEg8KB2xlYWZfaWQYASABKAkSDwoHY3VycmVudBgCIAEoCBIOCgZwcm9tcHQYAyABKAkSDAoEbGFzdBgEIAEoCRIvCgttb2RpZmllZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASFQoNbWVzc2FnZV9jb3VudBgGIAEoDSIqCgZSZW5hbWUSEgoKcmVxdWVzdF9pZBgBIAEoCRIMCgRuYW1lGAIgASgJIiIKDFN0YXRzUmVxdWVzdBISCgpyZXF1ZXN0X2lkGAEgASgJIogBCgVTdGF0cxISCgpyZXF1ZXN0X2lkGAEgASgJEiMKBXRvdGFsGAIgASgLMhQucGlyYy52MWFscGhhMS5Vc2FnZRIbCg5jb250ZXh0X3Rva2VucxgDIAEoBEgAiAEBEhYKDmNvbnRleHRfd2luZG93GAQgASgEQhEKD19jb250ZXh0X3Rva2VucyIiCgxMaXN0Q29tbWFuZHMSEgoKcmVxdWVzdF9pZBgBIAEoCSJMCghDb21tYW5kcxISCgpyZXF1ZXN0X2lkGAEgASgJEiwKCGNvbW1hbmRzGAIgAygLMhoucGlyYy52MWFscGhhMS5Db21tYW5kSW5mbyJeCgtDb21tYW5kSW5mbxIMCgRuYW1lGAEgASgJEhMKC2Rlc2NyaXB0aW9uGAIgASgJEiwKBnNvdXJjZRgDIAEoDjIcLnBpcmMudjFhbHBoYTEuQ29tbWFuZFNvdXJjZSJ7CgZQcm9tcHQSEgoKcmVxdWVzdF9pZBgBIAEoCRIMCgR0ZXh0GAIgASgJEiQKBmltYWdlcxgDIAMoCzIULnBpcmMudjFhbHBoYTEuSW1hZ2USKQoIZGVsaXZlcnkYBCABKA4yFy5waXJjLnYxYWxwaGExLkRlbGl2ZXJ5IigKBUltYWdlEhEKCW1pbWVfdHlwZRgBIAEoCRIMCgRkYXRhGAIgASgMIhsKBUFib3J0EhIKCnJlcXVlc3RfaWQYASABKAkiMwoOSGlzdG9yeVJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRINCgVsaW1pdBgCIAEoDSJtCgdIaXN0b3J5EhIKCnJlcXVlc3RfaWQYASABKAkSLgoFaXRlbXMYAiADKAsyHy5waXJjLnYxYWxwaGExLkNvbnZlcnNhdGlvbkl0ZW0SCwoDc2VxGAMgASgEEhEKCXRydW5jYXRlZBgEIAEoCCIeCghBY2NlcHRlZBISCgpyZXF1ZXN0X2lkGAEgASgJIpoDCgxTZXNzaW9uRXZlbnQSCwoDc2VxGAEgASgEEiYKAmF0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIvCgRpdGVtGAMgASgLMh8ucGlyYy52MWFscGhhMS5Db252ZXJzYXRpb25JdGVtSAASOAoPYXNzaXN0YW50X2RlbHRhGAQgASgLMh0ucGlyYy52MWFscGhhMS5Bc3Npc3RhbnREZWx0YUgAEjQKDXRvb2xfcHJvZ3Jlc3MYBSABKAsyGy5waXJjLnYxYWxwaGExLlRvb2xQcm9ncmVzc0gAEjgKD3dvcmtpbmdfY2hhbmdlZBgGIAEoCzIdLnBpcmMudjFhbHBoYTEuV29ya2luZ0NoYW5nZWRIABI6Cgxhbm5vdW5jZW1lbnQYByABKAsyIi5waXJjLnYxYWxwaGExLlNlc3Npb25Bbm5vdW5jZW1lbnRIABI2Cg5icmFuY2hfY2hhbmdlZBgIIAEoCzIcLnBpcmMudjFhbHBoYTEuQnJhbmNoQ2hhbmdlZEgAQgYKBGJvZHkioAMKEENvbnZlcnNhdGlvbkl0ZW0SEAoIZW50cnlfaWQYASABKAkSDwoHdHVybl9pZBgCIAEoCRImCgJhdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASMgoMdXNlcl9tZXNzYWdlGAQgASgLMhoucGlyYy52MWFscGhhMS5Vc2VyTWVzc2FnZUgAEjwKEWFzc2lzdGFudF9tZXNzYWdlGAUgASgLMh8ucGlyYy52MWFscGhhMS5Bc3Npc3RhbnRNZXNzYWdlSAASLAoJdG9vbF9jYWxsGAYgASgLMhcucGlyYy52MWFscGhhMS5Ub29sQ2FsbEgAEjAKC3Rvb2xfcmVzdWx0GAcgASgLMhkucGlyYy52MWFscGhhMS5Ub29sUmVzdWx0SAASLwoKY29tcGFjdGlvbhgIIAEoCzIZLnBpcmMudjFhbHBoYTEuQ29tcGFjdGlvbkgAEjYKDmJyYW5jaF9zdW1tYXJ5GAkgASgLMhwucGlyYy52MWFscGhhMS5CcmFuY2hTdW1tYXJ5SABCBgoEYm9keSJVCgtVc2VyTWVzc2FnZRIMCgR0ZXh0GAEgASgJEiQKBmltYWdlcxgCIAMoCzIULnBpcmMudjFhbHBoYTEuSW1hZ2USEgoKcmVxdWVzdF9pZBgDIAEoCSLlAQoQQXNzaXN0YW50TWVzc2FnZRISCgptZXNzYWdlX2lkGAEgASgJEiwKB2NvbnRlbnQYAiADKAsyGy5waXJjLnYxYWxwaGExLkNvbnRlbnRCbG9jaxIjCgV1c2FnZRgDIAEoCzIULnBpcmMudjFhbHBoYTEuVXNhZ2USLgoLc3RvcF9yZWFzb24YBCABKA4yGS5waXJjLnYxYWxwaGExLlN0b3BSZWFzb24SIwoFbW9kZWwYBSABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsEhUKDWVycm9yX21lc3NhZ2UYBiABKAkiOgoMQ29udGVudEJsb2NrEg4KBHRleHQYASABKAlIABISCgh0aGlua2luZxgCIAEoCUgAQgYKBGJvZHkieQoFVXNhZ2USFAoMaW5wdXRfdG9rZW5zGAEgASgEEhUKDW91dHB1dF90b2tlbnMYAiABKAQSGQoRY2FjaGVfcmVhZF90b2tlbnMYAyABKAQSGgoSY2FjaGVfd3JpdGVfdG9rZW5zGAQgASgEEgwKBGNvc3QYBSABKAEidgoOQXNzaXN0YW50RGVsdGESEgoKbWVzc2FnZV9pZBgBIAEoCRIPCgd0dXJuX2lkGAIgASgJEhMKC2Jsb2NrX2luZGV4GAMgASgNEg4KBHRleHQYBCABKAlIABISCgh0aGlua2luZxgFIAEoCUgAQgYKBGJvZHkiSwoIVG9vbENhbGwSFAoMdG9vbF9jYWxsX2lkGAEgASgJEhEKCXRvb2xfbmFtZRgCIAEoCRIWCg5hcmd1bWVudHNfanNvbhgDIAEoCSJCCgpUb29sUmVzdWx0EhQKDHRvb2xfY2FsbF9pZBgBIAEoCRIQCghpc19lcnJvchgCIAEoCBIMCgR0ZXh0GAMgASgJIkMKDFRvb2xQcm9ncmVzcxIUCgx0b29sX2NhbGxfaWQYASABKAkSDwoHdHVybl9pZBgCIAEoCRIMCgR0ZXh0GAMgASgJIiEKDldvcmtpbmdDaGFuZ2VkEg8KB3dvcmtpbmcYASABKAgiNAoKQ29tcGFjdGlvbhIPCgdzdW1tYXJ5GAEgASgJEhUKDXRva2Vuc19iZWZvcmUYAiABKAQiIAoNQnJhbmNoU3VtbWFyeRIPCgdzdW1tYXJ5GAEgASgJIiAKDUJyYW5jaENoYW5nZWQSDwoHbGVhZl9pZBgBIAEoCSqyAQoNU2Vzc2lvbk9yaWdpbhIeChpTRVNTSU9OX09SSUdJTl9VTlNQRUNJRklFRBAAEhoKFlNFU1NJT05fT1JJR0lOX1NUQVJUVVAQARIWChJTRVNTSU9OX09SSUdJTl9ORVcQAhIZChVTRVNTSU9OX09SSUdJTl9SRVNVTUUQAxIXChNTRVNTSU9OX09SSUdJTl9GT1JLEAQSGQoVU0VTU0lPTl9PUklHSU5fUkVMT0FEEAUq4QEKDVRoaW5raW5nTGV2ZWwSHgoaVEhJTktJTkdfTEVWRUxfVU5TUEVDSUZJRUQQABIWChJUSElOS0lOR19MRVZFTF9PRkYQARIaChZUSElOS0lOR19MRVZFTF9NSU5JTUFMEAISFgoSVEhJTktJTkdfTEVWRUxfTE9XEAMSGQoVVEhJTktJTkdfTEVWRUxfTUVESVVNEAQSFwoTVEhJTktJTkdfTEVWRUxfSElHSBAFEhgKFFRISU5LSU5HX0xFVkVMX1hISUdIEAYSFgoSVEhJTktJTkdfTEVWRUxfTUFYEAcqggEKDUNvbW1hbmRTb3VyY2USHgoaQ09NTUFORF9TT1VSQ0VfVU5TUEVDSUZJRUQQABIcChhDT01NQU5EX1NPVVJDRV9FWFRFTlNJT04QARIZChVDT01NQU5EX1NPVVJDRV9QUk9NUFQQAhIYChRDT01NQU5EX1NPVVJDRV9TS0lMTBADKlAKCERlbGl2ZXJ5EhgKFERFTElWRVJZX1VOU1BFQ0lGSUVEEAASEgoOREVMSVZFUllfU1RFRVIQARIWChJERUxJVkVSWV9GT0xMT1dfVVAQAiq7AQoKU3RvcFJlYXNvbhIbChdTVE9QX1JFQVNPTl9VTlNQRUNJRklFRBAAEhQKEFNUT1BfUkVBU09OX1NUT1AQARIWChJTVE9QX1JFQVNPTl9MRU5HVEgQAhIYChRTVE9QX1JFQVNPTl9UT09MX1VTRRADEhcKE1NUT1BfUkVBU09OX0FCT1JURUQQBBIVChFTVE9QX1JFQVNPTl9FUlJPUhAFEhgKFFNUT1BfUkVBU09OX0RFRkVSUkVEEAZCrQEKEWNvbS5waXJjLnYxYWxwaGExQgxTZXNzaW9uUHJvdG9QAVo1cGlyYy5kZXYvcmVsYXkvaW50ZXJuYWwvcGIvcGlyYy92MWFscGhhMTtwaXJjdjFhbHBoYTGiAgNQWFiqAg1QaXJjLlYxYWxwaGExygINUGlyY1xWMWFscGhhMeICGVBpcmNcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAg5QaXJjOjpWMWFscGhhMWIGcHJvdG8z", [file_google_protobuf_timestamp, file_pirc_v1alpha1_common]);
+var file_pirc_v1alpha1_session = /* @__PURE__ */ fileDesc("ChtwaXJjL3YxYWxwaGExL3Nlc3Npb24ucHJvdG8SDXBpcmMudjFhbHBoYTEi3gMKE1Nlc3Npb25Bbm5vdW5jZW1lbnQSDAoEbmFtZRgBIAEoCRILCgNjd2QYAiABKAkSEAoIaG9zdG5hbWUYAyABKAkSIwoFbW9kZWwYBCABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsEjQKDnRoaW5raW5nX2xldmVsGAUgASgOMhwucGlyYy52MWFscGhhMS5UaGlua2luZ0xldmVsEg8KB3dvcmtpbmcYBiABKAgSLgoKc3RhcnRlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASGwoTcmVwbGFjZXNfc2Vzc2lvbl9pZBgIIAEoCRIsCgZvcmlnaW4YCSABKA4yHC5waXJjLnYxYWxwaGExLlNlc3Npb25PcmlnaW4SEgoKcGlfdmVyc2lvbhgKIAEoCRIZChFleHRlbnNpb25fdmVyc2lvbhgLIAEoCRISCgpjb21wYWN0aW5nGAwgASgIEiMKBXBsYWNlGA0gASgLMhQucGlyYy52MWFscGhhMS5QbGFjZRIUCgxmaXJzdF9wcm9tcHQYDiABKAkSEAoIcmVxdWVzdHMYDyADKAkSEAoIbGF1bmNoZXIYECABKAkSEQoJbGF1bmNoX2lkGBEgASgJIq0BCgVQbGFjZRIMCgRraW5kGAEgASgJEg0KBWdyb3VwGAIgASgJEhkKDGdyb3VwX251bWJlchgDIAEoDUgAiAEBEg4KBndpbmRvdxgEIAEoCRIaCg13aW5kb3dfbnVtYmVyGAUgASgNSAGIAQESDAoEcGFuZRgGIAEoCRIPCgdkaXNwbGF5GAcgASgJQg8KDV9ncm91cF9udW1iZXJCEAoOX3dpbmRvd19udW1iZXIiMwoFTW9kZWwSEAoIcHJvdmlkZXIYASABKAkSCgoCaWQYAiABKAkSDAoEbmFtZRgDIAEoCSLbCgoOU2Vzc2lvbk1lc3NhZ2USEgoKcmVxdWVzdF9pZBgyIAEoCRInCgZwcm9tcHQYASABKAsyFS5waXJjLnYxYWxwaGExLlByb21wdEgAEiUKBWFib3J0GAIgASgLMhQucGlyYy52MWFscGhhMS5BYm9ydEgAEjgKD2hpc3RvcnlfcmVxdWVzdBgDIAEoCzIdLnBpcmMudjFhbHBoYTEuSGlzdG9yeVJlcXVlc3RIABIwCgtsaXN0X21vZGVscxgEIAEoCzIZLnBpcmMudjFhbHBoYTEuTGlzdE1vZGVsc0gAEiwKCXNldF9tb2RlbBgFIAEoCzIXLnBpcmMudjFhbHBoYTEuU2V0TW9kZWxIABI9ChJzZXRfdGhpbmtpbmdfbGV2ZWwYBiABKAsyHy5waXJjLnYxYWxwaGExLlNldFRoaW5raW5nTGV2ZWxIABIpCgdjb21wYWN0GAcgASgLMhYucGlyYy52MWFscGhhMS5Db21wYWN0SAASMAoLbmV3X3Nlc3Npb24YCCABKAsyGS5waXJjLnYxYWxwaGExLk5ld1Nlc3Npb25IABInCgZyZW5hbWUYCSABKAsyFS5waXJjLnYxYWxwaGExLlJlbmFtZUgAEjQKDXN0YXRzX3JlcXVlc3QYESABKAsyGy5waXJjLnYxYWxwaGExLlN0YXRzUmVxdWVzdEgAEjQKDWxpc3RfY29tbWFuZHMYEiABKAsyGy5waXJjLnYxYWxwaGExLkxpc3RDb21tYW5kc0gAEiMKBGZvcmsYEyABKAsyEy5waXJjLnYxYWxwaGExLkZvcmtIABIlCgVjbG9uZRgUIAEoCzIULnBpcmMudjFhbHBoYTEuQ2xvbmVIABI9ChJsaXN0X3Bhc3Rfc2Vzc2lvbnMYFSABKAsyHy5waXJjLnYxYWxwaGExLkxpc3RQYXN0U2Vzc2lvbnNIABInCgZyZXN1bWUYFiABKAsyFS5waXJjLnYxYWxwaGExLlJlc3VtZUgAEicKBnJlbG9hZBgYIAEoCzIVLnBpcmMudjFhbHBoYTEuUmVsb2FkSAASNAoNbmF2aWdhdGVfdHJlZRgZIAEoCzIbLnBpcmMudjFhbHBoYTEuTmF2aWdhdGVUcmVlSAASLAoJbGlzdF90cmVlGBogASgLMhcucGlyYy52MWFscGhhMS5MaXN0VHJlZUgAEiMKBHN0b3AYHCABKAsyEy5waXJjLnYxYWxwaGExLlN0b3BIABInCgZsYXVuY2gYHSABKAsyFS5waXJjLnYxYWxwaGExLkxhdW5jaEgAEiwKBWV2ZW50GAogASgLMhsucGlyYy52MWFscGhhMS5TZXNzaW9uRXZlbnRIABIpCgdoaXN0b3J5GAsgASgLMhYucGlyYy52MWFscGhhMS5IaXN0b3J5SAASKwoIYWNjZXB0ZWQYDCABKAsyFy5waXJjLnYxYWxwaGExLkFjY2VwdGVkSAASJQoFZXJyb3IYDSABKAsyFC5waXJjLnYxYWxwaGExLkVycm9ySAASJwoGbW9kZWxzGA4gASgLMhUucGlyYy52MWFscGhhMS5Nb2RlbHNIABIlCgVzdGF0cxgPIAEoCzIULnBpcmMudjFhbHBoYTEuU3RhdHNIABIrCghjb21tYW5kcxgQIAEoCzIXLnBpcmMudjFhbHBoYTEuQ29tbWFuZHNIABI0Cg1wYXN0X3Nlc3Npb25zGBcgASgLMhsucGlyYy52MWFscGhhMS5QYXN0U2Vzc2lvbnNIABIjCgR0cmVlGBsgASgLMhMucGlyYy52MWFscGhhMS5UcmVlSABCBgoEYm9keSIgCgpMaXN0TW9kZWxzEhIKCnJlcXVlc3RfaWQYASABKAkicQoGTW9kZWxzEhIKCnJlcXVlc3RfaWQYASABKAkSKAoGbW9kZWxzGAIgAygLMhgucGlyYy52MWFscGhhMS5Nb2RlbEluZm8SKQoHY3VycmVudBgDIAEoCzIYLnBpcmMudjFhbHBoYTEuTW9kZWxJbmZvImsKCU1vZGVsSW5mbxIjCgVtb2RlbBgBIAEoCzIULnBpcmMudjFhbHBoYTEuTW9kZWwSEQoJcmVhc29uaW5nGAIgASgIEhYKDmNvbnRleHRfd2luZG93GAMgASgEEg4KBmltYWdlcxgEIAEoCCJDCghTZXRNb2RlbBISCgpyZXF1ZXN0X2lkGAEgASgJEiMKBW1vZGVsGAIgASgLMhQucGlyYy52MWFscGhhMS5Nb2RlbCJTChBTZXRUaGlua2luZ0xldmVsEhIKCnJlcXVlc3RfaWQYASABKAkSKwoFbGV2ZWwYAiABKA4yHC5waXJjLnYxYWxwaGExLlRoaW5raW5nTGV2ZWwiMwoHQ29tcGFjdBISCgpyZXF1ZXN0X2lkGAEgASgJEhQKDGluc3RydWN0aW9ucxgCIAEoCSIgCgpOZXdTZXNzaW9uEhIKCnJlcXVlc3RfaWQYASABKAkiLAoERm9yaxISCgpyZXF1ZXN0X2lkGAEgASgJEhAKCGVudHJ5X2lkGAIgASgJIhsKBUNsb25lEhIKCnJlcXVlc3RfaWQYASABKAkiOwoQTGlzdFBhc3RTZXNzaW9ucxISCgpyZXF1ZXN0X2lkGAEgASgJEhMKC2FsbF9mb2xkZXJzGAIgASgIImMKDFBhc3RTZXNzaW9ucxISCgpyZXF1ZXN0X2lkGAEgASgJEiwKCHNlc3Npb25zGAIgAygLMhoucGlyYy52MWFscGhhMS5QYXN0U2Vzc2lvbhIRCgl0cnVuY2F0ZWQYAyABKAgi2AEKC1Bhc3RTZXNzaW9uEgwKBHBhdGgYASABKAkSEgoKc2Vzc2lvbl9pZBgCIAEoCRILCgNjd2QYAyABKAkSDAoEbmFtZRgEIAEoCRIUCgxmaXJzdF9wcm9tcHQYBSABKAkSLgoKY3JlYXRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoLbW9kaWZpZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhUKDW1lc3NhZ2VfY291bnQYCCABKA0iKgoGUmVzdW1lEhIKCnJlcXVlc3RfaWQYASABKAkSDAoEcGF0aBgCIAEoCSIcCgZSZWxvYWQSEgoKcmVxdWVzdF9pZBgBIAEoCSIaCgRTdG9wEhIKCnJlcXVlc3RfaWQYASABKAkiKQoGTGF1bmNoEhIKCnJlcXVlc3RfaWQYASABKAkSCwoDY3dkGAIgASgJIkcKDE5hdmlnYXRlVHJlZRISCgpyZXF1ZXN0X2lkGAEgASgJEhAKCGVudHJ5X2lkGAIgASgJEhEKCXN1bW1hcml6ZRgDIAEoCCIeCghMaXN0VHJlZRISCgpyZXF1ZXN0X2lkGAEgASgJIlYKBFRyZWUSEgoKcmVxdWVzdF9pZBgBIAEoCRInCghicmFuY2hlcxgCIAMoCzIVLnBpcmMudjFhbHBoYTEuQnJhbmNoEhEKCXRydW5jYXRlZBgDIAEoCCKQAQoGQnJhbmNoEg8KB2xlYWZfaWQYASABKAkSDwoHY3VycmVudBgCIAEoCBIOCgZwcm9tcHQYAyABKAkSDAoEbGFzdBgEIAEoCRIvCgttb2RpZmllZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASFQoNbWVzc2FnZV9jb3VudBgGIAEoDSIqCgZSZW5hbWUSEgoKcmVxdWVzdF9pZBgBIAEoCRIMCgRuYW1lGAIgASgJIiIKDFN0YXRzUmVxdWVzdBISCgpyZXF1ZXN0X2lkGAEgASgJIogBCgVTdGF0cxISCgpyZXF1ZXN0X2lkGAEgASgJEiMKBXRvdGFsGAIgASgLMhQucGlyYy52MWFscGhhMS5Vc2FnZRIbCg5jb250ZXh0X3Rva2VucxgDIAEoBEgAiAEBEhYKDmNvbnRleHRfd2luZG93GAQgASgEQhEKD19jb250ZXh0X3Rva2VucyIiCgxMaXN0Q29tbWFuZHMSEgoKcmVxdWVzdF9pZBgBIAEoCSJMCghDb21tYW5kcxISCgpyZXF1ZXN0X2lkGAEgASgJEiwKCGNvbW1hbmRzGAIgAygLMhoucGlyYy52MWFscGhhMS5Db21tYW5kSW5mbyJeCgtDb21tYW5kSW5mbxIMCgRuYW1lGAEgASgJEhMKC2Rlc2NyaXB0aW9uGAIgASgJEiwKBnNvdXJjZRgDIAEoDjIcLnBpcmMudjFhbHBoYTEuQ29tbWFuZFNvdXJjZSJ7CgZQcm9tcHQSEgoKcmVxdWVzdF9pZBgBIAEoCRIMCgR0ZXh0GAIgASgJEiQKBmltYWdlcxgDIAMoCzIULnBpcmMudjFhbHBoYTEuSW1hZ2USKQoIZGVsaXZlcnkYBCABKA4yFy5waXJjLnYxYWxwaGExLkRlbGl2ZXJ5IigKBUltYWdlEhEKCW1pbWVfdHlwZRgBIAEoCRIMCgRkYXRhGAIgASgMIhsKBUFib3J0EhIKCnJlcXVlc3RfaWQYASABKAkiMwoOSGlzdG9yeVJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCRINCgVsaW1pdBgCIAEoDSJtCgdIaXN0b3J5EhIKCnJlcXVlc3RfaWQYASABKAkSLgoFaXRlbXMYAiADKAsyHy5waXJjLnYxYWxwaGExLkNvbnZlcnNhdGlvbkl0ZW0SCwoDc2VxGAMgASgEEhEKCXRydW5jYXRlZBgEIAEoCCIeCghBY2NlcHRlZBISCgpyZXF1ZXN0X2lkGAEgASgJIpoDCgxTZXNzaW9uRXZlbnQSCwoDc2VxGAEgASgEEiYKAmF0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIvCgRpdGVtGAMgASgLMh8ucGlyYy52MWFscGhhMS5Db252ZXJzYXRpb25JdGVtSAASOAoPYXNzaXN0YW50X2RlbHRhGAQgASgLMh0ucGlyYy52MWFscGhhMS5Bc3Npc3RhbnREZWx0YUgAEjQKDXRvb2xfcHJvZ3Jlc3MYBSABKAsyGy5waXJjLnYxYWxwaGExLlRvb2xQcm9ncmVzc0gAEjgKD3dvcmtpbmdfY2hhbmdlZBgGIAEoCzIdLnBpcmMudjFhbHBoYTEuV29ya2luZ0NoYW5nZWRIABI6Cgxhbm5vdW5jZW1lbnQYByABKAsyIi5waXJjLnYxYWxwaGExLlNlc3Npb25Bbm5vdW5jZW1lbnRIABI2Cg5icmFuY2hfY2hhbmdlZBgIIAEoCzIcLnBpcmMudjFhbHBoYTEuQnJhbmNoQ2hhbmdlZEgAQgYKBGJvZHkioAMKEENvbnZlcnNhdGlvbkl0ZW0SEAoIZW50cnlfaWQYASABKAkSDwoHdHVybl9pZBgCIAEoCRImCgJhdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASMgoMdXNlcl9tZXNzYWdlGAQgASgLMhoucGlyYy52MWFscGhhMS5Vc2VyTWVzc2FnZUgAEjwKEWFzc2lzdGFudF9tZXNzYWdlGAUgASgLMh8ucGlyYy52MWFscGhhMS5Bc3Npc3RhbnRNZXNzYWdlSAASLAoJdG9vbF9jYWxsGAYgASgLMhcucGlyYy52MWFscGhhMS5Ub29sQ2FsbEgAEjAKC3Rvb2xfcmVzdWx0GAcgASgLMhkucGlyYy52MWFscGhhMS5Ub29sUmVzdWx0SAASLwoKY29tcGFjdGlvbhgIIAEoCzIZLnBpcmMudjFhbHBoYTEuQ29tcGFjdGlvbkgAEjYKDmJyYW5jaF9zdW1tYXJ5GAkgASgLMhwucGlyYy52MWFscGhhMS5CcmFuY2hTdW1tYXJ5SABCBgoEYm9keSJVCgtVc2VyTWVzc2FnZRIMCgR0ZXh0GAEgASgJEiQKBmltYWdlcxgCIAMoCzIULnBpcmMudjFhbHBoYTEuSW1hZ2USEgoKcmVxdWVzdF9pZBgDIAEoCSLlAQoQQXNzaXN0YW50TWVzc2FnZRISCgptZXNzYWdlX2lkGAEgASgJEiwKB2NvbnRlbnQYAiADKAsyGy5waXJjLnYxYWxwaGExLkNvbnRlbnRCbG9jaxIjCgV1c2FnZRgDIAEoCzIULnBpcmMudjFhbHBoYTEuVXNhZ2USLgoLc3RvcF9yZWFzb24YBCABKA4yGS5waXJjLnYxYWxwaGExLlN0b3BSZWFzb24SIwoFbW9kZWwYBSABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsEhUKDWVycm9yX21lc3NhZ2UYBiABKAkiOgoMQ29udGVudEJsb2NrEg4KBHRleHQYASABKAlIABISCgh0aGlua2luZxgCIAEoCUgAQgYKBGJvZHkieQoFVXNhZ2USFAoMaW5wdXRfdG9rZW5zGAEgASgEEhUKDW91dHB1dF90b2tlbnMYAiABKAQSGQoRY2FjaGVfcmVhZF90b2tlbnMYAyABKAQSGgoSY2FjaGVfd3JpdGVfdG9rZW5zGAQgASgEEgwKBGNvc3QYBSABKAEidgoOQXNzaXN0YW50RGVsdGESEgoKbWVzc2FnZV9pZBgBIAEoCRIPCgd0dXJuX2lkGAIgASgJEhMKC2Jsb2NrX2luZGV4GAMgASgNEg4KBHRleHQYBCABKAlIABISCgh0aGlua2luZxgFIAEoCUgAQgYKBGJvZHkiSwoIVG9vbENhbGwSFAoMdG9vbF9jYWxsX2lkGAEgASgJEhEKCXRvb2xfbmFtZRgCIAEoCRIWCg5hcmd1bWVudHNfanNvbhgDIAEoCSJCCgpUb29sUmVzdWx0EhQKDHRvb2xfY2FsbF9pZBgBIAEoCRIQCghpc19lcnJvchgCIAEoCBIMCgR0ZXh0GAMgASgJIkMKDFRvb2xQcm9ncmVzcxIUCgx0b29sX2NhbGxfaWQYASABKAkSDwoHdHVybl9pZBgCIAEoCRIMCgR0ZXh0GAMgASgJIiEKDldvcmtpbmdDaGFuZ2VkEg8KB3dvcmtpbmcYASABKAgiNAoKQ29tcGFjdGlvbhIPCgdzdW1tYXJ5GAEgASgJEhUKDXRva2Vuc19iZWZvcmUYAiABKAQiIAoNQnJhbmNoU3VtbWFyeRIPCgdzdW1tYXJ5GAEgASgJIiAKDUJyYW5jaENoYW5nZWQSDwoHbGVhZl9pZBgBIAEoCSqyAQoNU2Vzc2lvbk9yaWdpbhIeChpTRVNTSU9OX09SSUdJTl9VTlNQRUNJRklFRBAAEhoKFlNFU1NJT05fT1JJR0lOX1NUQVJUVVAQARIWChJTRVNTSU9OX09SSUdJTl9ORVcQAhIZChVTRVNTSU9OX09SSUdJTl9SRVNVTUUQAxIXChNTRVNTSU9OX09SSUdJTl9GT1JLEAQSGQoVU0VTU0lPTl9PUklHSU5fUkVMT0FEEAUq4QEKDVRoaW5raW5nTGV2ZWwSHgoaVEhJTktJTkdfTEVWRUxfVU5TUEVDSUZJRUQQABIWChJUSElOS0lOR19MRVZFTF9PRkYQARIaChZUSElOS0lOR19MRVZFTF9NSU5JTUFMEAISFgoSVEhJTktJTkdfTEVWRUxfTE9XEAMSGQoVVEhJTktJTkdfTEVWRUxfTUVESVVNEAQSFwoTVEhJTktJTkdfTEVWRUxfSElHSBAFEhgKFFRISU5LSU5HX0xFVkVMX1hISUdIEAYSFgoSVEhJTktJTkdfTEVWRUxfTUFYEAcqggEKDUNvbW1hbmRTb3VyY2USHgoaQ09NTUFORF9TT1VSQ0VfVU5TUEVDSUZJRUQQABIcChhDT01NQU5EX1NPVVJDRV9FWFRFTlNJT04QARIZChVDT01NQU5EX1NPVVJDRV9QUk9NUFQQAhIYChRDT01NQU5EX1NPVVJDRV9TS0lMTBADKlAKCERlbGl2ZXJ5EhgKFERFTElWRVJZX1VOU1BFQ0lGSUVEEAASEgoOREVMSVZFUllfU1RFRVIQARIWChJERUxJVkVSWV9GT0xMT1dfVVAQAiq7AQoKU3RvcFJlYXNvbhIbChdTVE9QX1JFQVNPTl9VTlNQRUNJRklFRBAAEhQKEFNUT1BfUkVBU09OX1NUT1AQARIWChJTVE9QX1JFQVNPTl9MRU5HVEgQAhIYChRTVE9QX1JFQVNPTl9UT09MX1VTRRADEhcKE1NUT1BfUkVBU09OX0FCT1JURUQQBBIVChFTVE9QX1JFQVNPTl9FUlJPUhAFEhgKFFNUT1BfUkVBU09OX0RFRkVSUkVEEAZCrQEKEWNvbS5waXJjLnYxYWxwaGExQgxTZXNzaW9uUHJvdG9QAVo1cGlyYy5kZXYvcmVsYXkvaW50ZXJuYWwvcGIvcGlyYy92MWFscGhhMTtwaXJjdjFhbHBoYTGiAgNQWFiqAg1QaXJjLlYxYWxwaGExygINUGlyY1xWMWFscGhhMeICGVBpcmNcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAg5QaXJjOjpWMWFscGhhMWIGcHJvdG8z", [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 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);
+var BranchSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 23);
+var ImageSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 31);
+var HistorySchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 34);
+var ConversationItemSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 37);
+var ContentBlockSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 40);
+var UsageSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 41);
// protocol/helpers.ts
function errorReply(requestId, code, message) {
@@ -7492,7 +7492,7 @@ import { appendFileSync } from "node:fs";
// extension/src/live.ts
import { randomBytes as randomBytes2 } from "node:crypto";
-import { existsSync } from "node:fs";
+import { existsSync as existsSync2 } from "node:fs";
import { hostname as hostname2 } from "node:os";
// extension/src/convert.ts
@@ -7746,6 +7746,284 @@ function fitItem(item, budget) {
return item;
}
+// extension/src/launch.ts
+import { existsSync, statSync } from "node:fs";
+import { homedir as homedir2 } from "node:os";
+import { join as join2 } from "node:path";
+
+// extension/src/place.ts
+import { execFile } from "node:child_process";
+import { createConnection } from "node:net";
+var DETECT_MS = 2e3;
+var MAX_NAME = 128;
+var PLACE_EVENT = "pirc:place";
+function cut(s) {
+ return typeof s === "string" ? cutUtf8(s.trim(), MAX_NAME) : "";
+}
+function num(n) {
+ return typeof n === "number" && Number.isInteger(n) && n >= 0 && n < 2 ** 32 ? n : void 0;
+}
+function place(p) {
+ const v = {
+ kind: cut(p.kind),
+ group: cut(p.group),
+ window: cut(p.window),
+ pane: cut(p.pane),
+ display: cut(p.display),
+ groupNumber: num(p.groupNumber),
+ windowNumber: num(p.windowNumber)
+ };
+ if (!v.group && !v.window && !v.pane && !v.display) return void 0;
+ return create(PlaceSchema, v);
+}
+function parseGiven(data) {
+ if (data === null) return null;
+ if (typeof data !== "object" || Array.isArray(data)) throw new Error("pirc:place takes an object, or null");
+ return place(data);
+}
+function run(cmd, args, env) {
+ return new Promise((resolve, reject) => {
+ execFile(cmd, args, { env, timeout: DETECT_MS, encoding: "utf8" }, (err, out) => err ? reject(err) : resolve(out));
+ });
+}
+async function tmuxPlace(env) {
+ const pane = env.TMUX_PANE;
+ if (!env.TMUX || !pane) return void 0;
+ const out = await run("tmux", ["display-message", "-p", "-t", pane, "#{session_name} #{window_index} #{window_name}"], env);
+ const [group, windowNumber, window] = out.replace(/\n$/, "").split(" ");
+ return place({ kind: "tmux", group, window, windowNumber: Number(windowNumber) });
+}
+function herdrSession(path) {
+ const socket = createConnection(path);
+ let buf = "";
+ let n = 0;
+ const waiting = /* @__PURE__ */ new Map();
+ const failAll = (e) => {
+ for (const w of waiting.values()) w.reject(e);
+ waiting.clear();
+ };
+ socket.setEncoding("utf8");
+ socket.on("data", (d) => {
+ buf += d;
+ let i;
+ while ((i = buf.indexOf("\n")) >= 0) {
+ const line = buf.slice(0, i);
+ buf = buf.slice(i + 1);
+ let m;
+ try {
+ m = JSON.parse(line);
+ } catch {
+ continue;
+ }
+ const w = m.id ? waiting.get(m.id) : void 0;
+ if (!w) continue;
+ waiting.delete(m.id);
+ if (m.result) w.resolve(m.result);
+ else w.reject(new Error(`herdr: ${m.error?.message ?? "no result"}`));
+ }
+ });
+ socket.on("error", (e) => failAll(e));
+ socket.on("close", () => failAll(new Error("herdr closed the connection")));
+ return {
+ ask(method, params) {
+ const id = `pirc-${++n}`;
+ return new Promise((resolve, reject) => {
+ waiting.set(id, { resolve, reject });
+ socket.write(`${JSON.stringify({ id, method, params })}
+`);
+ });
+ },
+ close() {
+ socket.destroy();
+ }
+ };
+}
+function herdrPane(env) {
+ const path = env.HERDR_SOCKET_PATH;
+ const paneId = env.HERDR_PANE_ID;
+ if (env.HERDR_ENV !== "1" || !path || !paneId) return void 0;
+ return { socket: process.platform === "win32" ? `\\\\.\\pipe\\${path}` : path, paneId };
+}
+async function herdrPlace(env) {
+ const at = herdrPane(env);
+ if (!at) return void 0;
+ const paneId = at.paneId;
+ const h = herdrSession(at.socket);
+ const timer = setTimeout(() => h.close(), DETECT_MS);
+ try {
+ const { pane } = await h.ask("pane.current", { caller_pane_id: paneId });
+ if (!pane?.workspace_id || !pane.tab_id) return void 0;
+ const [{ workspace }, { tab }] = await Promise.all([
+ h.ask("workspace.get", { workspace_id: pane.workspace_id }),
+ h.ask("tab.get", { tab_id: pane.tab_id })
+ ]);
+ return place({
+ kind: "herdr",
+ group: workspace?.label,
+ groupNumber: workspace?.number,
+ window: tab?.label,
+ windowNumber: tab?.number,
+ pane: pane.label
+ });
+ } finally {
+ clearTimeout(timer);
+ h.close();
+ }
+}
+async function detectPlace(env = process.env) {
+ return await herdrPlace(env) ?? await tmuxPlace(env);
+}
+var PlaceTracker = class {
+ constructor(onChange, onError, detect = () => detectPlace()) {
+ this.onChange = onChange;
+ this.onError = onError;
+ this.detect = detect;
+ }
+ onChange;
+ onError;
+ detect;
+ detected;
+ // Given by another extension: replaces detection until null hands back.
+ given;
+ checking;
+ again = false;
+ get current() {
+ return this.given ? this.given.place : this.detected;
+ }
+ // From the pirc:place event.
+ give(data) {
+ const before = key(this.current);
+ const p = parseGiven(data);
+ this.given = p === null ? void 0 : { place: p };
+ if (key(this.current) !== before) this.onChange();
+ if (p === null) void this.refresh();
+ }
+ // Checks again; concurrent calls share one check, and a call during one
+ // runs another after it.
+ refresh() {
+ if (this.given) return Promise.resolve();
+ if (this.checking) {
+ this.again = true;
+ return this.checking;
+ }
+ this.checking = (async () => {
+ do {
+ this.again = false;
+ let p;
+ try {
+ p = await this.detect();
+ } catch (e) {
+ this.onError(e);
+ continue;
+ }
+ if (this.given) return;
+ if (key(p) !== key(this.detected)) {
+ this.detected = p;
+ this.onChange();
+ }
+ } while (this.again);
+ })().finally(() => this.checking = void 0);
+ return this.checking;
+ }
+};
+function key(p) {
+ return p ? JSON.stringify([p.kind, p.group, p.groupNumber, p.window, p.windowNumber, p.pane, p.display]) : "";
+}
+
+// extension/src/launch.ts
+var LAUNCH_MS = 5e3;
+var LAUNCH_ENV = "PIRC_LAUNCH";
+var LAUNCHER_EVENT = "pirc:launcher";
+function parseLauncher(data) {
+ if (data === null) return null;
+ if (data === false) return void 0;
+ const l = data;
+ if (typeof l?.name !== "string" || !l.name.trim() || typeof l.launch !== "function") {
+ throw new Error("pirc:launcher takes { name, launch({ cwd, command, env }) }, false, or null");
+ }
+ const launch = l.launch.bind(l);
+ return { name: l.name.trim().slice(0, 64), launch: async (o) => void await launch(o) };
+}
+function piCommand(argv = process.argv, execPath = process.execPath) {
+ const entry = argv[1];
+ return entry && existsSync(entry) ? [execPath, entry] : ["pi"];
+}
+function launchEnv(env, launchId) {
+ const out = {};
+ for (const [k, v] of Object.entries(env)) {
+ if (v === void 0 || !/^(PI|PIRC)_/.test(k) || k === "PIRC_TOKEN" || k === LAUNCH_ENV || k === "PI_CODING_AGENT") continue;
+ out[k] = v;
+ }
+ out[LAUNCH_ENV] = launchId;
+ return out;
+}
+function launchFolder(cwd, home = homedir2()) {
+ const given = cwd.trim();
+ if (!given) return { problem: "no folder given" };
+ const path = given === "~" ? home : given.startsWith("~/") ? join2(home, given.slice(2)) : given;
+ if (!path.startsWith("/")) return { problem: `not a full path: ${given}` };
+ try {
+ if (!statSync(path).isDirectory()) return { problem: `not a folder: ${path}` };
+ } catch {
+ return { problem: `no such folder: ${path}` };
+ }
+ return { path };
+}
+function tmuxLauncher(env, exec = run) {
+ const pane = env.TMUX_PANE;
+ if (!env.TMUX || !pane) return void 0;
+ return {
+ name: "tmux",
+ async launch({ cwd, command, env: extra }) {
+ const window = (await exec("tmux", ["display-message", "-p", "-t", pane, "#{window_id}"], env)).trim();
+ if (!window) throw new Error("tmux did not say which window pi is in");
+ const vars = Object.entries(extra).flatMap(([k, v]) => ["-e", `${k}=${v}`]);
+ await exec("tmux", ["new-window", "-d", "-a", "-t", window, "-c", cwd, ...vars, "--", ...command], env);
+ }
+ };
+}
+function herdrLauncher(env, connect = herdrSession) {
+ const at = herdrPane(env);
+ if (!at) return void 0;
+ return {
+ name: "herdr",
+ async launch({ cwd, command, env: extra }) {
+ const h = connect(at.socket);
+ const timer = setTimeout(() => h.close(), LAUNCH_MS);
+ try {
+ const { pane } = await h.ask("pane.current", { caller_pane_id: at.paneId });
+ if (!pane?.workspace_id) throw new Error("herdr did not say which workspace pi is in");
+ await h.ask("layout.apply", { workspace_id: pane.workspace_id, focus: false, root: { type: "pane", cwd, command, env: extra } });
+ } finally {
+ clearTimeout(timer);
+ h.close();
+ }
+ }
+ };
+}
+function builtInLauncher(env = process.env) {
+ return herdrLauncher(env) ?? tmuxLauncher(env);
+}
+var LauncherChoice = class {
+ constructor(onChange, builtIn = builtInLauncher()) {
+ this.onChange = onChange;
+ this.builtIn = builtIn;
+ }
+ onChange;
+ builtIn;
+ given;
+ get current() {
+ return this.given ? this.given.launcher : this.builtIn;
+ }
+ // From the pirc:launcher event.
+ give(data) {
+ const before = this.current?.name ?? "";
+ const l = parseLauncher(data);
+ this.given = l === null ? void 0 : { launcher: l };
+ if ((this.current?.name ?? "") !== before) this.onChange();
+ }
+};
+
// extension/src/live.ts
var ORIGIN = {
startup: 1 /* STARTUP */,
@@ -7758,6 +8036,7 @@ var DELTA_MS = 50;
var PROGRESS_MS = 250;
var PROMPT_ECHO_MS = 10 * 6e4;
var CONFIRM_MS = 3e4;
+var STOP_DELAY_MS = 300;
var PERSIST_MS = 2e3;
var SHOWN = /* @__PURE__ */ new Set(["user", "assistant", "toolResult"]);
var cancelled = (what) => (r) => r.cancelled ? `another extension cancelled the ${what}` : void 0;
@@ -7831,6 +8110,8 @@ var REQUESTS = {
reload: "change",
navigateTree: "change",
rename: "change",
+ stop: "change",
+ launch: "change",
historyRequest: "question",
listModels: "question",
statsRequest: "question",
@@ -7845,7 +8126,7 @@ function forkProblem(ctx, id, position) {
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";
+ if (target && file && !existsSync2(file)) return "pi has not saved this session yet: it has no reply to keep";
return void 0;
}
function treeProblem(ctx, id) {
@@ -7865,7 +8146,7 @@ async function resumeProblem(ctx, path) {
const find = async (all) => (await pastSessions(ctx, all)).find((s) => s.path === path);
const info = await find(false) ?? await find(true);
if (!info) return "pi has no such saved session";
- if (info.cwd && !existsSync(info.cwd)) return `its folder no longer exists: ${info.cwd}`;
+ if (info.cwd && !existsSync2(info.cwd)) return `its folder no longer exists: ${info.cwd}`;
return void 0;
}
var BUILTIN_COMMANDS = /* @__PURE__ */ new Set([
@@ -7998,7 +8279,9 @@ var Live = class {
extensionVersion: this.versions.extension,
place: this.sink.place(),
firstPrompt: this.firstPrompt,
- requests: Object.keys(REQUESTS).map(requestName)
+ requests: Object.keys(REQUESTS).map(requestName),
+ launcher: this.sink.launcher()?.name ?? "",
+ launchId: this.sink.launchId
});
}
announcementBytes() {
@@ -8444,6 +8727,22 @@ var Live = class {
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 "stop": {
+ const { requestId } = body.value;
+ const why = this.busy();
+ if (why) return respond(errorReply(requestId, 8 /* BUSY */, why));
+ respond(accepted(requestId));
+ setTimeout(this.guard("stop", () => this.ctx.shutdown()), STOP_DELAY_MS);
+ return;
+ }
+ case "launch": {
+ const { requestId } = body.value;
+ const launcher = this.sink.launcher();
+ if (!launcher) return respond(errorReply(requestId, 4 /* INVALID */, "this pi cannot open another: it runs in neither tmux nor herdr, and no extension gives a launcher"));
+ const folder = launchFolder(body.value.cwd);
+ if ("problem" in folder) return respond(errorReply(requestId, 4 /* INVALID */, folder.problem));
+ return this.whenSettled(requestId, "launch", launcher.launch({ cwd: folder.path, command: piCommand(), env: launchEnv(process.env, requestId) }), respond, () => respond(accepted(requestId)));
+ }
case "statsRequest": {
const usage = this.ctx.getContextUsage();
return respond(create(SessionMessageSchema, {
@@ -8517,179 +8816,6 @@ function withRequestId(m, requestId) {
return m;
}
-// extension/src/place.ts
-import { execFile } from "node:child_process";
-import { createConnection } from "node:net";
-var DETECT_MS = 2e3;
-var MAX_NAME = 128;
-var PLACE_EVENT = "pirc:place";
-function cut(s) {
- return typeof s === "string" ? cutUtf8(s.trim(), MAX_NAME) : "";
-}
-function num(n) {
- return typeof n === "number" && Number.isInteger(n) && n >= 0 && n < 2 ** 32 ? n : void 0;
-}
-function place(p) {
- const v = {
- kind: cut(p.kind),
- group: cut(p.group),
- window: cut(p.window),
- pane: cut(p.pane),
- display: cut(p.display),
- groupNumber: num(p.groupNumber),
- windowNumber: num(p.windowNumber)
- };
- if (!v.group && !v.window && !v.pane && !v.display) return void 0;
- return create(PlaceSchema, v);
-}
-function parseGiven(data) {
- if (data === null) return null;
- if (typeof data !== "object" || Array.isArray(data)) throw new Error("pirc:place takes an object, or null");
- return place(data);
-}
-function run(cmd, args, env) {
- return new Promise((resolve, reject) => {
- execFile(cmd, args, { env, timeout: DETECT_MS, encoding: "utf8" }, (err, out) => err ? reject(err) : resolve(out));
- });
-}
-async function tmuxPlace(env) {
- const pane = env.TMUX_PANE;
- if (!env.TMUX || !pane) return void 0;
- const out = await run("tmux", ["display-message", "-p", "-t", pane, "#{session_name} #{window_index} #{window_name}"], env);
- const [group, windowNumber, window] = out.replace(/\n$/, "").split(" ");
- return place({ kind: "tmux", group, window, windowNumber: Number(windowNumber) });
-}
-function herdrSession(path) {
- const socket = createConnection(path);
- let buf = "";
- let n = 0;
- const waiting = /* @__PURE__ */ new Map();
- const failAll = (e) => {
- for (const w of waiting.values()) w.reject(e);
- waiting.clear();
- };
- socket.setEncoding("utf8");
- socket.on("data", (d) => {
- buf += d;
- let i;
- while ((i = buf.indexOf("\n")) >= 0) {
- const line = buf.slice(0, i);
- buf = buf.slice(i + 1);
- let m;
- try {
- m = JSON.parse(line);
- } catch {
- continue;
- }
- const w = m.id ? waiting.get(m.id) : void 0;
- if (!w) continue;
- waiting.delete(m.id);
- if (m.result) w.resolve(m.result);
- else w.reject(new Error(`herdr: ${m.error?.message ?? "no result"}`));
- }
- });
- socket.on("error", (e) => failAll(e));
- socket.on("close", () => failAll(new Error("herdr closed the connection")));
- return {
- ask(method, params) {
- const id = `pirc-${++n}`;
- return new Promise((resolve, reject) => {
- waiting.set(id, { resolve, reject });
- socket.write(`${JSON.stringify({ id, method, params })}
-`);
- });
- },
- close() {
- socket.destroy();
- }
- };
-}
-async function herdrPlace(env) {
- const path = env.HERDR_SOCKET_PATH;
- const paneId = env.HERDR_PANE_ID;
- if (env.HERDR_ENV !== "1" || !path || !paneId) return void 0;
- const h = herdrSession(process.platform === "win32" ? `\\\\.\\pipe\\${path}` : path);
- const timer = setTimeout(() => h.close(), DETECT_MS);
- try {
- const { pane } = await h.ask("pane.current", { caller_pane_id: paneId });
- if (!pane?.workspace_id || !pane.tab_id) return void 0;
- const [{ workspace }, { tab }] = await Promise.all([
- h.ask("workspace.get", { workspace_id: pane.workspace_id }),
- h.ask("tab.get", { tab_id: pane.tab_id })
- ]);
- return place({
- kind: "herdr",
- group: workspace?.label,
- groupNumber: workspace?.number,
- window: tab?.label,
- windowNumber: tab?.number,
- pane: pane.label
- });
- } finally {
- clearTimeout(timer);
- h.close();
- }
-}
-async function detectPlace(env = process.env) {
- return await herdrPlace(env) ?? await tmuxPlace(env);
-}
-var PlaceTracker = class {
- constructor(onChange, onError, detect = () => detectPlace()) {
- this.onChange = onChange;
- this.onError = onError;
- this.detect = detect;
- }
- onChange;
- onError;
- detect;
- detected;
- // Given by another extension: replaces detection until null hands back.
- given;
- checking;
- again = false;
- get current() {
- return this.given ? this.given.place : this.detected;
- }
- // From the pirc:place event.
- give(data) {
- const before = key(this.current);
- const p = parseGiven(data);
- this.given = p === null ? void 0 : { place: p };
- if (key(this.current) !== before) this.onChange();
- if (p === null) void this.refresh();
- }
- // Checks again; concurrent calls share one check, and a call during one
- // runs another after it.
- refresh() {
- if (this.given) return Promise.resolve();
- if (this.checking) {
- this.again = true;
- return this.checking;
- }
- this.checking = (async () => {
- do {
- this.again = false;
- let p;
- try {
- p = await this.detect();
- } catch (e) {
- this.onError(e);
- continue;
- }
- if (this.given) return;
- if (key(p) !== key(this.detected)) {
- this.detected = p;
- this.onChange();
- }
- } while (this.again);
- })().finally(() => this.checking = void 0);
- return this.checking;
- }
-};
-function key(p) {
- return p ? JSON.stringify([p.kind, p.group, p.groupNumber, p.window, p.windowNumber, p.pane, p.display]) : "";
-}
-
// extension/src/host.ts
var isChange = (c) => c !== void 0 && Object.hasOwn(REQUESTS, c) && REQUESTS[c] === "change";
var IDEMPOTENCY_ENTRIES = 1e3;
@@ -8728,6 +8854,12 @@ var Host = class _Host {
},
(e) => this.fail("place", e)
);
+ // What opens a new pi beside this one; another extension can change it.
+ launchers = new LauncherChoice(() => {
+ if (this.state.kind === "ready") this.live?.onAnnouncementChanged();
+ });
+ // The Launch that started this process, if one did.
+ launchId = process.env[LAUNCH_ENV] ?? "";
// The host this one took over from, until it is let go (HANDOVER_MS).
predecessor;
// A host for this process, taking over from the one another version of
@@ -8947,6 +9079,9 @@ var Host = class _Host {
place() {
return this.places.current;
}
+ launcher() {
+ return this.launchers.current;
+ }
maxPayloadBytes() {
return this.state.kind === "ready" ? this.state.maxFrameBytes - 512 : 1 << 20;
}
@@ -9010,13 +9145,13 @@ var Host = class _Host {
};
// extension/src/index.ts
-var EXTENSION_VERSION = true ? "0.1.9-dev+3c5c6f3352f4" : "dev";
+var EXTENSION_VERSION = true ? "0.1.9-dev+e9a4f1867958" : "dev";
function piVersion() {
try {
let dir = dirname3(realpathSync(process.argv[1]));
for (let i = 0; i < 5; i++, dir = dirname3(dir)) {
try {
- const pkg = JSON.parse(readFileSync3(join2(dir, "package.json"), "utf8"));
+ const pkg = JSON.parse(readFileSync3(join3(dir, "package.json"), "utf8"));
if (pkg.name === "@earendil-works/pi-coding-agent") return String(pkg.version);
} catch {
}
@@ -9025,7 +9160,7 @@ function piVersion() {
}
return "unknown";
}
-var LOAD = true ? "0.1.9-dev+3c5c6f3352f4" : `dev ${randomBytes3(4).toString("hex")}`;
+var LOAD = true ? "0.1.9-dev+e9a4f1867958" : `dev ${randomBytes3(4).toString("hex")}`;
var KEY = /* @__PURE__ */ Symbol.for("pirc.extension");
var proc = globalThis[KEY] ??= {};
if (!proc.host || proc.load !== LOAD) {
@@ -9082,6 +9217,14 @@ function index_default(pi) {
proc.host.fail(PLACE_EVENT, err);
}
});
+ proc.stopLauncher?.();
+ proc.stopLauncher = pi.events.on(LAUNCHER_EVENT, (data) => {
+ try {
+ proc.host.launchers.give(data);
+ } catch (err) {
+ proc.host.fail(LAUNCHER_EVENT, err);
+ }
+ });
pi.on("session_info_changed", on("session_info_changed", (live) => live.onAnnouncementChanged()));
pi.on("model_select", on("model_select", (live) => live.onAnnouncementChanged()));
pi.on("thinking_level_select", on("thinking_level_select", (live) => live.onAnnouncementChanged()));