From 59162f76460efddd0399efd1bcfdf014c379ad5e Mon Sep 17 00:00:00 2001 From: Igor Soarez Date: Fri, 30 Oct 2026 07:51:24 +0000 Subject: pirc-extension 0.1.9-dev+d581157e4c48 --- README.md | 9 +++ package.json | 2 +- pirc.js | 204 +++++++++++++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 193 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index c0da80b..e3f0a1b 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,15 @@ Fields: `kind`, `group` (a tmux session, a workspace), `groupNumber`, optional; names are cut to 128 bytes. A place given this way stands until the next one, so the extension can update it whenever it likes. +## Questions + +A dialog another extension shows in pi's terminal (`ctx.ui.select`, +`confirm`, `input`) is asked of PiRC's clients too, and whichever answers +first wins: an answer from a client closes the terminal's dialog. An +editor or a custom dialog is shown to clients as waiting, and answered +only in the terminal. This wraps pi's `ui` object, which pi does not +document; if a pi version stops allowing it, `/pirc status` says so. + ## Opening new agents A client can stop a pi, and open a new one beside it: in tmux, a window diff --git a/package.json b/package.json index 6a3986f..8db9c21 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pirc-extension", - "version": "0.1.9-dev+46bb48bfe5b3", + "version": "0.1.9-dev+d581157e4c48", "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 83bc498..996c05b 100644 --- a/pirc.js +++ b/pirc.js @@ -1,4 +1,4 @@ -// PiRC extension 0.1.9-dev+46bb48bfe5b3. Third-party code in this file: @bufbuild/protobuf@2.16.0, ws@8.22.0; see NOTICE. +// PiRC extension 0.1.9-dev+d581157e4c48. 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; @@ -2276,7 +2276,7 @@ var require_websocket = __commonJS({ var http = __require("http"); var net = __require("net"); var tls = __require("tls"); - var { randomBytes: randomBytes4, createHash } = __require("crypto"); + var { randomBytes: randomBytes5, createHash } = __require("crypto"); var { Duplex, Readable } = __require("stream"); var { URL: URL2 } = __require("url"); var PerMessageDeflate2 = require_permessage_deflate(); @@ -2827,7 +2827,7 @@ var require_websocket = __commonJS({ } } const defaultPort = isSecure ? 443 : 80; - const key2 = randomBytes4(16).toString("base64"); + const key2 = randomBytes5(16).toString("base64"); const request = isSecure ? https.request : http.request; const protocolSet = /* @__PURE__ */ new Set(); let perMessageDeflate; @@ -3721,7 +3721,7 @@ var require_websocket_server = __commonJS({ }); // extension/src/index.ts -import { randomBytes as randomBytes3 } from "node:crypto"; +import { randomBytes as randomBytes4 } from "node:crypto"; import { readFileSync as readFileSync3, realpathSync } from "node:fs"; import { dirname as dirname3, join as join3 } from "node:path"; @@ -7143,18 +7143,19 @@ 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("ChtwaXJjL3YxYWxwaGExL3Nlc3Npb24ucHJvdG8SDXBpcmMudjFhbHBoYTEi3gMKE1Nlc3Npb25Bbm5vdW5jZW1lbnQSDAoEbmFtZRgBIAEoCRILCgNjd2QYAiABKAkSEAoIaG9zdG5hbWUYAyABKAkSIwoFbW9kZWwYBCABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsEjQKDnRoaW5raW5nX2xldmVsGAUgASgOMhwucGlyYy52MWFscGhhMS5UaGlua2luZ0xldmVsEg8KB3dvcmtpbmcYBiABKAgSLgoKc3RhcnRlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASGwoTcmVwbGFjZXNfc2Vzc2lvbl9pZBgIIAEoCRIsCgZvcmlnaW4YCSABKA4yHC5waXJjLnYxYWxwaGExLlNlc3Npb25PcmlnaW4SEgoKcGlfdmVyc2lvbhgKIAEoCRIZChFleHRlbnNpb25fdmVyc2lvbhgLIAEoCRISCgpjb21wYWN0aW5nGAwgASgIEiMKBXBsYWNlGA0gASgLMhQucGlyYy52MWFscGhhMS5QbGFjZRIUCgxmaXJzdF9wcm9tcHQYDiABKAkSEAoIcmVxdWVzdHMYDyADKAkSEAoIbGF1bmNoZXIYECABKAkSEQoJbGF1bmNoX2lkGBEgASgJIq0BCgVQbGFjZRIMCgRraW5kGAEgASgJEg0KBWdyb3VwGAIgASgJEhkKDGdyb3VwX251bWJlchgDIAEoDUgAiAEBEg4KBndpbmRvdxgEIAEoCRIaCg13aW5kb3dfbnVtYmVyGAUgASgNSAGIAQESDAoEcGFuZRgGIAEoCRIPCgdkaXNwbGF5GAcgASgJQg8KDV9ncm91cF9udW1iZXJCEAoOX3dpbmRvd19udW1iZXIiMwoFTW9kZWwSEAoIcHJvdmlkZXIYASABKAkSCgoCaWQYAiABKAkSDAoEbmFtZRgDIAEoCSLbCgoOU2Vzc2lvbk1lc3NhZ2USEgoKcmVxdWVzdF9pZBgyIAEoCRInCgZwcm9tcHQYASABKAsyFS5waXJjLnYxYWxwaGExLlByb21wdEgAEiUKBWFib3J0GAIgASgLMhQucGlyYy52MWFscGhhMS5BYm9ydEgAEjgKD2hpc3RvcnlfcmVxdWVzdBgDIAEoCzIdLnBpcmMudjFhbHBoYTEuSGlzdG9yeVJlcXVlc3RIABIwCgtsaXN0X21vZGVscxgEIAEoCzIZLnBpcmMudjFhbHBoYTEuTGlzdE1vZGVsc0gAEiwKCXNldF9tb2RlbBgFIAEoCzIXLnBpcmMudjFhbHBoYTEuU2V0TW9kZWxIABI9ChJzZXRfdGhpbmtpbmdfbGV2ZWwYBiABKAsyHy5waXJjLnYxYWxwaGExLlNldFRoaW5raW5nTGV2ZWxIABIpCgdjb21wYWN0GAcgASgLMhYucGlyYy52MWFscGhhMS5Db21wYWN0SAASMAoLbmV3X3Nlc3Npb24YCCABKAsyGS5waXJjLnYxYWxwaGExLk5ld1Nlc3Npb25IABInCgZyZW5hbWUYCSABKAsyFS5waXJjLnYxYWxwaGExLlJlbmFtZUgAEjQKDXN0YXRzX3JlcXVlc3QYESABKAsyGy5waXJjLnYxYWxwaGExLlN0YXRzUmVxdWVzdEgAEjQKDWxpc3RfY29tbWFuZHMYEiABKAsyGy5waXJjLnYxYWxwaGExLkxpc3RDb21tYW5kc0gAEiMKBGZvcmsYEyABKAsyEy5waXJjLnYxYWxwaGExLkZvcmtIABIlCgVjbG9uZRgUIAEoCzIULnBpcmMudjFhbHBoYTEuQ2xvbmVIABI9ChJsaXN0X3Bhc3Rfc2Vzc2lvbnMYFSABKAsyHy5waXJjLnYxYWxwaGExLkxpc3RQYXN0U2Vzc2lvbnNIABInCgZyZXN1bWUYFiABKAsyFS5waXJjLnYxYWxwaGExLlJlc3VtZUgAEicKBnJlbG9hZBgYIAEoCzIVLnBpcmMudjFhbHBoYTEuUmVsb2FkSAASNAoNbmF2aWdhdGVfdHJlZRgZIAEoCzIbLnBpcmMudjFhbHBoYTEuTmF2aWdhdGVUcmVlSAASLAoJbGlzdF90cmVlGBogASgLMhcucGlyYy52MWFscGhhMS5MaXN0VHJlZUgAEiMKBHN0b3AYHCABKAsyEy5waXJjLnYxYWxwaGExLlN0b3BIABInCgZsYXVuY2gYHSABKAsyFS5waXJjLnYxYWxwaGExLkxhdW5jaEgAEiwKBWV2ZW50GAogASgLMhsucGlyYy52MWFscGhhMS5TZXNzaW9uRXZlbnRIABIpCgdoaXN0b3J5GAsgASgLMhYucGlyYy52MWFscGhhMS5IaXN0b3J5SAASKwoIYWNjZXB0ZWQYDCABKAsyFy5waXJjLnYxYWxwaGExLkFjY2VwdGVkSAASJQoFZXJyb3IYDSABKAsyFC5waXJjLnYxYWxwaGExLkVycm9ySAASJwoGbW9kZWxzGA4gASgLMhUucGlyYy52MWFscGhhMS5Nb2RlbHNIABIlCgVzdGF0cxgPIAEoCzIULnBpcmMudjFhbHBoYTEuU3RhdHNIABIrCghjb21tYW5kcxgQIAEoCzIXLnBpcmMudjFhbHBoYTEuQ29tbWFuZHNIABI0Cg1wYXN0X3Nlc3Npb25zGBcgASgLMhsucGlyYy52MWFscGhhMS5QYXN0U2Vzc2lvbnNIABIjCgR0cmVlGBsgASgLMhMucGlyYy52MWFscGhhMS5UcmVlSABCBgoEYm9keSIgCgpMaXN0TW9kZWxzEhIKCnJlcXVlc3RfaWQYASABKAkicQoGTW9kZWxzEhIKCnJlcXVlc3RfaWQYASABKAkSKAoGbW9kZWxzGAIgAygLMhgucGlyYy52MWFscGhhMS5Nb2RlbEluZm8SKQoHY3VycmVudBgDIAEoCzIYLnBpcmMudjFhbHBoYTEuTW9kZWxJbmZvImsKCU1vZGVsSW5mbxIjCgVtb2RlbBgBIAEoCzIULnBpcmMudjFhbHBoYTEuTW9kZWwSEQoJcmVhc29uaW5nGAIgASgIEhYKDmNvbnRleHRfd2luZG93GAMgASgEEg4KBmltYWdlcxgEIAEoCCJDCghTZXRNb2RlbBISCgpyZXF1ZXN0X2lkGAEgASgJEiMKBW1vZGVsGAIgASgLMhQucGlyYy52MWFscGhhMS5Nb2RlbCJTChBTZXRUaGlua2luZ0xldmVsEhIKCnJlcXVlc3RfaWQYASABKAkSKwoFbGV2ZWwYAiABKA4yHC5waXJjLnYxYWxwaGExLlRoaW5raW5nTGV2ZWwiMwoHQ29tcGFjdBISCgpyZXF1ZXN0X2lkGAEgASgJEhQKDGluc3RydWN0aW9ucxgCIAEoCSIgCgpOZXdTZXNzaW9uEhIKCnJlcXVlc3RfaWQYASABKAkiLAoERm9yaxISCgpyZXF1ZXN0X2lkGAEgASgJEhAKCGVudHJ5X2lkGAIgASgJIhsKBUNsb25lEhIKCnJlcXVlc3RfaWQYASABKAkiOwoQTGlzdFBhc3RTZXNzaW9ucxISCgpyZXF1ZXN0X2lkGAEgASgJEhMKC2FsbF9mb2xkZXJzGAIgASgIImMKDFBhc3RTZXNzaW9ucxISCgpyZXF1ZXN0X2lkGAEgASgJEiwKCHNlc3Npb25zGAIgAygLMhoucGlyYy52MWFscGhhMS5QYXN0U2Vzc2lvbhIRCgl0cnVuY2F0ZWQYAyABKAgi2AEKC1Bhc3RTZXNzaW9uEgwKBHBhdGgYASABKAkSEgoKc2Vzc2lvbl9pZBgCIAEoCRILCgNjd2QYAyABKAkSDAoEbmFtZRgEIAEoCRIUCgxmaXJzdF9wcm9tcHQYBSABKAkSLgoKY3JlYXRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoLbW9kaWZpZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhUKDW1lc3NhZ2VfY291bnQYCCABKA0iKgoGUmVzdW1lEhIKCnJlcXVlc3RfaWQYASABKAkSDAoEcGF0aBgCIAEoCSIcCgZSZWxvYWQSEgoKcmVxdWVzdF9pZBgBIAEoCSIaCgRTdG9wEhIKCnJlcXVlc3RfaWQYASABKAkiNwoGTGF1bmNoEhIKCnJlcXVlc3RfaWQYASABKAkSCwoDY3dkGAIgASgJEgwKBG5hbWUYAyABKAkiRwoMTmF2aWdhdGVUcmVlEhIKCnJlcXVlc3RfaWQYASABKAkSEAoIZW50cnlfaWQYAiABKAkSEQoJc3VtbWFyaXplGAMgASgIIh4KCExpc3RUcmVlEhIKCnJlcXVlc3RfaWQYASABKAkiVgoEVHJlZRISCgpyZXF1ZXN0X2lkGAEgASgJEicKCGJyYW5jaGVzGAIgAygLMhUucGlyYy52MWFscGhhMS5CcmFuY2gSEQoJdHJ1bmNhdGVkGAMgASgIIpABCgZCcmFuY2gSDwoHbGVhZl9pZBgBIAEoCRIPCgdjdXJyZW50GAIgASgIEg4KBnByb21wdBgDIAEoCRIMCgRsYXN0GAQgASgJEi8KC21vZGlmaWVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIVCg1tZXNzYWdlX2NvdW50GAYgASgNIioKBlJlbmFtZRISCgpyZXF1ZXN0X2lkGAEgASgJEgwKBG5hbWUYAiABKAkiIgoMU3RhdHNSZXF1ZXN0EhIKCnJlcXVlc3RfaWQYASABKAkiiAEKBVN0YXRzEhIKCnJlcXVlc3RfaWQYASABKAkSIwoFdG90YWwYAiABKAsyFC5waXJjLnYxYWxwaGExLlVzYWdlEhsKDmNvbnRleHRfdG9rZW5zGAMgASgESACIAQESFgoOY29udGV4dF93aW5kb3cYBCABKARCEQoPX2NvbnRleHRfdG9rZW5zIiIKDExpc3RDb21tYW5kcxISCgpyZXF1ZXN0X2lkGAEgASgJIkwKCENvbW1hbmRzEhIKCnJlcXVlc3RfaWQYASABKAkSLAoIY29tbWFuZHMYAiADKAsyGi5waXJjLnYxYWxwaGExLkNvbW1hbmRJbmZvIl4KC0NvbW1hbmRJbmZvEgwKBG5hbWUYASABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkSLAoGc291cmNlGAMgASgOMhwucGlyYy52MWFscGhhMS5Db21tYW5kU291cmNlInsKBlByb21wdBISCgpyZXF1ZXN0X2lkGAEgASgJEgwKBHRleHQYAiABKAkSJAoGaW1hZ2VzGAMgAygLMhQucGlyYy52MWFscGhhMS5JbWFnZRIpCghkZWxpdmVyeRgEIAEoDjIXLnBpcmMudjFhbHBoYTEuRGVsaXZlcnkiKAoFSW1hZ2USEQoJbWltZV90eXBlGAEgASgJEgwKBGRhdGEYAiABKAwiGwoFQWJvcnQSEgoKcmVxdWVzdF9pZBgBIAEoCSIzCg5IaXN0b3J5UmVxdWVzdBISCgpyZXF1ZXN0X2lkGAEgASgJEg0KBWxpbWl0GAIgASgNIm0KB0hpc3RvcnkSEgoKcmVxdWVzdF9pZBgBIAEoCRIuCgVpdGVtcxgCIAMoCzIfLnBpcmMudjFhbHBoYTEuQ29udmVyc2F0aW9uSXRlbRILCgNzZXEYAyABKAQSEQoJdHJ1bmNhdGVkGAQgASgIIh4KCEFjY2VwdGVkEhIKCnJlcXVlc3RfaWQYASABKAkimgMKDFNlc3Npb25FdmVudBILCgNzZXEYASABKAQSJgoCYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KBGl0ZW0YAyABKAsyHy5waXJjLnYxYWxwaGExLkNvbnZlcnNhdGlvbkl0ZW1IABI4Cg9hc3Npc3RhbnRfZGVsdGEYBCABKAsyHS5waXJjLnYxYWxwaGExLkFzc2lzdGFudERlbHRhSAASNAoNdG9vbF9wcm9ncmVzcxgFIAEoCzIbLnBpcmMudjFhbHBoYTEuVG9vbFByb2dyZXNzSAASOAoPd29ya2luZ19jaGFuZ2VkGAYgASgLMh0ucGlyYy52MWFscGhhMS5Xb3JraW5nQ2hhbmdlZEgAEjoKDGFubm91bmNlbWVudBgHIAEoCzIiLnBpcmMudjFhbHBoYTEuU2Vzc2lvbkFubm91bmNlbWVudEgAEjYKDmJyYW5jaF9jaGFuZ2VkGAggASgLMhwucGlyYy52MWFscGhhMS5CcmFuY2hDaGFuZ2VkSABCBgoEYm9keSKgAwoQQ29udmVyc2F0aW9uSXRlbRIQCghlbnRyeV9pZBgBIAEoCRIPCgd0dXJuX2lkGAIgASgJEiYKAmF0GAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIyCgx1c2VyX21lc3NhZ2UYBCABKAsyGi5waXJjLnYxYWxwaGExLlVzZXJNZXNzYWdlSAASPAoRYXNzaXN0YW50X21lc3NhZ2UYBSABKAsyHy5waXJjLnYxYWxwaGExLkFzc2lzdGFudE1lc3NhZ2VIABIsCgl0b29sX2NhbGwYBiABKAsyFy5waXJjLnYxYWxwaGExLlRvb2xDYWxsSAASMAoLdG9vbF9yZXN1bHQYByABKAsyGS5waXJjLnYxYWxwaGExLlRvb2xSZXN1bHRIABIvCgpjb21wYWN0aW9uGAggASgLMhkucGlyYy52MWFscGhhMS5Db21wYWN0aW9uSAASNgoOYnJhbmNoX3N1bW1hcnkYCSABKAsyHC5waXJjLnYxYWxwaGExLkJyYW5jaFN1bW1hcnlIAEIGCgRib2R5IlUKC1VzZXJNZXNzYWdlEgwKBHRleHQYASABKAkSJAoGaW1hZ2VzGAIgAygLMhQucGlyYy52MWFscGhhMS5JbWFnZRISCgpyZXF1ZXN0X2lkGAMgASgJIuUBChBBc3Npc3RhbnRNZXNzYWdlEhIKCm1lc3NhZ2VfaWQYASABKAkSLAoHY29udGVudBgCIAMoCzIbLnBpcmMudjFhbHBoYTEuQ29udGVudEJsb2NrEiMKBXVzYWdlGAMgASgLMhQucGlyYy52MWFscGhhMS5Vc2FnZRIuCgtzdG9wX3JlYXNvbhgEIAEoDjIZLnBpcmMudjFhbHBoYTEuU3RvcFJlYXNvbhIjCgVtb2RlbBgFIAEoCzIULnBpcmMudjFhbHBoYTEuTW9kZWwSFQoNZXJyb3JfbWVzc2FnZRgGIAEoCSI6CgxDb250ZW50QmxvY2sSDgoEdGV4dBgBIAEoCUgAEhIKCHRoaW5raW5nGAIgASgJSABCBgoEYm9keSJ5CgVVc2FnZRIUCgxpbnB1dF90b2tlbnMYASABKAQSFQoNb3V0cHV0X3Rva2VucxgCIAEoBBIZChFjYWNoZV9yZWFkX3Rva2VucxgDIAEoBBIaChJjYWNoZV93cml0ZV90b2tlbnMYBCABKAQSDAoEY29zdBgFIAEoASJ2Cg5Bc3Npc3RhbnREZWx0YRISCgptZXNzYWdlX2lkGAEgASgJEg8KB3R1cm5faWQYAiABKAkSEwoLYmxvY2tfaW5kZXgYAyABKA0SDgoEdGV4dBgEIAEoCUgAEhIKCHRoaW5raW5nGAUgASgJSABCBgoEYm9keSJLCghUb29sQ2FsbBIUCgx0b29sX2NhbGxfaWQYASABKAkSEQoJdG9vbF9uYW1lGAIgASgJEhYKDmFyZ3VtZW50c19qc29uGAMgASgJIkIKClRvb2xSZXN1bHQSFAoMdG9vbF9jYWxsX2lkGAEgASgJEhAKCGlzX2Vycm9yGAIgASgIEgwKBHRleHQYAyABKAkiQwoMVG9vbFByb2dyZXNzEhQKDHRvb2xfY2FsbF9pZBgBIAEoCRIPCgd0dXJuX2lkGAIgASgJEgwKBHRleHQYAyABKAkiIQoOV29ya2luZ0NoYW5nZWQSDwoHd29ya2luZxgBIAEoCCI0CgpDb21wYWN0aW9uEg8KB3N1bW1hcnkYASABKAkSFQoNdG9rZW5zX2JlZm9yZRgCIAEoBCIgCg1CcmFuY2hTdW1tYXJ5Eg8KB3N1bW1hcnkYASABKAkiIAoNQnJhbmNoQ2hhbmdlZBIPCgdsZWFmX2lkGAEgASgJKrIBCg1TZXNzaW9uT3JpZ2luEh4KGlNFU1NJT05fT1JJR0lOX1VOU1BFQ0lGSUVEEAASGgoWU0VTU0lPTl9PUklHSU5fU1RBUlRVUBABEhYKElNFU1NJT05fT1JJR0lOX05FVxACEhkKFVNFU1NJT05fT1JJR0lOX1JFU1VNRRADEhcKE1NFU1NJT05fT1JJR0lOX0ZPUksQBBIZChVTRVNTSU9OX09SSUdJTl9SRUxPQUQQBSrhAQoNVGhpbmtpbmdMZXZlbBIeChpUSElOS0lOR19MRVZFTF9VTlNQRUNJRklFRBAAEhYKElRISU5LSU5HX0xFVkVMX09GRhABEhoKFlRISU5LSU5HX0xFVkVMX01JTklNQUwQAhIWChJUSElOS0lOR19MRVZFTF9MT1cQAxIZChVUSElOS0lOR19MRVZFTF9NRURJVU0QBBIXChNUSElOS0lOR19MRVZFTF9ISUdIEAUSGAoUVEhJTktJTkdfTEVWRUxfWEhJR0gQBhIWChJUSElOS0lOR19MRVZFTF9NQVgQByqCAQoNQ29tbWFuZFNvdXJjZRIeChpDT01NQU5EX1NPVVJDRV9VTlNQRUNJRklFRBAAEhwKGENPTU1BTkRfU09VUkNFX0VYVEVOU0lPThABEhkKFUNPTU1BTkRfU09VUkNFX1BST01QVBACEhgKFENPTU1BTkRfU09VUkNFX1NLSUxMEAMqUAoIRGVsaXZlcnkSGAoUREVMSVZFUllfVU5TUEVDSUZJRUQQABISCg5ERUxJVkVSWV9TVEVFUhABEhYKEkRFTElWRVJZX0ZPTExPV19VUBACKrsBCgpTdG9wUmVhc29uEhsKF1NUT1BfUkVBU09OX1VOU1BFQ0lGSUVEEAASFAoQU1RPUF9SRUFTT05fU1RPUBABEhYKElNUT1BfUkVBU09OX0xFTkdUSBACEhgKFFNUT1BfUkVBU09OX1RPT0xfVVNFEAMSFwoTU1RPUF9SRUFTT05fQUJPUlRFRBAEEhUKEVNUT1BfUkVBU09OX0VSUk9SEAUSGAoUU1RPUF9SRUFTT05fREVGRVJSRUQQBkKtAQoRY29tLnBpcmMudjFhbHBoYTFCDFNlc3Npb25Qcm90b1ABWjVwaXJjLmRldi9yZWxheS9pbnRlcm5hbC9wYi9waXJjL3YxYWxwaGExO3BpcmN2MWFscGhhMaICA1BYWKoCDVBpcmMuVjFhbHBoYTHKAg1QaXJjXFYxYWxwaGEx4gIZUGlyY1xWMWFscGhhMVxHUEJNZXRhZGF0YeoCDlBpcmM6OlYxYWxwaGExYgZwcm90bzM", [file_google_protobuf_timestamp, file_pirc_v1alpha1_common]); +var file_pirc_v1alpha1_session = /* @__PURE__ */ fileDesc("ChtwaXJjL3YxYWxwaGExL3Nlc3Npb24ucHJvdG8SDXBpcmMudjFhbHBoYTEiigQKE1Nlc3Npb25Bbm5vdW5jZW1lbnQSDAoEbmFtZRgBIAEoCRILCgNjd2QYAiABKAkSEAoIaG9zdG5hbWUYAyABKAkSIwoFbW9kZWwYBCABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsEjQKDnRoaW5raW5nX2xldmVsGAUgASgOMhwucGlyYy52MWFscGhhMS5UaGlua2luZ0xldmVsEg8KB3dvcmtpbmcYBiABKAgSLgoKc3RhcnRlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASGwoTcmVwbGFjZXNfc2Vzc2lvbl9pZBgIIAEoCRIsCgZvcmlnaW4YCSABKA4yHC5waXJjLnYxYWxwaGExLlNlc3Npb25PcmlnaW4SEgoKcGlfdmVyc2lvbhgKIAEoCRIZChFleHRlbnNpb25fdmVyc2lvbhgLIAEoCRISCgpjb21wYWN0aW5nGAwgASgIEiMKBXBsYWNlGA0gASgLMhQucGlyYy52MWFscGhhMS5QbGFjZRIUCgxmaXJzdF9wcm9tcHQYDiABKAkSEAoIcmVxdWVzdHMYDyADKAkSEAoIbGF1bmNoZXIYECABKAkSEQoJbGF1bmNoX2lkGBEgASgJEioKCXF1ZXN0aW9ucxgSIAMoCzIXLnBpcmMudjFhbHBoYTEuUXVlc3Rpb24iyQEKCFF1ZXN0aW9uEgoKAmlkGAEgASgJEikKBGtpbmQYAiABKA4yGy5waXJjLnYxYWxwaGExLlF1ZXN0aW9uS2luZBINCgV0aXRsZRgDIAEoCRIPCgdtZXNzYWdlGAQgASgJEg8KB29wdGlvbnMYBSADKAkSEwoLcGxhY2Vob2xkZXIYBiABKAkSEgoKYW5zd2VyYWJsZRgHIAEoCBIsCghhc2tlZF9hdBgIIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAirQEKBVBsYWNlEgwKBGtpbmQYASABKAkSDQoFZ3JvdXAYAiABKAkSGQoMZ3JvdXBfbnVtYmVyGAMgASgNSACIAQESDgoGd2luZG93GAQgASgJEhoKDXdpbmRvd19udW1iZXIYBSABKA1IAYgBARIMCgRwYW5lGAYgASgJEg8KB2Rpc3BsYXkYByABKAlCDwoNX2dyb3VwX251bWJlckIQCg5fd2luZG93X251bWJlciIzCgVNb2RlbBIQCghwcm92aWRlchgBIAEoCRIKCgJpZBgCIAEoCRIMCgRuYW1lGAMgASgJIoQLCg5TZXNzaW9uTWVzc2FnZRISCgpyZXF1ZXN0X2lkGDIgASgJEicKBnByb21wdBgBIAEoCzIVLnBpcmMudjFhbHBoYTEuUHJvbXB0SAASJQoFYWJvcnQYAiABKAsyFC5waXJjLnYxYWxwaGExLkFib3J0SAASOAoPaGlzdG9yeV9yZXF1ZXN0GAMgASgLMh0ucGlyYy52MWFscGhhMS5IaXN0b3J5UmVxdWVzdEgAEjAKC2xpc3RfbW9kZWxzGAQgASgLMhkucGlyYy52MWFscGhhMS5MaXN0TW9kZWxzSAASLAoJc2V0X21vZGVsGAUgASgLMhcucGlyYy52MWFscGhhMS5TZXRNb2RlbEgAEj0KEnNldF90aGlua2luZ19sZXZlbBgGIAEoCzIfLnBpcmMudjFhbHBoYTEuU2V0VGhpbmtpbmdMZXZlbEgAEikKB2NvbXBhY3QYByABKAsyFi5waXJjLnYxYWxwaGExLkNvbXBhY3RIABIwCgtuZXdfc2Vzc2lvbhgIIAEoCzIZLnBpcmMudjFhbHBoYTEuTmV3U2Vzc2lvbkgAEicKBnJlbmFtZRgJIAEoCzIVLnBpcmMudjFhbHBoYTEuUmVuYW1lSAASNAoNc3RhdHNfcmVxdWVzdBgRIAEoCzIbLnBpcmMudjFhbHBoYTEuU3RhdHNSZXF1ZXN0SAASNAoNbGlzdF9jb21tYW5kcxgSIAEoCzIbLnBpcmMudjFhbHBoYTEuTGlzdENvbW1hbmRzSAASIwoEZm9yaxgTIAEoCzITLnBpcmMudjFhbHBoYTEuRm9ya0gAEiUKBWNsb25lGBQgASgLMhQucGlyYy52MWFscGhhMS5DbG9uZUgAEj0KEmxpc3RfcGFzdF9zZXNzaW9ucxgVIAEoCzIfLnBpcmMudjFhbHBoYTEuTGlzdFBhc3RTZXNzaW9uc0gAEicKBnJlc3VtZRgWIAEoCzIVLnBpcmMudjFhbHBoYTEuUmVzdW1lSAASJwoGcmVsb2FkGBggASgLMhUucGlyYy52MWFscGhhMS5SZWxvYWRIABI0Cg1uYXZpZ2F0ZV90cmVlGBkgASgLMhsucGlyYy52MWFscGhhMS5OYXZpZ2F0ZVRyZWVIABIsCglsaXN0X3RyZWUYGiABKAsyFy5waXJjLnYxYWxwaGExLkxpc3RUcmVlSAASIwoEc3RvcBgcIAEoCzITLnBpcmMudjFhbHBoYTEuU3RvcEgAEicKBmxhdW5jaBgdIAEoCzIVLnBpcmMudjFhbHBoYTEuTGF1bmNoSAASJwoGYW5zd2VyGB4gASgLMhUucGlyYy52MWFscGhhMS5BbnN3ZXJIABIsCgVldmVudBgKIAEoCzIbLnBpcmMudjFhbHBoYTEuU2Vzc2lvbkV2ZW50SAASKQoHaGlzdG9yeRgLIAEoCzIWLnBpcmMudjFhbHBoYTEuSGlzdG9yeUgAEisKCGFjY2VwdGVkGAwgASgLMhcucGlyYy52MWFscGhhMS5BY2NlcHRlZEgAEiUKBWVycm9yGA0gASgLMhQucGlyYy52MWFscGhhMS5FcnJvckgAEicKBm1vZGVscxgOIAEoCzIVLnBpcmMudjFhbHBoYTEuTW9kZWxzSAASJQoFc3RhdHMYDyABKAsyFC5waXJjLnYxYWxwaGExLlN0YXRzSAASKwoIY29tbWFuZHMYECABKAsyFy5waXJjLnYxYWxwaGExLkNvbW1hbmRzSAASNAoNcGFzdF9zZXNzaW9ucxgXIAEoCzIbLnBpcmMudjFhbHBoYTEuUGFzdFNlc3Npb25zSAASIwoEdHJlZRgbIAEoCzITLnBpcmMudjFhbHBoYTEuVHJlZUgAQgYKBGJvZHkiIAoKTGlzdE1vZGVscxISCgpyZXF1ZXN0X2lkGAEgASgJInEKBk1vZGVscxISCgpyZXF1ZXN0X2lkGAEgASgJEigKBm1vZGVscxgCIAMoCzIYLnBpcmMudjFhbHBoYTEuTW9kZWxJbmZvEikKB2N1cnJlbnQYAyABKAsyGC5waXJjLnYxYWxwaGExLk1vZGVsSW5mbyJrCglNb2RlbEluZm8SIwoFbW9kZWwYASABKAsyFC5waXJjLnYxYWxwaGExLk1vZGVsEhEKCXJlYXNvbmluZxgCIAEoCBIWCg5jb250ZXh0X3dpbmRvdxgDIAEoBBIOCgZpbWFnZXMYBCABKAgiQwoIU2V0TW9kZWwSEgoKcmVxdWVzdF9pZBgBIAEoCRIjCgVtb2RlbBgCIAEoCzIULnBpcmMudjFhbHBoYTEuTW9kZWwiUwoQU2V0VGhpbmtpbmdMZXZlbBISCgpyZXF1ZXN0X2lkGAEgASgJEisKBWxldmVsGAIgASgOMhwucGlyYy52MWFscGhhMS5UaGlua2luZ0xldmVsIjMKB0NvbXBhY3QSEgoKcmVxdWVzdF9pZBgBIAEoCRIUCgxpbnN0cnVjdGlvbnMYAiABKAkiIAoKTmV3U2Vzc2lvbhISCgpyZXF1ZXN0X2lkGAEgASgJIiwKBEZvcmsSEgoKcmVxdWVzdF9pZBgBIAEoCRIQCghlbnRyeV9pZBgCIAEoCSIbCgVDbG9uZRISCgpyZXF1ZXN0X2lkGAEgASgJIjsKEExpc3RQYXN0U2Vzc2lvbnMSEgoKcmVxdWVzdF9pZBgBIAEoCRITCgthbGxfZm9sZGVycxgCIAEoCCJjCgxQYXN0U2Vzc2lvbnMSEgoKcmVxdWVzdF9pZBgBIAEoCRIsCghzZXNzaW9ucxgCIAMoCzIaLnBpcmMudjFhbHBoYTEuUGFzdFNlc3Npb24SEQoJdHJ1bmNhdGVkGAMgASgIItgBCgtQYXN0U2Vzc2lvbhIMCgRwYXRoGAEgASgJEhIKCnNlc3Npb25faWQYAiABKAkSCwoDY3dkGAMgASgJEgwKBG5hbWUYBCABKAkSFAoMZmlyc3RfcHJvbXB0GAUgASgJEi4KCmNyZWF0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC21vZGlmaWVkX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIVCg1tZXNzYWdlX2NvdW50GAggASgNIioKBlJlc3VtZRISCgpyZXF1ZXN0X2lkGAEgASgJEgwKBHBhdGgYAiABKAkiHAoGUmVsb2FkEhIKCnJlcXVlc3RfaWQYASABKAkiGgoEU3RvcBISCgpyZXF1ZXN0X2lkGAEgASgJIjcKBkxhdW5jaBISCgpyZXF1ZXN0X2lkGAEgASgJEgsKA2N3ZBgCIAEoCRIMCgRuYW1lGAMgASgJIoYBCgZBbnN3ZXISEgoKcmVxdWVzdF9pZBgBIAEoCRITCgtxdWVzdGlvbl9pZBgCIAEoCRIQCgZvcHRpb24YAyABKA1IABITCgljb25maXJtZWQYBCABKAhIABIOCgR0ZXh0GAUgASgJSAASEwoJZGlzbWlzc2VkGAYgASgISABCBwoFdmFsdWUiRwoMTmF2aWdhdGVUcmVlEhIKCnJlcXVlc3RfaWQYASABKAkSEAoIZW50cnlfaWQYAiABKAkSEQoJc3VtbWFyaXplGAMgASgIIh4KCExpc3RUcmVlEhIKCnJlcXVlc3RfaWQYASABKAkiVgoEVHJlZRISCgpyZXF1ZXN0X2lkGAEgASgJEicKCGJyYW5jaGVzGAIgAygLMhUucGlyYy52MWFscGhhMS5CcmFuY2gSEQoJdHJ1bmNhdGVkGAMgASgIIpABCgZCcmFuY2gSDwoHbGVhZl9pZBgBIAEoCRIPCgdjdXJyZW50GAIgASgIEg4KBnByb21wdBgDIAEoCRIMCgRsYXN0GAQgASgJEi8KC21vZGlmaWVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIVCg1tZXNzYWdlX2NvdW50GAYgASgNIioKBlJlbmFtZRISCgpyZXF1ZXN0X2lkGAEgASgJEgwKBG5hbWUYAiABKAkiIgoMU3RhdHNSZXF1ZXN0EhIKCnJlcXVlc3RfaWQYASABKAkiiAEKBVN0YXRzEhIKCnJlcXVlc3RfaWQYASABKAkSIwoFdG90YWwYAiABKAsyFC5waXJjLnYxYWxwaGExLlVzYWdlEhsKDmNvbnRleHRfdG9rZW5zGAMgASgESACIAQESFgoOY29udGV4dF93aW5kb3cYBCABKARCEQoPX2NvbnRleHRfdG9rZW5zIiIKDExpc3RDb21tYW5kcxISCgpyZXF1ZXN0X2lkGAEgASgJIkwKCENvbW1hbmRzEhIKCnJlcXVlc3RfaWQYASABKAkSLAoIY29tbWFuZHMYAiADKAsyGi5waXJjLnYxYWxwaGExLkNvbW1hbmRJbmZvIl4KC0NvbW1hbmRJbmZvEgwKBG5hbWUYASABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkSLAoGc291cmNlGAMgASgOMhwucGlyYy52MWFscGhhMS5Db21tYW5kU291cmNlInsKBlByb21wdBISCgpyZXF1ZXN0X2lkGAEgASgJEgwKBHRleHQYAiABKAkSJAoGaW1hZ2VzGAMgAygLMhQucGlyYy52MWFscGhhMS5JbWFnZRIpCghkZWxpdmVyeRgEIAEoDjIXLnBpcmMudjFhbHBoYTEuRGVsaXZlcnkiKAoFSW1hZ2USEQoJbWltZV90eXBlGAEgASgJEgwKBGRhdGEYAiABKAwiGwoFQWJvcnQSEgoKcmVxdWVzdF9pZBgBIAEoCSIzCg5IaXN0b3J5UmVxdWVzdBISCgpyZXF1ZXN0X2lkGAEgASgJEg0KBWxpbWl0GAIgASgNIm0KB0hpc3RvcnkSEgoKcmVxdWVzdF9pZBgBIAEoCRIuCgVpdGVtcxgCIAMoCzIfLnBpcmMudjFhbHBoYTEuQ29udmVyc2F0aW9uSXRlbRILCgNzZXEYAyABKAQSEQoJdHJ1bmNhdGVkGAQgASgIIh4KCEFjY2VwdGVkEhIKCnJlcXVlc3RfaWQYASABKAkimgMKDFNlc3Npb25FdmVudBILCgNzZXEYASABKAQSJgoCYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KBGl0ZW0YAyABKAsyHy5waXJjLnYxYWxwaGExLkNvbnZlcnNhdGlvbkl0ZW1IABI4Cg9hc3Npc3RhbnRfZGVsdGEYBCABKAsyHS5waXJjLnYxYWxwaGExLkFzc2lzdGFudERlbHRhSAASNAoNdG9vbF9wcm9ncmVzcxgFIAEoCzIbLnBpcmMudjFhbHBoYTEuVG9vbFByb2dyZXNzSAASOAoPd29ya2luZ19jaGFuZ2VkGAYgASgLMh0ucGlyYy52MWFscGhhMS5Xb3JraW5nQ2hhbmdlZEgAEjoKDGFubm91bmNlbWVudBgHIAEoCzIiLnBpcmMudjFhbHBoYTEuU2Vzc2lvbkFubm91bmNlbWVudEgAEjYKDmJyYW5jaF9jaGFuZ2VkGAggASgLMhwucGlyYy52MWFscGhhMS5CcmFuY2hDaGFuZ2VkSABCBgoEYm9keSKgAwoQQ29udmVyc2F0aW9uSXRlbRIQCghlbnRyeV9pZBgBIAEoCRIPCgd0dXJuX2lkGAIgASgJEiYKAmF0GAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIyCgx1c2VyX21lc3NhZ2UYBCABKAsyGi5waXJjLnYxYWxwaGExLlVzZXJNZXNzYWdlSAASPAoRYXNzaXN0YW50X21lc3NhZ2UYBSABKAsyHy5waXJjLnYxYWxwaGExLkFzc2lzdGFudE1lc3NhZ2VIABIsCgl0b29sX2NhbGwYBiABKAsyFy5waXJjLnYxYWxwaGExLlRvb2xDYWxsSAASMAoLdG9vbF9yZXN1bHQYByABKAsyGS5waXJjLnYxYWxwaGExLlRvb2xSZXN1bHRIABIvCgpjb21wYWN0aW9uGAggASgLMhkucGlyYy52MWFscGhhMS5Db21wYWN0aW9uSAASNgoOYnJhbmNoX3N1bW1hcnkYCSABKAsyHC5waXJjLnYxYWxwaGExLkJyYW5jaFN1bW1hcnlIAEIGCgRib2R5IlUKC1VzZXJNZXNzYWdlEgwKBHRleHQYASABKAkSJAoGaW1hZ2VzGAIgAygLMhQucGlyYy52MWFscGhhMS5JbWFnZRISCgpyZXF1ZXN0X2lkGAMgASgJIuUBChBBc3Npc3RhbnRNZXNzYWdlEhIKCm1lc3NhZ2VfaWQYASABKAkSLAoHY29udGVudBgCIAMoCzIbLnBpcmMudjFhbHBoYTEuQ29udGVudEJsb2NrEiMKBXVzYWdlGAMgASgLMhQucGlyYy52MWFscGhhMS5Vc2FnZRIuCgtzdG9wX3JlYXNvbhgEIAEoDjIZLnBpcmMudjFhbHBoYTEuU3RvcFJlYXNvbhIjCgVtb2RlbBgFIAEoCzIULnBpcmMudjFhbHBoYTEuTW9kZWwSFQoNZXJyb3JfbWVzc2FnZRgGIAEoCSI6CgxDb250ZW50QmxvY2sSDgoEdGV4dBgBIAEoCUgAEhIKCHRoaW5raW5nGAIgASgJSABCBgoEYm9keSJ5CgVVc2FnZRIUCgxpbnB1dF90b2tlbnMYASABKAQSFQoNb3V0cHV0X3Rva2VucxgCIAEoBBIZChFjYWNoZV9yZWFkX3Rva2VucxgDIAEoBBIaChJjYWNoZV93cml0ZV90b2tlbnMYBCABKAQSDAoEY29zdBgFIAEoASJ2Cg5Bc3Npc3RhbnREZWx0YRISCgptZXNzYWdlX2lkGAEgASgJEg8KB3R1cm5faWQYAiABKAkSEwoLYmxvY2tfaW5kZXgYAyABKA0SDgoEdGV4dBgEIAEoCUgAEhIKCHRoaW5raW5nGAUgASgJSABCBgoEYm9keSJLCghUb29sQ2FsbBIUCgx0b29sX2NhbGxfaWQYASABKAkSEQoJdG9vbF9uYW1lGAIgASgJEhYKDmFyZ3VtZW50c19qc29uGAMgASgJIkIKClRvb2xSZXN1bHQSFAoMdG9vbF9jYWxsX2lkGAEgASgJEhAKCGlzX2Vycm9yGAIgASgIEgwKBHRleHQYAyABKAkiQwoMVG9vbFByb2dyZXNzEhQKDHRvb2xfY2FsbF9pZBgBIAEoCRIPCgd0dXJuX2lkGAIgASgJEgwKBHRleHQYAyABKAkiIQoOV29ya2luZ0NoYW5nZWQSDwoHd29ya2luZxgBIAEoCCI0CgpDb21wYWN0aW9uEg8KB3N1bW1hcnkYASABKAkSFQoNdG9rZW5zX2JlZm9yZRgCIAEoBCIgCg1CcmFuY2hTdW1tYXJ5Eg8KB3N1bW1hcnkYASABKAkiIAoNQnJhbmNoQ2hhbmdlZBIPCgdsZWFmX2lkGAEgASgJKq8BCgxRdWVzdGlvbktpbmQSHQoZUVVFU1RJT05fS0lORF9VTlNQRUNJRklFRBAAEhgKFFFVRVNUSU9OX0tJTkRfU0VMRUNUEAESGQoVUVVFU1RJT05fS0lORF9DT05GSVJNEAISFwoTUVVFU1RJT05fS0lORF9JTlBVVBADEhgKFFFVRVNUSU9OX0tJTkRfRURJVE9SEAQSGAoUUVVFU1RJT05fS0lORF9DVVNUT00QBSqyAQoNU2Vzc2lvbk9yaWdpbhIeChpTRVNTSU9OX09SSUdJTl9VTlNQRUNJRklFRBAAEhoKFlNFU1NJT05fT1JJR0lOX1NUQVJUVVAQARIWChJTRVNTSU9OX09SSUdJTl9ORVcQAhIZChVTRVNTSU9OX09SSUdJTl9SRVNVTUUQAxIXChNTRVNTSU9OX09SSUdJTl9GT1JLEAQSGQoVU0VTU0lPTl9PUklHSU5fUkVMT0FEEAUq4QEKDVRoaW5raW5nTGV2ZWwSHgoaVEhJTktJTkdfTEVWRUxfVU5TUEVDSUZJRUQQABIWChJUSElOS0lOR19MRVZFTF9PRkYQARIaChZUSElOS0lOR19MRVZFTF9NSU5JTUFMEAISFgoSVEhJTktJTkdfTEVWRUxfTE9XEAMSGQoVVEhJTktJTkdfTEVWRUxfTUVESVVNEAQSFwoTVEhJTktJTkdfTEVWRUxfSElHSBAFEhgKFFRISU5LSU5HX0xFVkVMX1hISUdIEAYSFgoSVEhJTktJTkdfTEVWRUxfTUFYEAcqggEKDUNvbW1hbmRTb3VyY2USHgoaQ09NTUFORF9TT1VSQ0VfVU5TUEVDSUZJRUQQABIcChhDT01NQU5EX1NPVVJDRV9FWFRFTlNJT04QARIZChVDT01NQU5EX1NPVVJDRV9QUk9NUFQQAhIYChRDT01NQU5EX1NPVVJDRV9TS0lMTBADKlAKCERlbGl2ZXJ5EhgKFERFTElWRVJZX1VOU1BFQ0lGSUVEEAASEgoOREVMSVZFUllfU1RFRVIQARIWChJERUxJVkVSWV9GT0xMT1dfVVAQAiq7AQoKU3RvcFJlYXNvbhIbChdTVE9QX1JFQVNPTl9VTlNQRUNJRklFRBAAEhQKEFNUT1BfUkVBU09OX1NUT1AQARIWChJTVE9QX1JFQVNPTl9MRU5HVEgQAhIYChRTVE9QX1JFQVNPTl9UT09MX1VTRRADEhcKE1NUT1BfUkVBU09OX0FCT1JURUQQBBIVChFTVE9QX1JFQVNPTl9FUlJPUhAFEhgKFFNUT1BfUkVBU09OX0RFRkVSUkVEEAZCrQEKEWNvbS5waXJjLnYxYWxwaGExQgxTZXNzaW9uUHJvdG9QAVo1cGlyYy5kZXYvcmVsYXkvaW50ZXJuYWwvcGIvcGlyYy92MWFscGhhMTtwaXJjdjFhbHBoYTGiAgNQWFiqAg1QaXJjLlYxYWxwaGExygINUGlyY1xWMWFscGhhMeICGVBpcmNcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAg5QaXJjOjpWMWFscGhhMWIGcHJvdG8z", [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, 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); +var QuestionSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 1); +var PlaceSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 2); +var ModelSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 3); +var SessionMessageSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 4); +var ModelInfoSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 7); +var BranchSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 25); +var ImageSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 33); +var HistorySchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 36); +var ConversationItemSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 39); +var ContentBlockSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 42); +var UsageSchema = /* @__PURE__ */ messageDesc(file_pirc_v1alpha1_session, 43); // protocol/helpers.ts function errorReply(requestId, code, message) { @@ -8116,6 +8117,7 @@ var REQUESTS = { rename: "change", stop: "change", launch: "change", + answer: "change", historyRequest: "question", listModels: "question", statsRequest: "question", @@ -8285,7 +8287,8 @@ var Live = class { firstPrompt: this.firstPrompt, requests: Object.keys(REQUESTS).map(requestName), launcher: this.sink.launcher()?.name ?? "", - launchId: this.sink.launchId + launchId: this.sink.launchId, + questions: this.sink.questions() }); } announcementBytes() { @@ -8505,11 +8508,21 @@ var Live = class { this.onAnnouncementChanged(); } onCompactEnd() { - for (const u of this.unconfirmed) this.armConfirm(u); + if (!this.sink.questions().length) for (const u of this.unconfirmed) this.armConfirm(u); if (!this.compacting) return; this.compacting = false; this.onAnnouncementChanged(); } + // A question an extension asks before a prompt's run (in + // before_agent_start, say) holds the run up: the prompt's deadline waits + // while one is asked. + onQuestionsChanged() { + const asking = this.sink.questions().length > 0; + for (const u of this.unconfirmed) { + if (asking) clearTimeout(u.timer); + else if (!this.compacting) this.armConfirm(u); + } + } onCompact(entry) { this.catchUp(); this.emitItem(compactionItem(entry, this.turnId)); @@ -8621,7 +8634,7 @@ var Live = class { if (command || !idle) return respond(accepted(requestId)); const u = { requestId, text, respond, timer: void 0 }; this.unconfirmed.push(u); - if (!this.compacting) this.armConfirm(u); + if (!this.compacting && !this.sink.questions().length) this.armConfirm(u); return; } case "abort": @@ -8747,6 +8760,11 @@ var Live = class { 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), name: launchName(body.value.name) }), respond, () => respond(accepted(requestId))); } + case "answer": { + const { requestId } = body.value; + const why = this.sink.answer(body.value); + return respond(why ? errorReply(requestId, 4 /* INVALID */, why) : accepted(requestId)); + } case "statsRequest": { const usage = this.ctx.getContextUsage(); return respond(create(SessionMessageSchema, { @@ -8820,6 +8838,136 @@ function withRequestId(m, requestId) { return m; } +// extension/src/questions.ts +import { randomBytes as randomBytes3 } from "node:crypto"; +var TEXT_MAX = 2e3; +var OPTION_MAX = 500; +var OPTIONS_MAX = 200; +var ORIGINALS = /* @__PURE__ */ Symbol.for("pirc.questions.originals"); +var clip2 = (s, n) => s.length > n ? `${s.slice(0, n - 1)}\u2026` : s; +var Questions = class { + constructor(onChange) { + this.onChange = onChange; + } + onChange; + pending = []; + // Why wrapping failed, if it did. + problem = ""; + // The questions now, oldest first. + list() { + return this.pending.map((p) => p.question); + } + // Wraps pi's ui object, if not already this extension's; again after a + // newer load, or when pi makes a new one. + install(ui, current) { + try { + const u = ui; + const orig = u[ORIGINALS] ?? { select: u.select, confirm: u.confirm, input: u.input, editor: u.editor, custom: u.custom }; + if (u[ORIGINALS] && u.select.pirc === this) return; + Object.defineProperty(u, ORIGINALS, { value: orig, configurable: true }); + const select = (title, options, opts) => current().ask({ kind: 1 /* SELECT */, title, options }, opts, (o) => orig.select.call(ui, title, options, o)); + select.pirc = this; + u.select = select; + u.confirm = (title, message, opts) => current().ask({ kind: 2 /* CONFIRM */, title, message }, opts, (o) => orig.confirm.call(ui, title, message, o)); + u.input = (title, placeholder, opts) => current().ask({ kind: 3 /* INPUT */, title, placeholder }, opts, (o) => orig.input.call(ui, title, placeholder, o)); + u.editor = (title, prefill) => current().show({ kind: 4 /* EDITOR */, title }, () => orig.editor.call(ui, title, prefill)); + u.custom = ((factory, options) => current().show({ kind: 5 /* CUSTOM */, title: "" }, () => orig.custom.call(ui, factory, options))); + if (u.select !== select) throw new Error("pi's ui object cannot be changed"); + this.problem = ""; + } catch (e) { + this.problem = `questions cannot be answered from clients: ${e.message}`; + } + } + add(q, answerable) { + const options = q.options ?? []; + const fits = options.length <= OPTIONS_MAX; + const p = { + question: create(QuestionSchema, { + id: randomBytes3(8).toString("hex"), + kind: q.kind, + title: clip2(q.title ?? "", TEXT_MAX), + message: clip2(q.message ?? "", TEXT_MAX), + options: fits ? options.map((o) => clip2(String(o), OPTION_MAX)) : [], + placeholder: clip2(q.placeholder ?? "", TEXT_MAX), + answerable: answerable && fits, + askedAt: atMs(Date.now()) + }), + ...q.options ? { options: q.options } : {} + }; + this.pending.push(p); + this.changed(); + return p; + } + remove(p) { + const i = this.pending.indexOf(p); + if (i < 0) return; + this.pending.splice(i, 1); + this.changed(); + } + changed() { + try { + this.onChange(); + } catch { + } + } + // Asked in the terminal and of clients; the first answer wins, and a + // client's closes the terminal's dialog. + ask(q, opts, run2) { + const closing = new AbortController(); + const given = opts?.signal; + if (given?.aborted) closing.abort(); + given?.addEventListener("abort", () => closing.abort(), { once: true }); + const p = this.add(q, true); + return new Promise((resolve, reject) => { + let settled = false; + const settle = (f) => { + if (settled) return; + settled = true; + this.remove(p); + f(); + }; + p.answer = (value) => { + settle(() => resolve(value)); + closing.abort(); + }; + run2({ ...opts, signal: closing.signal }).then((v) => settle(() => resolve(v)), (e) => settle(() => reject(e))); + }); + } + // Shown to clients until the terminal answers it. + show(q, run2) { + const p = this.add(q, false); + return run2().finally(() => this.remove(p)); + } + // A client's answer: why it cannot be taken, or undefined once given. + answer(a) { + const p = this.pending.find((x) => x.question.id === a.questionId); + if (!p) return "that question is no longer asked"; + if (!p.question.answerable || !p.answer) return "that question can be answered only in pi's terminal"; + const v = a.value; + if (v.case === "dismissed") { + p.answer(p.question.kind === 2 /* CONFIRM */ ? false : void 0); + return void 0; + } + switch (p.question.kind) { + case 1 /* SELECT */: { + if (v.case !== "option" || v.value >= (p.options?.length ?? 0)) return "a select is answered with one of its options"; + p.answer(p.options[v.value]); + return void 0; + } + case 2 /* CONFIRM */: + if (v.case !== "confirmed") return "a confirm is answered yes or no"; + p.answer(v.value); + return void 0; + case 3 /* INPUT */: + if (v.case !== "text") return "an input is answered with text"; + p.answer(v.value); + return void 0; + default: + return "that question can be answered only in pi's terminal"; + } + } +}; + // extension/src/host.ts var isChange = (c) => c !== void 0 && Object.hasOwn(REQUESTS, c) && REQUESTS[c] === "change"; var IDEMPOTENCY_ENTRIES = 1e3; @@ -8862,6 +9010,11 @@ var Host = class _Host { launchers = new LauncherChoice(() => { if (this.state.kind === "ready") this.live?.onAnnouncementChanged(); }); + // The dialogs pi is showing for extensions, asked of clients too. + dialogs = new Questions(() => { + this.live?.onQuestionsChanged(); + 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). @@ -9043,6 +9196,7 @@ var Host = class _Host { } if ("reason" in this.state) lines.push(`relay said: ${this.state.reason}`); if (this.live) lines.push(`session ${this.live.sessionId}, instance ${this.instanceId}`); + if (this.dialogs.problem) lines.push(this.dialogs.problem); if (this.lastError) lines.push(`last error: ${this.lastError}`); if (!c?.relay) lines.push("enrol with: /pirc enrol [token]; without a token, approve this key in the web app or with pirc-relay approve"); return lines.join("\n"); @@ -9086,6 +9240,12 @@ var Host = class _Host { launcher() { return this.launchers.current; } + questions() { + return this.dialogs.list(); + } + answer(a) { + return this.dialogs.answer(a); + } maxPayloadBytes() { return this.state.kind === "ready" ? this.state.maxFrameBytes - 512 : 1 << 20; } @@ -9149,7 +9309,7 @@ var Host = class _Host { }; // extension/src/index.ts -var EXTENSION_VERSION = true ? "0.1.9-dev+46bb48bfe5b3" : "dev"; +var EXTENSION_VERSION = true ? "0.1.9-dev+d581157e4c48" : "dev"; function piVersion() { try { let dir = dirname3(realpathSync(process.argv[1])); @@ -9164,11 +9324,11 @@ function piVersion() { } return "unknown"; } -var LOAD = true ? "0.1.9-dev+46bb48bfe5b3" : `dev ${randomBytes3(4).toString("hex")}`; +var LOAD = true ? "0.1.9-dev+d581157e4c48" : `dev ${randomBytes4(4).toString("hex")}`; var KEY = /* @__PURE__ */ Symbol.for("pirc.extension"); var proc = globalThis[KEY] ??= {}; if (!proc.host || proc.load !== LOAD) { - proc.host = Host.succeeding(proc.host, randomBytes3(8).toString("hex"), { pi: piVersion(), extension: EXTENSION_VERSION }); + proc.host = Host.succeeding(proc.host, randomBytes4(8).toString("hex"), { pi: piVersion(), extension: EXTENSION_VERSION }); proc.load = LOAD; } var USAGE = "usage: /pirc [status | enrol [token] | reconnect]"; @@ -9187,6 +9347,7 @@ function index_default(pi) { if (ctx.mode !== "tui") return; active = true; try { + proc.host.dialogs.install(ctx.ui, () => proc.host.dialogs); proc.host.bind(pi, ctx, e); } catch (err) { proc.host.fail("session_start", err); @@ -9206,6 +9367,7 @@ function index_default(pi) { pi.on("tool_execution_update", on("tool_execution_update", (live, e) => live.onToolUpdate(e))); pi.on("tool_execution_end", on("tool_execution_end", (live, e) => live.onToolEnd(e.toolCallId))); pi.on("agent_start", on("agent_start", (live) => { + proc.host.dialogs.install(live.ctx.ui, () => proc.host.dialogs); live.onWorking(true); void proc.host.places.refresh(); })); -- cgit v1.2.3