diff options
Diffstat (limited to 'pirc.js')
| -rw-r--r-- | pirc.js | 521 |
1 files changed, 332 insertions, 189 deletions
@@ -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())); |
