@ashx-j/lunr 0.2.23 → 0.2.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -1
- package/README.md +10 -10
- package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.js +2 -2
- package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
- package/dist/builtin-extensions/lunr-plan-tools.d.ts +7 -7
- package/dist/builtin-extensions/lunr-plan-tools.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-plan-tools.js +12 -12
- package/dist/builtin-extensions/lunr-plan-tools.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.js +2 -0
- package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.js +1 -0
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +4 -4
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +6 -4
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts +2 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js +6 -3
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js +7 -2
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +4 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +5 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +3 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +19 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +17 -15
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js +3 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +5 -4
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/browser/schema.d.ts +1 -1
- package/dist/core/browser/schema.d.ts.map +1 -1
- package/dist/core/browser/schema.js +1 -1
- package/dist/core/browser/schema.js.map +1 -1
- package/dist/core/catalog-cache-scope.d.ts.map +1 -1
- package/dist/core/catalog-cache-scope.js +3 -1
- package/dist/core/catalog-cache-scope.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +3 -2
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/permissions.d.ts +16 -23
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +66 -141
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/plan-mode.d.ts +10 -12
- package/dist/core/plan-mode.d.ts.map +1 -1
- package/dist/core/plan-mode.js +16 -18
- package/dist/core/plan-mode.js.map +1 -1
- package/dist/core/runtime-bridges.d.ts.map +1 -1
- package/dist/core/runtime-bridges.js +2 -0
- package/dist/core/runtime-bridges.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +13 -6
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +9 -2
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +9 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +40 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +4 -4
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/subagent-permission-inherit.d.ts +6 -10
- package/dist/core/subagent-permission-inherit.d.ts.map +1 -1
- package/dist/core/subagent-permission-inherit.js +14 -14
- package/dist/core/subagent-permission-inherit.js.map +1 -1
- package/dist/core/system-prompt.d.ts +2 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +9 -4
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/gateway/adapters/discord.d.ts.map +1 -1
- package/dist/gateway/adapters/discord.js +3 -8
- package/dist/gateway/adapters/discord.js.map +1 -1
- package/dist/gateway/adapters/telegram.d.ts.map +1 -1
- package/dist/gateway/adapters/telegram.js +7 -0
- package/dist/gateway/adapters/telegram.js.map +1 -1
- package/dist/gateway/agent-bridge.d.ts +4 -1
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js +57 -17
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/approval.d.ts +2 -6
- package/dist/gateway/approval.d.ts.map +1 -1
- package/dist/gateway/approval.js +3 -7
- package/dist/gateway/approval.js.map +1 -1
- package/dist/gateway/buttons.d.ts.map +1 -1
- package/dist/gateway/buttons.js +29 -19
- package/dist/gateway/buttons.js.map +1 -1
- package/dist/gateway/commands.d.ts +2 -0
- package/dist/gateway/commands.d.ts.map +1 -1
- package/dist/gateway/commands.js +39 -18
- package/dist/gateway/commands.js.map +1 -1
- package/dist/gateway/config.d.ts +1 -0
- package/dist/gateway/config.d.ts.map +1 -1
- package/dist/gateway/config.js +2 -0
- package/dist/gateway/config.js.map +1 -1
- package/dist/gateway/cron.d.ts +1 -1
- package/dist/gateway/cron.d.ts.map +1 -1
- package/dist/gateway/cron.js +2 -2
- package/dist/gateway/cron.js.map +1 -1
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +26 -26
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/mobile-commands.d.ts.map +1 -1
- package/dist/gateway/mobile-commands.js +15 -14
- package/dist/gateway/mobile-commands.js.map +1 -1
- package/dist/gateway/presenter.d.ts +12 -1
- package/dist/gateway/presenter.d.ts.map +1 -1
- package/dist/gateway/presenter.js +146 -48
- package/dist/gateway/presenter.js.map +1 -1
- package/dist/gateway/router.d.ts +5 -5
- package/dist/gateway/router.d.ts.map +1 -1
- package/dist/gateway/router.js +96 -42
- package/dist/gateway/router.js.map +1 -1
- package/dist/gateway/service.d.ts.map +1 -1
- package/dist/gateway/service.js +13 -4
- package/dist/gateway/service.js.map +1 -1
- package/dist/gateway/setup.d.ts +5 -0
- package/dist/gateway/setup.d.ts.map +1 -1
- package/dist/gateway/setup.js +98 -42
- package/dist/gateway/setup.js.map +1 -1
- package/dist/gateway/stream.d.ts +6 -5
- package/dist/gateway/stream.d.ts.map +1 -1
- package/dist/gateway/stream.js +24 -11
- package/dist/gateway/stream.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +1 -2
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +23 -3
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-tail.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-tail.js +2 -2
- package/dist/modes/interactive/components/thinking-tail.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +12 -2
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +76 -90
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/node-runtime/{agent-session-services-GZVSOGYR.js → agent-session-services-YXXFCP5J.js} +12 -12
- package/dist/node-runtime/{builtin-extensions-QVCXNQT4.js → builtin-extensions-ZLAX7TUH.js} +3 -3
- package/dist/node-runtime/{chunk-W64JC4E7.js → chunk-2HHLJWGD.js} +3 -87
- package/dist/node-runtime/{chunk-VWCE2HSZ.js → chunk-2HMIRK7W.js} +4 -4
- package/dist/node-runtime/{chunk-XLTL257W.js → chunk-2KIPT4HJ.js} +5 -1
- package/dist/node-runtime/{chunk-RIR5EDDJ.js → chunk-3XPLBUEM.js} +17 -12
- package/dist/node-runtime/{chunk-QAZOULTU.js → chunk-6XL67VVY.js} +40 -6
- package/dist/node-runtime/chunk-7S3T6YEA.js +97 -0
- package/dist/node-runtime/{chunk-R3K2F5GI.js → chunk-B4HP6ZWM.js} +2 -0
- package/dist/node-runtime/{chunk-TQGPP4SC.js → chunk-CDVHZOOK.js} +1 -1
- package/dist/node-runtime/{chunk-YJMMG7C6.js → chunk-DSIKTUPW.js} +1 -1
- package/dist/node-runtime/{chunk-LFZDVKSP.js → chunk-E4D3IGP2.js} +41 -25
- package/dist/node-runtime/{chunk-OFKSVRV7.js → chunk-GYIXXQAO.js} +1 -1
- package/dist/node-runtime/{chunk-BX2RB477.js → chunk-HFVZUPFJ.js} +1 -1
- package/dist/node-runtime/{chunk-AZJHNQKQ.js → chunk-I54LGHWM.js} +1 -1
- package/dist/node-runtime/{chunk-YHQ3NBB3.js → chunk-IJIFHRTB.js} +20 -18
- package/dist/node-runtime/{chunk-GS66LV4M.js → chunk-KJ6DWS3K.js} +4 -4
- package/dist/node-runtime/{chunk-HPUP7E4T.js → chunk-KWIYUUZK.js} +68 -42
- package/dist/node-runtime/{chunk-TVJUOJZJ.js → chunk-LQP3RB67.js} +184 -1527
- package/dist/node-runtime/{chunk-VSELYKWU.js → chunk-LWYIVUGV.js} +2 -1
- package/dist/node-runtime/{chunk-JHYKXIMM.js → chunk-MPKSOJBT.js} +1 -1
- package/dist/node-runtime/{chunk-GMHJCCEN.js → chunk-NRKGMJYU.js} +4 -1
- package/dist/node-runtime/{chunk-CSUZVNYE.js → chunk-OVX6X377.js} +10 -6
- package/dist/node-runtime/{chunk-DD5YWFSJ.js → chunk-QTU6AKNJ.js} +130 -65
- package/dist/node-runtime/{chunk-LLUIPGDR.js → chunk-RC7DMV45.js} +110 -77
- package/dist/node-runtime/{chunk-UWPJL22I.js → chunk-SLVOAQOY.js} +15 -4
- package/dist/node-runtime/{chunk-EKVFP6YF.js → chunk-TORR5XBV.js} +17 -16
- package/dist/node-runtime/{chunk-UP2XBVH5.js → chunk-UOEDI7RP.js} +1 -1
- package/dist/node-runtime/{chunk-DQMGU675.js → chunk-VQFSUJJG.js} +20 -17
- package/dist/node-runtime/{chunk-X3URCYCU.js → chunk-WF7PGWRZ.js} +14 -14
- package/dist/node-runtime/chunk-YCUZEGJG.js +1361 -0
- package/dist/node-runtime/{chunk-5D7LC2ZQ.js → chunk-ZXSGTGJ6.js} +54 -85
- package/dist/node-runtime/cli-runtime.js +1 -1
- package/dist/node-runtime/{command-PDVTBRWA.js → command-6WDOYKS6.js} +5 -5
- package/dist/node-runtime/{commands-KAMO2T6P.js → commands-NZLSOHPE.js} +2 -2
- package/dist/node-runtime/{commands-XDCFGIGW.js → commands-QC6VUZJQ.js} +9 -9
- package/dist/node-runtime/{config-RORQUQFG.js → config-D4QUPAHX.js} +1 -1
- package/dist/node-runtime/{direct-tool-executor-YAVOLDFY.js → direct-tool-executor-77GW4F5P.js} +3 -3
- package/dist/node-runtime/{export-html-KSOIMVPI.js → export-html-VM4J2MNR.js} +1 -1
- package/dist/node-runtime/{gateway-AYWM5DIO.js → gateway-INAYBF4Q.js} +141 -85
- package/dist/node-runtime/index.js +23 -21
- package/dist/node-runtime/{init-X2LIUB2H.js → init-HS6NQXSK.js} +2 -2
- package/dist/node-runtime/{install-cli-3BO4MMQ6.js → install-cli-KL4UDDAD.js} +3 -3
- package/dist/node-runtime/{interactive-mode-4MFRKAHG.js → interactive-mode-Z5M7WYYZ.js} +14 -14
- package/dist/node-runtime/{interactive-view-TUZHCQM3.js → interactive-view-NGFAMHPW.js} +2 -2
- package/dist/node-runtime/{lunr-browser-RYFIIVJN.js → lunr-browser-IR7TL3J7.js} +4 -4
- package/dist/node-runtime/{lunr-cron-YWXEPZMQ.js → lunr-cron-LWIZJM2N.js} +8 -8
- package/dist/node-runtime/main.js +19 -18
- package/dist/node-runtime/{mobile-commands-LVHDAUDP.js → mobile-commands-J7OJEKFO.js} +6 -6
- package/dist/node-runtime/{model-runtime-PLQKAG4B.js → model-runtime-OO5HFLWE.js} +1 -1
- package/dist/node-runtime/{package-manager-cli-6GT3Z3CK.js → package-manager-cli-VYZM5WHN.js} +10 -8
- package/dist/node-runtime/{pi-intercom-HBPK5HSJ.js → pi-intercom-QM53RLTS.js} +2 -0
- package/dist/node-runtime/{pi-mcp-adapter-E6WULBKF.js → pi-mcp-adapter-5UKBZP44.js} +7 -6
- package/dist/node-runtime/{pi-subagents-CDWK2AKY.js → pi-subagents-DNY7EAIG.js} +23 -13
- package/dist/node-runtime/{proxy-modes-OSQCWRBI.js → proxy-modes-LGEUYD7R.js} +3 -3
- package/dist/node-runtime/rpc-entry.js +19 -18
- package/dist/node-runtime/{runtime-bridges-3XUQ46XW.js → runtime-bridges-VRDDR73P.js} +8 -1
- package/dist/node-runtime/{service-ISSP6VHE.js → service-MDQIPQ26.js} +1 -1
- package/dist/node-runtime/{session-handoff-HC7R5E24.js → session-handoff-GWARVEWT.js} +2 -2
- package/dist/node-runtime/{session-manager-CFN4UFM2.js → session-manager-JB5J6XBN.js} +1 -1
- package/dist/node-runtime/{settings-manager-6VEMXRDL.js → settings-manager-J4SPQPDJ.js} +10 -7
- package/dist/node-runtime/setup-CQ2NLVK5.js +214 -0
- package/dist/node-runtime/{subagent-executor-M5VWB3D3.js → subagent-executor-KZZQGAKV.js} +40 -7
- package/dist/node-runtime/{update-cli-UVKJWRRJ.js → update-cli-GTFJC7XK.js} +4 -5
- package/dist/startup/interactive-view.d.ts.map +1 -1
- package/dist/startup/interactive-view.js +5 -1
- package/dist/startup/interactive-view.js.map +1 -1
- package/docs/browser.md +1 -1
- package/docs/features.md +19 -18
- package/docs/index.md +1 -1
- package/docs/keybindings.md +1 -1
- package/docs/providers.md +6 -2
- package/docs/quickstart.md +2 -2
- package/docs/settings.md +1 -1
- package/docs/usage.md +4 -4
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/plan-mode/README.md +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/package.json +4 -4
- package/dist/node-runtime/chunk-LISUTZS3.js +0 -19
- package/dist/node-runtime/setup-5SR2J35A.js +0 -155
|
@@ -5,15 +5,16 @@ import {
|
|
|
5
5
|
InMemorySettingsStorage,
|
|
6
6
|
SKILL_TAG_CHARACTERS,
|
|
7
7
|
SettingsManager,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
import "./chunk-
|
|
8
|
+
bindSubagentCommunicationSetting,
|
|
9
|
+
parseSkillTagCharacter,
|
|
10
|
+
subagentCommunicationEnabled
|
|
11
|
+
} from "./chunk-6XL67VVY.js";
|
|
12
|
+
import "./chunk-UOEDI7RP.js";
|
|
13
|
+
import "./chunk-2HMIRK7W.js";
|
|
13
14
|
import "./chunk-URD2SLIT.js";
|
|
14
15
|
import "./chunk-UJOCPOMX.js";
|
|
15
16
|
import "./chunk-IMLCWLPI.js";
|
|
16
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-B4HP6ZWM.js";
|
|
17
18
|
import "./chunk-FQMM2EZ2.js";
|
|
18
19
|
import "./chunk-Q4Q6D4IY.js";
|
|
19
20
|
import "./chunk-BRJX2PRC.js";
|
|
@@ -23,5 +24,7 @@ export {
|
|
|
23
24
|
InMemorySettingsStorage,
|
|
24
25
|
SKILL_TAG_CHARACTERS,
|
|
25
26
|
SettingsManager,
|
|
26
|
-
|
|
27
|
+
bindSubagentCommunicationSetting,
|
|
28
|
+
parseSkillTagCharacter,
|
|
29
|
+
subagentCommunicationEnabled
|
|
27
30
|
};
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { createRequire as __lunrRequire } from "node:module"; const require = __lunrRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
readSecret
|
|
4
|
+
} from "./chunk-H4K3JDRB.js";
|
|
5
|
+
import {
|
|
6
|
+
createPairingStore
|
|
7
|
+
} from "./chunk-RMQZU2YU.js";
|
|
8
|
+
import {
|
|
9
|
+
configureStartup,
|
|
10
|
+
loadServiceSettings,
|
|
11
|
+
startGatewayService
|
|
12
|
+
} from "./chunk-SLVOAQOY.js";
|
|
13
|
+
import {
|
|
14
|
+
createStartupTui,
|
|
15
|
+
showStartupInput,
|
|
16
|
+
startStartupTui
|
|
17
|
+
} from "./chunk-2HHLJWGD.js";
|
|
18
|
+
import "./chunk-YPHAIRZT.js";
|
|
19
|
+
import "./chunk-LQP3RB67.js";
|
|
20
|
+
import "./chunk-OBMWP3I5.js";
|
|
21
|
+
import "./chunk-DVGWF6A2.js";
|
|
22
|
+
import {
|
|
23
|
+
SettingsManager
|
|
24
|
+
} from "./chunk-6XL67VVY.js";
|
|
25
|
+
import "./chunk-UOEDI7RP.js";
|
|
26
|
+
import {
|
|
27
|
+
loadInstallFeatures,
|
|
28
|
+
saveInstallFeatures
|
|
29
|
+
} from "./chunk-2HMIRK7W.js";
|
|
30
|
+
import "./chunk-URD2SLIT.js";
|
|
31
|
+
import "./chunk-CGBXPL3E.js";
|
|
32
|
+
import "./chunk-UJOCPOMX.js";
|
|
33
|
+
import "./chunk-IMLCWLPI.js";
|
|
34
|
+
import "./chunk-5EFIU3OM.js";
|
|
35
|
+
import {
|
|
36
|
+
loadGatewayConfig,
|
|
37
|
+
saveGatewayConfig
|
|
38
|
+
} from "./chunk-B4HP6ZWM.js";
|
|
39
|
+
import "./chunk-QH6YL7VK.js";
|
|
40
|
+
import "./chunk-HMBGROQK.js";
|
|
41
|
+
import "./chunk-I6R76AG7.js";
|
|
42
|
+
import "./chunk-6VYZ5UFP.js";
|
|
43
|
+
import "./chunk-GS42T6MX.js";
|
|
44
|
+
import {
|
|
45
|
+
getSelectListTheme,
|
|
46
|
+
theme
|
|
47
|
+
} from "./chunk-RDDAZOMU.js";
|
|
48
|
+
import "./chunk-FQMM2EZ2.js";
|
|
49
|
+
import "./chunk-Q4Q6D4IY.js";
|
|
50
|
+
import "./chunk-BRJX2PRC.js";
|
|
51
|
+
|
|
52
|
+
// packages/coding-agent/dist/gateway/setup.js
|
|
53
|
+
import { existsSync, realpathSync, statSync } from "node:fs";
|
|
54
|
+
import { resolve } from "node:path";
|
|
55
|
+
import { Container, SelectList, Spacer, Text } from "@ashx-j/lunr-tui";
|
|
56
|
+
async function validateBotToken(platform, token) {
|
|
57
|
+
let url = platform === "telegram" ? `https://api.telegram.org/bot${token}/getMe` : "https://discord.com/api/v10/users/@me", response;
|
|
58
|
+
try {
|
|
59
|
+
response = await fetch(url, {
|
|
60
|
+
headers: platform === "discord" ? { Authorization: `Bot ${token}` } : {},
|
|
61
|
+
signal: AbortSignal.timeout(15e3)
|
|
62
|
+
});
|
|
63
|
+
} catch {
|
|
64
|
+
throw new Error(`${platform}: could not reach the bot API. Check your connection and try again.`);
|
|
65
|
+
}
|
|
66
|
+
if (!response.ok)
|
|
67
|
+
throw new Error(`${platform}: token check failed with HTTP ${response.status}. Check the token and bot permissions.`);
|
|
68
|
+
let value = await response.json();
|
|
69
|
+
if (!value || typeof value != "object")
|
|
70
|
+
throw new Error(`${platform}: unexpected bot API response.`);
|
|
71
|
+
let user = platform === "telegram" && "result" in value ? value.result : value;
|
|
72
|
+
if (!user || typeof user != "object" || !("id" in user))
|
|
73
|
+
throw new Error(`${platform}: bot identity was missing.`);
|
|
74
|
+
return "username" in user && typeof user.username == "string" ? user.username : String(user.id);
|
|
75
|
+
}
|
|
76
|
+
async function selectSetupOption(settings, title, options, initial) {
|
|
77
|
+
let ui = await createStartupTui(settings);
|
|
78
|
+
try {
|
|
79
|
+
return await new Promise((resolve2) => {
|
|
80
|
+
let list = new SelectList(options.map((option, index) => ({ label: option.label, value: String(index) })), 8, getSelectListTheme());
|
|
81
|
+
list.setSelectedIndex(Math.max(0, options.findIndex((option) => option.value === initial))), list.onSelect = (item) => resolve2(options[Number(item.value)].value), list.onCancel = () => resolve2(void 0);
|
|
82
|
+
let panel = new Container();
|
|
83
|
+
panel.addChild(new Text(theme.fg("accent", title), 1, 0)), panel.addChild(new Spacer(1)), panel.addChild(list), panel.addChild(new Text("Up/Down to navigate, Enter to select, Esc to cancel", 1, 1)), ui.addChild(panel), ui.setFocus(list), startStartupTui(ui, settings);
|
|
84
|
+
});
|
|
85
|
+
} finally {
|
|
86
|
+
ui.clear(), ui.requestRender(), await new Promise((resolve2) => setTimeout(resolve2, 25)), ui.stop();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function setupGateway() {
|
|
90
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY)
|
|
91
|
+
throw new Error("Run lunr gateway setup in a terminal. Bot tokens are entered privately, not as command arguments.");
|
|
92
|
+
let uiSettings = SettingsManager.inMemory({ theme: "moon" }), cancelled = new Error("Setup cancelled."), saved = !1, choose = async (title, options, initial) => {
|
|
93
|
+
let value = await selectSetupOption(uiSettings, title, options, initial);
|
|
94
|
+
if (value === void 0)
|
|
95
|
+
throw cancelled;
|
|
96
|
+
return value;
|
|
97
|
+
}, ask = async (title) => {
|
|
98
|
+
let value = await showStartupInput(uiSettings, title);
|
|
99
|
+
if (value === void 0)
|
|
100
|
+
throw cancelled;
|
|
101
|
+
return value.trim();
|
|
102
|
+
}, cfg = loadGatewayConfig();
|
|
103
|
+
try {
|
|
104
|
+
console.log(`Set up lunR on your phone
|
|
105
|
+
Your computer must stay awake and connected to the internet.
|
|
106
|
+
`);
|
|
107
|
+
let choice = await choose("Connect a chat platform", [
|
|
108
|
+
{ label: "Telegram", value: "telegram" },
|
|
109
|
+
{ label: "Discord", value: "discord" },
|
|
110
|
+
{ label: "Both", value: "both" }
|
|
111
|
+
], cfg.discord.enabled ? cfg.telegram.enabled ? "both" : "discord" : "telegram");
|
|
112
|
+
for (let platform of ["telegram", "discord"]) {
|
|
113
|
+
if (choice !== platform && choice !== "both")
|
|
114
|
+
continue;
|
|
115
|
+
console.log(platform === "telegram" ? `
|
|
116
|
+
Telegram
|
|
117
|
+
1. Open https://t.me/BotFather and send /newbot.
|
|
118
|
+
2. Follow its prompts and copy the bot token.
|
|
119
|
+
3. Open your new bot and send /whoami. If your ID was not configured, it sends a pairing code for local approval.
|
|
120
|
+
Guide: https://core.telegram.org/bots/tutorial` : `
|
|
121
|
+
Discord
|
|
122
|
+
1. Open https://discord.com/developers/applications and create an application.
|
|
123
|
+
2. Open Bot, create or reset its token, and enable Message Content Intent for ordinary chat.
|
|
124
|
+
3. Under Installation, add bot and applications.commands scopes. Grant View Channels, Send Messages, Read Message History, Attach Files, and thread permissions if needed.
|
|
125
|
+
4. Use the install link to add your bot. In Discord, enable Developer Mode and copy your user ID.
|
|
126
|
+
Guide: https://docs.discord.com/developers/quick-start/getting-started`);
|
|
127
|
+
let token = cfg[platform].token;
|
|
128
|
+
if ((!token || await choose(`${platform} bot token`, [
|
|
129
|
+
{ label: "Keep the saved token", value: !1 },
|
|
130
|
+
{ label: "Enter a different token", value: !0 }
|
|
131
|
+
])) && (token = (await readSecret(`${platform} bot token`))?.trim()), !token)
|
|
132
|
+
throw new Error("No token entered. Existing configuration was not changed.");
|
|
133
|
+
console.log(`Connected bot: ${await validateBotToken(platform, token)}`), cfg[platform].token = token, cfg[platform].enabled = !0, cfg.owners ??= { telegram: [], discord: [] };
|
|
134
|
+
let ownerChoice = await choose(`${platform} owner access`, [
|
|
135
|
+
...cfg.owners[platform].length ? [{ label: "Keep the saved owners", value: "keep" }] : [],
|
|
136
|
+
{ label: "Enter my user ID", value: "enter" },
|
|
137
|
+
{ label: "Approve a pairing code later on this computer", value: "later" }
|
|
138
|
+
]), owner = ownerChoice === "enter" ? await ask(`Your ${platform} user ID`) : "";
|
|
139
|
+
if (ownerChoice === "enter" && !/^\d+$/.test(owner))
|
|
140
|
+
throw new Error("User IDs contain digits only.");
|
|
141
|
+
owner && (cfg.owners[platform] = [.../* @__PURE__ */ new Set([...cfg.owners[platform], owner])], cfg[platform].allowedUsers = [.../* @__PURE__ */ new Set([...cfg[platform].allowedUsers, owner])]);
|
|
142
|
+
}
|
|
143
|
+
let folders = [.../* @__PURE__ */ new Set([cfg.defaultProject, ...cfg.projectRoots ?? [], process.cwd()])].filter((folder2) => !!folder2), root = await choose("Default project", [
|
|
144
|
+
...folders.map((value) => ({ label: value, value })),
|
|
145
|
+
{ label: "Enter another folder path", value: null }
|
|
146
|
+
]) ?? await ask("Project folder path");
|
|
147
|
+
if (!root)
|
|
148
|
+
throw new Error("Enter a project folder. Nothing saved.");
|
|
149
|
+
let path = resolve(root);
|
|
150
|
+
if (!existsSync(path) || !statSync(path).isDirectory())
|
|
151
|
+
throw new Error("That project folder does not exist.");
|
|
152
|
+
cfg.defaultProject = realpathSync(path), cfg.projectRoots = [.../* @__PURE__ */ new Set([...cfg.projectRoots ?? [], cfg.defaultProject])];
|
|
153
|
+
let startup = await choose("Automatic startup", [
|
|
154
|
+
{ label: "Off. Start manually", value: "off" },
|
|
155
|
+
{ label: "When I sign in", value: "login" },
|
|
156
|
+
{ label: "When the computer boots", value: "boot" }
|
|
157
|
+
], loadServiceSettings().startup);
|
|
158
|
+
startup === "boot" && console.log("Boot startup may require administrator permission or OS-managed account credentials. lunR does not save your account password.");
|
|
159
|
+
let { ModelRuntime } = await import("./model-runtime-OO5HFLWE.js"), models = await (await ModelRuntime.create({ allowModelNetwork: !1 })).getAvailable();
|
|
160
|
+
if (!models.length)
|
|
161
|
+
throw new Error("No saved model credentials found. Open lunr locally and use /login, then rerun gateway setup. Nothing saved.");
|
|
162
|
+
let settings = SettingsManager.create(cfg.defaultProject), providers = [...new Set(models.map((model2) => model2.provider))], provider = await choose("Model provider", providers.map((value) => ({ label: value, value })), settings.getDefaultProvider()), choices = models.filter((model2) => model2.provider === provider), model = await choose("Model", choices.map((value) => ({ label: value.id, value })), choices.find((model2) => model2.id === settings.getDefaultModel()));
|
|
163
|
+
if (!await choose(`Save gateway settings?
|
|
164
|
+
Project: ${cfg.defaultProject}
|
|
165
|
+
Model: ${model.provider}/${model.id}
|
|
166
|
+
Startup: ${startup}`, [
|
|
167
|
+
{ label: "Save", value: !0 },
|
|
168
|
+
{ label: "Cancel", value: !1 }
|
|
169
|
+
])) {
|
|
170
|
+
console.log("Cancelled. Nothing saved.");
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
saveGatewayConfig(cfg), saved = !0, settings.setDefaultModelAndProvider(model.provider, model.id), await settings.flush();
|
|
174
|
+
let features = loadInstallFeatures();
|
|
175
|
+
features.features["chat-platforms"] = {
|
|
176
|
+
enabled: !0,
|
|
177
|
+
options: {
|
|
178
|
+
...features.features["chat-platforms"]?.options,
|
|
179
|
+
autostart: loadServiceSettings().startup !== "off"
|
|
180
|
+
}
|
|
181
|
+
}, saveInstallFeatures(features);
|
|
182
|
+
try {
|
|
183
|
+
await configureStartup(startup);
|
|
184
|
+
} finally {
|
|
185
|
+
features.features["chat-platforms"].options.autostart = loadServiceSettings().startup !== "off", saveInstallFeatures(features);
|
|
186
|
+
}
|
|
187
|
+
await choose("Start the gateway now?", [
|
|
188
|
+
{ label: "Start now", value: !0 },
|
|
189
|
+
{ label: "Not now", value: !1 }
|
|
190
|
+
]) && console.log(await startGatewayService()), console.log(`
|
|
191
|
+
If you entered your user ID, send /start to your bot, then send a task. Otherwise send /whoami, then on this computer run:
|
|
192
|
+
lunr gateway pair approve <telegram|discord> <code> --owner
|
|
193
|
+
Ordinary pairing without --owner does not grant project or TUI access.`);
|
|
194
|
+
} catch (error) {
|
|
195
|
+
if (error !== cancelled)
|
|
196
|
+
throw error;
|
|
197
|
+
console.log(saved ? "Settings saved. Start the gateway with lunr gateway start." : "Cancelled. Nothing saved.");
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function approveGatewayOwner(platform, code) {
|
|
201
|
+
if (platform !== "telegram" && platform !== "discord")
|
|
202
|
+
throw new Error("Choose telegram or discord.");
|
|
203
|
+
let user = createPairingStore().approve(platform, code);
|
|
204
|
+
if (!user)
|
|
205
|
+
throw new Error("Pairing code is invalid or expired.");
|
|
206
|
+
let cfg = loadGatewayConfig();
|
|
207
|
+
return cfg.owners ??= { telegram: [], discord: [] }, cfg.owners[platform] = [.../* @__PURE__ */ new Set([...cfg.owners[platform], user])], cfg[platform].allowedUsers = [.../* @__PURE__ */ new Set([...cfg[platform].allowedUsers, user])], saveGatewayConfig(cfg), `Approved ${platform} owner ${user}. Owner access includes local projects and TUI session history.`;
|
|
208
|
+
}
|
|
209
|
+
export {
|
|
210
|
+
approveGatewayOwner,
|
|
211
|
+
selectSetupOption,
|
|
212
|
+
setupGateway,
|
|
213
|
+
validateBotToken
|
|
214
|
+
};
|
|
@@ -179,7 +179,7 @@ import {
|
|
|
179
179
|
writeNestedControlRequest,
|
|
180
180
|
writeNestedEvent,
|
|
181
181
|
writePrivateAtomicJson
|
|
182
|
-
} from "./chunk-
|
|
182
|
+
} from "./chunk-3XPLBUEM.js";
|
|
183
183
|
import {
|
|
184
184
|
DEFAULT_CONTROL_CONFIG,
|
|
185
185
|
buildControlEvent,
|
|
@@ -191,24 +191,33 @@ import {
|
|
|
191
191
|
shouldNotifyControlEvent
|
|
192
192
|
} from "./chunk-OAR4TYZE.js";
|
|
193
193
|
import {
|
|
194
|
-
|
|
194
|
+
READ_ONLY_WRITE_SPAWN_ERROR,
|
|
195
195
|
resolveChildPermissions,
|
|
196
196
|
snapshotParentPermissionMode
|
|
197
|
-
} from "./chunk-
|
|
197
|
+
} from "./chunk-OVX6X377.js";
|
|
198
198
|
import "./chunk-YDO2F2IA.js";
|
|
199
199
|
import "./chunk-53YJI7JU.js";
|
|
200
200
|
import "./chunk-5ZQXRPMC.js";
|
|
201
201
|
import "./chunk-AD6VXAO7.js";
|
|
202
|
-
import
|
|
202
|
+
import {
|
|
203
|
+
subagentCommunicationEnabled
|
|
204
|
+
} from "./chunk-6XL67VVY.js";
|
|
205
|
+
import "./chunk-UOEDI7RP.js";
|
|
206
|
+
import "./chunk-2HMIRK7W.js";
|
|
207
|
+
import "./chunk-URD2SLIT.js";
|
|
208
|
+
import "./chunk-ZXSGTGJ6.js";
|
|
203
209
|
import "./chunk-M3LZLQW2.js";
|
|
204
210
|
import "./chunk-KKUTQQV7.js";
|
|
205
211
|
import "./chunk-CSFI6YXL.js";
|
|
206
212
|
import {
|
|
207
213
|
SessionManager
|
|
208
|
-
} from "./chunk-
|
|
214
|
+
} from "./chunk-2KIPT4HJ.js";
|
|
209
215
|
import "./chunk-FVDOXRUD.js";
|
|
216
|
+
import "./chunk-UJOCPOMX.js";
|
|
217
|
+
import "./chunk-IMLCWLPI.js";
|
|
210
218
|
import "./chunk-UAEOTO52.js";
|
|
211
219
|
import "./chunk-RQ2Q5IYR.js";
|
|
220
|
+
import "./chunk-B4HP6ZWM.js";
|
|
212
221
|
import "./chunk-GS42T6MX.js";
|
|
213
222
|
import "./chunk-RDDAZOMU.js";
|
|
214
223
|
import "./chunk-FQMM2EZ2.js";
|
|
@@ -1689,6 +1698,7 @@ async function runSingleAttempt(runtimeCwd, spec, task, model, options, shared)
|
|
|
1689
1698
|
inheritSkills: !1,
|
|
1690
1699
|
requireReadTool: !!shared.resolvedSkillNames?.length,
|
|
1691
1700
|
excludeTools,
|
|
1701
|
+
communicationEnabled: options.communicationEnabled,
|
|
1692
1702
|
childPermission: spec.effectivePermissions,
|
|
1693
1703
|
childId: spec.childId,
|
|
1694
1704
|
childDescription: spec.description,
|
|
@@ -2174,7 +2184,7 @@ It appears to have returned planning or scratchpad output instead of applying ch
|
|
|
2174
2184
|
async function runSync(runtimeCwd, spec, options) {
|
|
2175
2185
|
let task = spec.task, label = childRowLabel(spec), parentMode = snapshotParentPermissionMode(options.parentSessionId), resolvedPermissions = resolveChildPermissions(parentMode, spec.requestedPermissions);
|
|
2176
2186
|
if (!resolvedPermissions.ok) {
|
|
2177
|
-
let error = resolvedPermissions.error ||
|
|
2187
|
+
let error = resolvedPermissions.error || READ_ONLY_WRITE_SPAWN_ERROR;
|
|
2178
2188
|
return {
|
|
2179
2189
|
childId: spec.childId,
|
|
2180
2190
|
description: spec.description,
|
|
@@ -3337,6 +3347,7 @@ async function runParallelChainTasks(input) {
|
|
|
3337
3347
|
onControlEvent: input.onControlEvent,
|
|
3338
3348
|
intercomSessionName: input.childIntercomTarget?.(task.agent, input.globalTaskIndex + taskIndex),
|
|
3339
3349
|
orchestratorIntercomTarget: input.orchestratorIntercomTarget,
|
|
3350
|
+
communicationEnabled: input.communicationEnabled,
|
|
3340
3351
|
nestedRoute: input.nestedRoute,
|
|
3341
3352
|
modelOverride: effectiveModel,
|
|
3342
3353
|
availableModels: input.availableModels,
|
|
@@ -3386,7 +3397,7 @@ async function runParallelChainTasks(input) {
|
|
|
3386
3397
|
}, input.globalSemaphore);
|
|
3387
3398
|
}
|
|
3388
3399
|
async function executeChain(params) {
|
|
3389
|
-
let { chain: chainSteps, agents, ctx, signal, runId, cwd, shareEnabled, sessionDirForIndex, sessionFileForIndex, sessionFileForTask, thinkingOverrideForTask, artifactsDir, artifactConfig, includeProgress, clarify, onUpdate, onControlEvent, controlConfig, onDetachedExit, childIntercomTarget, orchestratorIntercomTarget, foregroundControl, intercomEvents, chainSkills: chainSkillsParam, chainDir: chainDirBase, modelScope } = params, chainSkills = chainSkillsParam ?? [], results = [], outputs = {}, dynamicChildren = {}, dynamicGroupStatuses = {}, allProgress = [], allArtifactPaths = [], chainAgents = chainSteps.map((step) => isParallelStep(step) ? `[${step.parallel.map((t) => t.description || t.label || t.agent || "child").join("+")}]` : isDynamicParallelStep(step) ? `expand:${step.parallel.description || step.parallel.label || step.parallel.agent || "child"}` : step.description || step.label || step.agent || "child"), totalSteps = chainSteps.length, makeDetailsInput = (overrides = {}) => ({
|
|
3400
|
+
let { chain: chainSteps, agents, ctx, signal, runId, cwd, shareEnabled, sessionDirForIndex, sessionFileForIndex, sessionFileForTask, thinkingOverrideForTask, artifactsDir, artifactConfig, includeProgress, clarify, onUpdate, onControlEvent, controlConfig, onDetachedExit, childIntercomTarget, orchestratorIntercomTarget, communicationEnabled, foregroundControl, intercomEvents, chainSkills: chainSkillsParam, chainDir: chainDirBase, modelScope } = params, chainSkills = chainSkillsParam ?? [], results = [], outputs = {}, dynamicChildren = {}, dynamicGroupStatuses = {}, allProgress = [], allArtifactPaths = [], chainAgents = chainSteps.map((step) => isParallelStep(step) ? `[${step.parallel.map((t) => t.description || t.label || t.agent || "child").join("+")}]` : isDynamicParallelStep(step) ? `expand:${step.parallel.description || step.parallel.label || step.parallel.agent || "child"}` : step.description || step.label || step.agent || "child"), totalSteps = chainSteps.length, makeDetailsInput = (overrides = {}) => ({
|
|
3390
3401
|
results,
|
|
3391
3402
|
...includeProgress !== void 0 ? { includeProgress } : {},
|
|
3392
3403
|
allProgress,
|
|
@@ -3530,6 +3541,7 @@ async function executeChain(params) {
|
|
|
3530
3541
|
onControlEvent,
|
|
3531
3542
|
childIntercomTarget,
|
|
3532
3543
|
orchestratorIntercomTarget,
|
|
3544
|
+
communicationEnabled,
|
|
3533
3545
|
foregroundControl,
|
|
3534
3546
|
nestedRoute: params.nestedRoute,
|
|
3535
3547
|
worktreeSetup,
|
|
@@ -3701,6 +3713,7 @@ ${failureSummary}`;
|
|
|
3701
3713
|
onControlEvent,
|
|
3702
3714
|
childIntercomTarget,
|
|
3703
3715
|
orchestratorIntercomTarget,
|
|
3716
|
+
communicationEnabled,
|
|
3704
3717
|
foregroundControl,
|
|
3705
3718
|
nestedRoute: params.nestedRoute,
|
|
3706
3719
|
maxSubagentDepth: params.maxSubagentDepth,
|
|
@@ -3880,6 +3893,7 @@ ${failureSummary}`;
|
|
|
3880
3893
|
onControlEvent,
|
|
3881
3894
|
intercomSessionName: childIntercomTarget?.(seqStep.agent, childIndex),
|
|
3882
3895
|
orchestratorIntercomTarget,
|
|
3896
|
+
communicationEnabled,
|
|
3883
3897
|
nestedRoute: params.nestedRoute,
|
|
3884
3898
|
modelOverride: effectiveModel,
|
|
3885
3899
|
availableModels,
|
|
@@ -4139,6 +4153,7 @@ function spawnRunner(cfg, suffix, cwd) {
|
|
|
4139
4153
|
windowsHide: !0,
|
|
4140
4154
|
env: {
|
|
4141
4155
|
...process.env,
|
|
4156
|
+
PI_SUBAGENT_COMMUNICATION_ENABLED: cfg.communicationEnabled ?? subagentCommunicationEnabled(cwd) ? "1" : "0",
|
|
4142
4157
|
...piPackageRoot ? { [PI_CODING_AGENT_PACKAGE_ROOT_ENV]: piPackageRoot } : {}
|
|
4143
4158
|
}
|
|
4144
4159
|
});
|
|
@@ -4455,6 +4470,7 @@ function executeAsyncChain(id, params) {
|
|
|
4455
4470
|
worktreeSetupHookTimeoutMs,
|
|
4456
4471
|
worktreeBaseDir,
|
|
4457
4472
|
controlConfig,
|
|
4473
|
+
communicationEnabled: params.communicationEnabled,
|
|
4458
4474
|
turnBudget: params.turnBudget,
|
|
4459
4475
|
toolBudget: params.toolBudget,
|
|
4460
4476
|
controlIntercomTarget,
|
|
@@ -4687,6 +4703,7 @@ ${injection}` : injection;
|
|
|
4687
4703
|
worktreeSetupHookTimeoutMs,
|
|
4688
4704
|
worktreeBaseDir,
|
|
4689
4705
|
controlConfig,
|
|
4706
|
+
communicationEnabled: params.communicationEnabled,
|
|
4690
4707
|
timeoutMs,
|
|
4691
4708
|
deadlineAt,
|
|
4692
4709
|
turnBudget: params.turnBudget,
|
|
@@ -6438,6 +6455,7 @@ ${followUp}`, 500, { source: "async-resume", runId: target.runId, agent: target.
|
|
|
6438
6455
|
input.deps.state.currentSessionId = resolveCurrentSessionId(input.ctx.sessionManager);
|
|
6439
6456
|
let effectiveCwd = target.cwd ?? input.requestCwd, modelScope = void 0, sessionName = resolveIntercomSessionTarget(input.deps.pi.getSessionName(), input.ctx.sessionManager.getSessionId()), intercomBridge = resolveIntercomBridge({
|
|
6440
6457
|
config: input.deps.config.intercomBridge,
|
|
6458
|
+
cwd: input.requestCwd,
|
|
6441
6459
|
context: input.params.context,
|
|
6442
6460
|
orchestratorTarget: sessionName
|
|
6443
6461
|
}), recoveryDescriptor = "recoveryDescriptor" in target ? target.recoveryDescriptor : void 0;
|
|
@@ -6490,6 +6508,7 @@ ${followUp}`, 500, { source: "async-resume", runId: target.runId, agent: target.
|
|
|
6490
6508
|
worktreeSetupHookTimeoutMs: input.deps.config.worktreeSetupHookTimeoutMs,
|
|
6491
6509
|
worktreeBaseDir: input.deps.config.worktreeBaseDir,
|
|
6492
6510
|
controlConfig: resolveControlConfig(input.deps.config.control, input.params.control),
|
|
6511
|
+
communicationEnabled: intercomBridge.communicationEnabled,
|
|
6493
6512
|
controlIntercomTarget: intercomBridge.active ? intercomBridge.orchestratorTarget : void 0,
|
|
6494
6513
|
childIntercomTarget: intercomBridge.active ? (agent, index) => resolveSubagentIntercomTarget(runId2, agent, index) : void 0,
|
|
6495
6514
|
globalConcurrencyLimit: input.deps.config.globalConcurrencyLimit
|
|
@@ -6576,6 +6595,7 @@ ${followUp}`, 500, { source: "async-resume", runId: target.runId, agent: target.
|
|
|
6576
6595
|
worktreeSetupHookTimeoutMs: input.deps.config.worktreeSetupHookTimeoutMs,
|
|
6577
6596
|
worktreeBaseDir: input.deps.config.worktreeBaseDir,
|
|
6578
6597
|
controlConfig: recoveryDescriptor?.controlConfig ?? resolveControlConfig(input.deps.config.control, input.params.control),
|
|
6598
|
+
communicationEnabled: intercomBridge.communicationEnabled,
|
|
6579
6599
|
controlIntercomTarget: intercomBridge.active ? intercomBridge.orchestratorTarget : void 0,
|
|
6580
6600
|
childIntercomTarget: intercomBridge.active ? (agent, index) => resolveSubagentIntercomTarget(runId, agent, index) : void 0,
|
|
6581
6601
|
availableModels,
|
|
@@ -7127,6 +7147,7 @@ function runAsyncPath(data, deps) {
|
|
|
7127
7147
|
worktree: params.worktree
|
|
7128
7148
|
}],
|
|
7129
7149
|
resultMode: "parallel",
|
|
7150
|
+
communicationEnabled: intercomBridge.communicationEnabled,
|
|
7130
7151
|
goal: params.tasks[0]?.task ?? "",
|
|
7131
7152
|
ctx: asyncCtx,
|
|
7132
7153
|
availableModels,
|
|
@@ -7161,6 +7182,7 @@ function runAsyncPath(data, deps) {
|
|
|
7161
7182
|
chain,
|
|
7162
7183
|
task: params.task,
|
|
7163
7184
|
goal: resolveAsyncEventGoal(params.task, rawChain),
|
|
7185
|
+
communicationEnabled: intercomBridge.communicationEnabled,
|
|
7164
7186
|
ctx: asyncCtx,
|
|
7165
7187
|
availableModels,
|
|
7166
7188
|
cwd: effectiveCwd,
|
|
@@ -7248,6 +7270,7 @@ function runAsyncPath(data, deps) {
|
|
|
7248
7270
|
worktreeSetupHookTimeoutMs: deps.config.worktreeSetupHookTimeoutMs,
|
|
7249
7271
|
worktreeBaseDir: deps.config.worktreeBaseDir,
|
|
7250
7272
|
controlConfig,
|
|
7273
|
+
communicationEnabled: intercomBridge.communicationEnabled,
|
|
7251
7274
|
controlIntercomTarget,
|
|
7252
7275
|
childIntercomTarget: childIntercomTarget ? (agent, index) => childIntercomTarget(agent, index) : void 0,
|
|
7253
7276
|
nestedRoute,
|
|
@@ -7285,6 +7308,7 @@ async function runChainPath(data, deps) {
|
|
|
7285
7308
|
controlConfig,
|
|
7286
7309
|
childIntercomTarget: childIntercomTarget ? (agent, index) => childIntercomTarget(runId, agent, index) : void 0,
|
|
7287
7310
|
orchestratorIntercomTarget: data.intercomBridge.active ? data.intercomBridge.orchestratorTarget : void 0,
|
|
7311
|
+
communicationEnabled: data.intercomBridge.communicationEnabled,
|
|
7288
7312
|
foregroundControl,
|
|
7289
7313
|
nestedRoute: foregroundControl?.nestedRoute,
|
|
7290
7314
|
chainSkills,
|
|
@@ -7342,6 +7366,7 @@ async function runChainPath(data, deps) {
|
|
|
7342
7366
|
controlConfig,
|
|
7343
7367
|
controlIntercomTarget: data.intercomBridge.active ? data.intercomBridge.orchestratorTarget : void 0,
|
|
7344
7368
|
childIntercomTarget: data.intercomBridge.active ? (agent, index) => resolveSubagentIntercomTarget(id, agent, index) : void 0,
|
|
7369
|
+
communicationEnabled: data.intercomBridge.communicationEnabled,
|
|
7345
7370
|
nestedRoute: data.nestedRoute,
|
|
7346
7371
|
timeoutMs: data.timeoutMs,
|
|
7347
7372
|
turnBudget: data.turnBudget,
|
|
@@ -7480,6 +7505,7 @@ async function runForegroundParallelTasks(input) {
|
|
|
7480
7505
|
onDetachedExit: (result2) => updateRememberedForegroundChild(input.state, { runId: input.runId, mode: "parallel", cwd: taskCwd, sessionId: input.parentSessionId, index, result: result2, events: input.intercomEvents }),
|
|
7481
7506
|
intercomSessionName: input.childIntercomTarget?.(task.agent, index),
|
|
7482
7507
|
orchestratorIntercomTarget: input.orchestratorIntercomTarget,
|
|
7508
|
+
communicationEnabled: input.communicationEnabled,
|
|
7483
7509
|
nestedRoute: input.foregroundControl?.nestedRoute,
|
|
7484
7510
|
modelOverride: input.modelOverrides[index],
|
|
7485
7511
|
thinkingOverride: input.thinkingOverrideForTask(task.agent, index, input.modelOverrides[index]),
|
|
@@ -7610,6 +7636,7 @@ async function runParallelPath(data, deps) {
|
|
|
7610
7636
|
chain: [{ parallel: parallelTasks, concurrency: parallelConcurrency, worktree: params.worktree }],
|
|
7611
7637
|
resultMode: "parallel",
|
|
7612
7638
|
goal: taskTexts[0] ?? "",
|
|
7639
|
+
communicationEnabled: data.intercomBridge.communicationEnabled,
|
|
7613
7640
|
ctx: asyncCtx,
|
|
7614
7641
|
availableModels,
|
|
7615
7642
|
cwd: effectiveCwd,
|
|
@@ -7689,6 +7716,7 @@ async function runParallelPath(data, deps) {
|
|
|
7689
7716
|
onControlEvent,
|
|
7690
7717
|
childIntercomTarget: childIntercomTarget ? (agent, index) => childIntercomTarget(runId, agent, index) : void 0,
|
|
7691
7718
|
orchestratorIntercomTarget: data.intercomBridge.active ? data.intercomBridge.orchestratorTarget : void 0,
|
|
7719
|
+
communicationEnabled: data.intercomBridge.communicationEnabled,
|
|
7692
7720
|
foregroundControl,
|
|
7693
7721
|
concurrencyLimit: parallelConcurrency,
|
|
7694
7722
|
globalSemaphore: new Semaphore(deps.config.globalConcurrencyLimit ?? DEFAULT_GLOBAL_CONCURRENCY_LIMIT),
|
|
@@ -7835,6 +7863,7 @@ async function runSinglePath(data, deps) {
|
|
|
7835
7863
|
};
|
|
7836
7864
|
return executeAsyncSingle(id, {
|
|
7837
7865
|
spec: { ...spec, task: shouldForkAgent(contextPolicy, params.agent) ? wrapForkTask(task) : task },
|
|
7866
|
+
communicationEnabled: data.intercomBridge.communicationEnabled,
|
|
7838
7867
|
goal: task,
|
|
7839
7868
|
ctx: asyncCtx,
|
|
7840
7869
|
availableModels,
|
|
@@ -7903,6 +7932,7 @@ async function runSinglePath(data, deps) {
|
|
|
7903
7932
|
onControlEvent,
|
|
7904
7933
|
intercomSessionName: childIntercomTarget,
|
|
7905
7934
|
orchestratorIntercomTarget: data.intercomBridge.active ? data.intercomBridge.orchestratorTarget : void 0,
|
|
7935
|
+
communicationEnabled: data.intercomBridge.communicationEnabled,
|
|
7906
7936
|
nestedRoute: foregroundControl?.nestedRoute,
|
|
7907
7937
|
index: 0,
|
|
7908
7938
|
modelOverride,
|
|
@@ -8065,6 +8095,8 @@ function createSubagentExecutor(deps) {
|
|
|
8065
8095
|
if (action === "resume")
|
|
8066
8096
|
return resumeAsyncRun({ params: paramsWithResolvedCwd, requestCwd, ctx, deps });
|
|
8067
8097
|
if (action === "steer") {
|
|
8098
|
+
if (!subagentCommunicationEnabled(requestCwd, getAgentDir()))
|
|
8099
|
+
return { content: [{ type: "text", text: "Subagent communication is off in /settings. Wait for the child to complete instead of steering it." }], isError: !0, details: { mode: "management", results: [] } };
|
|
8068
8100
|
deps.state.currentSessionId = resolveCurrentSessionId(ctx.sessionManager);
|
|
8069
8101
|
let message = (paramsWithResolvedCwd.message ?? paramsWithResolvedCwd.task ?? "").trim();
|
|
8070
8102
|
if (!message)
|
|
@@ -8199,6 +8231,7 @@ function createSubagentExecutor(deps) {
|
|
|
8199
8231
|
effectiveParams = contextPolicy.params;
|
|
8200
8232
|
let sessionName = resolveIntercomSessionTarget(deps.pi.getSessionName(), ctx.sessionManager.getSessionId()), intercomBridge = resolveIntercomBridge({
|
|
8201
8233
|
config: deps.config.intercomBridge,
|
|
8234
|
+
cwd: ctx.cwd,
|
|
8202
8235
|
context: effectiveParams.context,
|
|
8203
8236
|
orchestratorTarget: sessionName
|
|
8204
8237
|
}), agents = intercomBridge.active ? discoveredAgents.map((agent) => applyIntercomBridgeToAgent(agent, intercomBridge)) : discoveredAgents, inheritedNestedRoute = resolveInheritedNestedRouteFromEnv(), nestedParentAddress = inheritedNestedRoute ? resolveNestedParentAddressFromEnv() : void 0, nestedRoute = inheritedNestedRoute ?? createNestedRoute(runId), shareEnabled = effectiveParams.share === !0, hasChain = (effectiveParams.chain?.length ?? 0) > 0, hasTasks = (effectiveParams.tasks?.length ?? 0) > 0, hasSingle = !hasChain && !hasTasks && !!effectiveParams.task, allowClarifyTaskPrompt = hasChain && effectiveParams.clarify === !0 && ctx.hasUI && !(effectiveParams.chain?.some(isParallelStep) ?? !1), validationError = validateExecutionInput(effectiveParams, hasChain, hasTasks, hasSingle, allowClarifyTaskPrompt);
|
|
@@ -6,14 +6,13 @@ import {
|
|
|
6
6
|
import "./chunk-DVGWF6A2.js";
|
|
7
7
|
import {
|
|
8
8
|
SettingsManager
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-LISUTZS3.js";
|
|
9
|
+
} from "./chunk-6XL67VVY.js";
|
|
10
|
+
import "./chunk-UOEDI7RP.js";
|
|
11
|
+
import "./chunk-2HMIRK7W.js";
|
|
13
12
|
import "./chunk-URD2SLIT.js";
|
|
14
13
|
import "./chunk-UJOCPOMX.js";
|
|
15
14
|
import "./chunk-IMLCWLPI.js";
|
|
16
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-B4HP6ZWM.js";
|
|
17
16
|
import {
|
|
18
17
|
APP_NAME,
|
|
19
18
|
NPM_CLI_PACKAGE,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-view.d.ts","sourceRoot":"","sources":["../../src/startup/interactive-view.ts"],"names":[],"mappings":"AAIA,OAAO,EACN,KAAK,SAAS,EACd,SAAS,EACT,KAAK,eAAe,EAMpB,GAAG,EACH,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAuC,MAAM,oCAAoC,CAAC;AAE3G,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAMnF,KAAK,cAAc,GAAG,CAAC,UAAU,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AAsCnF,qBAAa,eAAe;IAC3B,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;IACjB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IACrD,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,gBAAgB,CAAC,CAAa;IACtC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,eAAe,YAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmB;IACnD,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAA4C;IAEjE,cAsDC;IAED,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,KAAK,IAAI,IAAI,CAMZ;IAED,KAAK,IAAI,IAAI,CAIZ;IAED,MAAM,IAAI,IAAI,CAKb;IAED,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEjC;IAED,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;IAED,OAAO,IAAI,eAAe,CAGzB;IAED,gBAAgB,CAAC,SAAS,EAAE,MAAM,eAAe,GAAG,IAAI,CAEvD;IAED,gFAAgF;IAChF,QAAQ,IAAI,IAAI,CAYf;IAED,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAS9B;IAEK,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAOxC;IAED,IAAI,IAAI,IAAI,CAUX;IAEK,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAmBlG;IAEK,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO9D;IAEK,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgB5E;IAEK,aAAa,CAClB,qBAAqB,EAAE,cAAc,EACrC,iBAAiB,EAAE,cAAc,GAC/B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBxB;IAED,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,oBAAoB;YA0Bd,cAAc;CA2B5B","sourcesContent":["import * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n\ttype Component,\n\tContainer,\n\ttype EditorComponent,\n\tisFocusable,\n\tProcessTerminal,\n\tSpacer,\n\tsetKeybindings,\n\tText,\n\tTUI,\n} from \"@ashx-j/lunr-tui\";\nimport { getChatboxEditor, renderStatsLine, thinkingThemeToken } from \"../builtin-extensions/ashxj-tui.ts\";\nimport { APP_NAME, getAgentDir, VERSION } from \"../config.ts\";\nimport { KeybindingsManager } from \"../core/keybindings.ts\";\nimport { registerPermissionModeBridge } from \"../core/permission-mode.ts\";\nimport type { SessionInfo, SessionListProgress } from \"../core/session-manager.ts\";\nimport type { Settings } from \"../core/settings-manager.ts\";\nimport { BootScreenComponent } from \"../modes/interactive/components/boot-screen.ts\";\nimport { getEditorTheme, getThemeName, initTheme, theme } from \"../modes/interactive/theme/theme.ts\";\nimport { markStartupMilestone } from \"./startup-milestones.ts\";\n\ntype SessionsLoader = (onProgress?: SessionListProgress) => Promise<SessionInfo[]>;\n\n// Read display preferences only: no auth, models, resources, migrations, or writes.\nfunction readDisplaySettings(): Partial<Settings> {\n\ttry {\n\t\tconst value = JSON.parse(fs.readFileSync(path.join(getAgentDir(), \"settings.json\"), \"utf8\"));\n\t\treturn value && typeof value === \"object\" && !Array.isArray(value) ? value : {};\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nclass StartupProcessTerminal extends ProcessTerminal {\n\tprivate watchForFirstFrame = false;\n\tprivate firstFrameCallback: (() => void) | undefined;\n\n\tsetFirstFrameCallback(callback: () => void): void {\n\t\tthis.firstFrameCallback = callback;\n\t\tthis.watchForFirstFrame = true;\n\t}\n\n\toverride start(onInput: (data: string) => void, onResize: () => void): void {\n\t\tsuper.start(onInput, onResize);\n\t\tmarkStartupMilestone(\"input_handler_armed\");\n\t\tif (process.stdin.isTTY) markStartupMilestone(\"raw_mode_active\");\n\t}\n\n\toverride write(data: string): void {\n\t\tsuper.write(data);\n\t\t// TUI ends each content frame with synchronized-output end. Setup writes do not count.\n\t\tif (this.watchForFirstFrame && data.includes(\"\\x1b[?2026l\")) {\n\t\t\tthis.watchForFirstFrame = false;\n\t\t\tmarkStartupMilestone(\"first_frame_committed\");\n\t\t\tthis.firstFrameCallback?.();\n\t\t}\n\t}\n}\n\nexport class InteractiveView {\n\treadonly ui: TUI;\n\treadonly editor: ReturnType<typeof getChatboxEditor>;\n\treadonly keybindings: KeybindingsManager;\n\tprivate submitRequested = false;\n\tprivate inputUnsubscribe?: () => void;\n\tprivate modalActive = false;\n\tprivate readonly terminal: StartupProcessTerminal;\n\tprivate readonly status = new Text(\"\", 1, 0);\n\treadonly header: Component;\n\treadonly footer: Component;\n\treadonly statusContainer = new Container();\n\tprivate readonly editorContainer = new Container();\n\tprivate firstFramePromise: Promise<void>;\n\tprivate resolveFirstFrame!: () => void;\n\tprivate exitPromise: Promise<void>;\n\tprivate resolveExit!: () => void;\n\tprivate started = false;\n\tprivate handedOff = false;\n\tprivate exitRequested = false;\n\tprivate lastClearAt = 0;\n\tprivate currentEditor: () => EditorComponent = () => this.editor;\n\n\tconstructor() {\n\t\tconst settings = readDisplaySettings();\n\t\tconst permission = settings.defaultPermissionMode;\n\t\tregisterPermissionModeBridge(() =>\n\t\t\tpermission === \"auto\" || permission === \"yolo\" || permission === \"plan\" ? permission : \"manual\",\n\t\t);\n\t\tinitTheme(typeof settings.theme === \"string\" ? settings.theme : undefined);\n\t\tthis.terminal = new StartupProcessTerminal();\n\t\tthis.ui = new TUI(this.terminal, settings.showHardwareCursor);\n\t\tthis.ui.setClearOnShrink(settings.terminal?.clearOnShrink ?? false);\n\t\tthis.keybindings = KeybindingsManager.create();\n\t\tsetKeybindings(this.keybindings);\n\t\tconst ctx = {\n\t\t\tmode: \"tui\" as const,\n\t\t\thasUI: true,\n\t\t\tmodel: settings.defaultModel ? { id: settings.defaultModel, provider: settings.defaultProvider } : undefined,\n\t\t\tsessionManager: { getEntries: () => [] },\n\t\t\tgetContextUsage: () => undefined,\n\t\t\tui: { theme, setEditorComponent() {}, setFooter() {} },\n\t\t};\n\t\tconst effort = settings.defaultThinkingLevel ?? \"off\";\n\t\tthis.editor = getChatboxEditor(this.ui, getEditorTheme(), this.keybindings as never, ctx, {\n\t\t\tgetThinkingLevel: () => effort,\n\t\t\ton() {},\n\t\t});\n\t\tthis.editor.borderColor = (text) => theme.fg(thinkingThemeToken(effort) as Parameters<typeof theme.fg>[0], text);\n\t\tthis.editor.disableSubmit = true;\n\t\tthis.header = settings.quietStartup\n\t\t\t? new Text(\"\", 0, 0)\n\t\t\t: new BootScreenComponent(theme.bold(theme.fg(\"accent\", APP_NAME)) + theme.fg(\"dim\", ` v${VERSION}`), [\n\t\t\t\t\t{ label: \"directory\", value: process.cwd() },\n\t\t\t\t\t{ label: \"config\", value: getAgentDir() },\n\t\t\t\t\t{ label: \"theme\", value: getThemeName() },\n\t\t\t\t]);\n\t\tthis.footer = {\n\t\t\tinvalidate() {},\n\t\t\trender: (width) =>\n\t\t\t\trenderStatsLine(width, ctx, theme, {\n\t\t\t\t\tgetGitBranch: () => null,\n\t\t\t\t\tgetExtensionStatuses: () => new Map(),\n\t\t\t\t\tgetAvailableProviderCount: () => 0,\n\t\t\t\t\tonBranchChange: () => () => {},\n\t\t\t\t}),\n\t\t};\n\t\tthis.editorContainer.addChild(this.editor);\n\t\tthis.statusContainer.addChild(this.status);\n\t\tthis.firstFramePromise = new Promise((resolve) => {\n\t\t\tthis.resolveFirstFrame = resolve;\n\t\t});\n\t\tthis.exitPromise = new Promise((resolve) => {\n\t\t\tthis.resolveExit = resolve;\n\t\t});\n\t\tthis.terminal.setFirstFrameCallback(this.resolveFirstFrame);\n\t\tthis.installInputHandlers();\n\t}\n\n\tget isExitRequested(): boolean {\n\t\treturn this.exitRequested;\n\t}\n\n\tstart(): void {\n\t\tif (this.started) return;\n\t\tthis.restoreLayout();\n\t\tthis.ui.setAlternateScreen(true);\n\t\tthis.ui.start();\n\t\tthis.started = true;\n\t}\n\n\tpause(): void {\n\t\tif (!this.started || this.handedOff) return;\n\t\tthis.ui.stop();\n\t\tthis.started = false;\n\t}\n\n\tresume(): void {\n\t\tif (this.started || this.handedOff || this.exitRequested) return;\n\t\tthis.restoreLayout();\n\t\tthis.ui.start();\n\t\tthis.started = true;\n\t}\n\n\twaitForFirstFrame(): Promise<void> {\n\t\treturn this.firstFramePromise;\n\t}\n\n\twaitForExit(): Promise<void> {\n\t\treturn this.exitPromise;\n\t}\n\n\tbinding(): InteractiveView {\n\t\tthis.handedOff = true;\n\t\treturn this;\n\t}\n\n\tsetCurrentEditor(getEditor: () => EditorComponent): void {\n\t\tthis.currentEditor = getEditor;\n\t}\n\n\t/** Called only after the normal submit handler and all extensions are ready. */\n\tactivate(): void {\n\t\tif (this.exitRequested) return;\n\t\tthis.inputUnsubscribe?.();\n\t\tthis.inputUnsubscribe = undefined;\n\t\tthis.editor.onPasteImage = undefined;\n\t\tthis.editor.disableSubmit = false;\n\t\tthis.status.setText(\"\");\n\t\tif (this.submitRequested) {\n\t\t\tthis.submitRequested = false;\n\t\t\tthis.currentEditor().handleInput(\"\\r\");\n\t\t}\n\t\tthis.ui.requestRender();\n\t}\n\n\tshowError(error: unknown): void {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthis.status.setText(\n\t\t\t`Startup failed: ${message}\\nYour draft is intact. Press Ctrl+C twice or Ctrl+D on an empty draft to exit.`,\n\t\t);\n\t\tthis.editor.disableSubmit = true;\n\t\tthis.statusContainer.clear();\n\t\tthis.statusContainer.addChild(this.status);\n\t\tthis.ui.requestRender();\n\t}\n\n\tasync fail(error: unknown): Promise<void> {\n\t\tthis.showError(error);\n\t\tif (process.env.PI_STARTUP_BENCHMARK === \"1\") {\n\t\t\tthis.stop();\n\t\t\treturn;\n\t\t}\n\t\tawait this.exitPromise;\n\t}\n\n\tstop(): void {\n\t\tif (this.exitRequested) return;\n\t\tthis.exitRequested = true;\n\t\tif (this.started) {\n\t\t\tthis.ui.stop();\n\t\t\tthis.started = false;\n\t\t}\n\t\tthis.inputUnsubscribe?.();\n\t\tthis.resolveFirstFrame();\n\t\tthis.resolveExit();\n\t}\n\n\tasync select<T>(title: string, options: Array<{ label: string; value: T }>): Promise<T | undefined> {\n\t\tconst { ExtensionSelectorComponent } = await import(\"../modes/interactive/components/extension-selector.ts\");\n\t\treturn new Promise((resolve) => {\n\t\t\tlet settled = false;\n\t\t\tconst finish = (value: T | undefined) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tthis.restoreLayout();\n\t\t\t\tresolve(value);\n\t\t\t};\n\t\t\tconst selector = new ExtensionSelectorComponent(\n\t\t\t\ttitle,\n\t\t\t\toptions.map((option) => option.label),\n\t\t\t\t(label) => finish(options.find((option) => option.label === label)?.value),\n\t\t\t\t() => finish(undefined),\n\t\t\t\t{ tui: this.ui },\n\t\t\t);\n\t\t\tthis.showModal(selector, selector);\n\t\t});\n\t}\n\n\tasync confirm(title: string, message: string): Promise<boolean> {\n\t\treturn (\n\t\t\t(await this.select(`${title}\\n${message}`, [\n\t\t\t\t{ label: \"Yes\", value: true },\n\t\t\t\t{ label: \"No\", value: false },\n\t\t\t])) ?? false\n\t\t);\n\t}\n\n\tasync input(title: string, placeholder?: string): Promise<string | undefined> {\n\t\tconst { ExtensionInputComponent } = await import(\"../modes/interactive/components/extension-input.ts\");\n\t\treturn new Promise((resolve) => {\n\t\t\tlet settled = false;\n\t\t\tconst finish = (value: string | undefined) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tinput.dispose();\n\t\t\t\tthis.restoreLayout();\n\t\t\t\tresolve(value);\n\t\t\t};\n\t\t\tconst input = new ExtensionInputComponent(title, placeholder, finish, () => finish(undefined), {\n\t\t\t\ttui: this.ui,\n\t\t\t});\n\t\t\tthis.showModal(input, input);\n\t\t});\n\t}\n\n\tasync selectSession(\n\t\tcurrentSessionsLoader: SessionsLoader,\n\t\tallSessionsLoader: SessionsLoader,\n\t): Promise<string | null> {\n\t\tconst { SessionSelectorComponent } = await import(\"../modes/interactive/components/session-selector.ts\");\n\t\treturn new Promise((resolve) => {\n\t\t\tlet settled = false;\n\t\t\tconst finish = (path: string | null) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tthis.restoreLayout();\n\t\t\t\tresolve(path);\n\t\t\t};\n\t\t\tconst selector = new SessionSelectorComponent(\n\t\t\t\tcurrentSessionsLoader,\n\t\t\t\tallSessionsLoader,\n\t\t\t\t(path) => finish(path),\n\t\t\t\t() => finish(null),\n\t\t\t\t() => this.stop(),\n\t\t\t\t() => this.ui.requestRender(),\n\t\t\t\t{ showRenameHint: false, keybindings: this.keybindings },\n\t\t\t);\n\t\t\tthis.showModal(selector, selector.getSessionList());\n\t\t});\n\t}\n\n\tprivate showModal(component: Parameters<TUI[\"addChild\"]>[0], focus: Parameters<TUI[\"setFocus\"]>[0]): void {\n\t\tthis.modalActive = true;\n\t\tthis.ui.pinFrom(null);\n\t\tthis.ui.clear();\n\t\tthis.ui.addChild(component);\n\t\tthis.ui.setFocus(focus);\n\t\tthis.ui.requestRender(true);\n\t}\n\n\tprivate restoreLayout(): void {\n\t\tthis.modalActive = false;\n\t\tthis.ui.pinFrom(null);\n\t\tthis.ui.clear();\n\t\tthis.ui.addChild(new Spacer(1));\n\t\tthis.ui.addChild(this.header);\n\t\tthis.ui.addChild(new Spacer(1));\n\t\tthis.ui.addChild(this.statusContainer);\n\t\tthis.ui.addChild(this.editorContainer);\n\t\tthis.ui.addChild(this.footer);\n\t\tthis.ui.pinFrom(this.editorContainer);\n\t\tthis.ui.setFocus(this.editor);\n\t\tthis.ui.requestRender(true);\n\t}\n\n\tprivate installInputHandlers(): void {\n\t\tthis.editor.onAction(\"app.clear\", () => {\n\t\t\tconst now = Date.now();\n\t\t\tif (this.editor.getText().length === 0 && now - this.lastClearAt < 500) {\n\t\t\t\tthis.stop();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.editor.setText(\"\");\n\t\t\tthis.lastClearAt = now;\n\t\t});\n\t\tthis.editor.onCtrlD = () => this.stop();\n\t\tthis.editor.onPasteImage = () => void this.pasteClipboard();\n\t\tthis.inputUnsubscribe = this.ui.addInputListener((data) => {\n\t\t\tconst editor = this.currentEditor();\n\t\t\tif (this.modalActive || !isFocusable(editor) || !editor.focused) return;\n\t\t\tif (this.keybindings.matches(data, \"tui.input.submit\")) {\n\t\t\t\tthis.submitRequested = editor.getText().trim().length > 0;\n\t\t\t\treturn { consume: true };\n\t\t\t}\n\t\t\tif (this.keybindings.matches(data, \"app.interrupt\") || this.keybindings.matches(data, \"app.clear\")) {\n\t\t\t\tthis.submitRequested = false;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t}\n\n\tprivate async pasteClipboard(): Promise<void> {\n\t\ttry {\n\t\t\tconst [{ readClipboardText }, { extensionForImageMimeType, readClipboardImage }] = await Promise.all([\n\t\t\t\timport(\"../utils/clipboard.ts\"),\n\t\t\t\timport(\"../utils/clipboard-image.ts\"),\n\t\t\t]);\n\t\t\tconst image = await readClipboardImage();\n\t\t\tif (image) {\n\t\t\t\tconst extension = extensionForImageMimeType(image.mimeType) ?? \"png\";\n\t\t\t\tconst filePath = path.join(os.tmpdir(), `lunr-clipboard-${crypto.randomUUID()}.${extension}`);\n\t\t\t\tfs.writeFileSync(filePath, Buffer.from(image.bytes));\n\t\t\t\tthis.editor.insertImageMarker({ path: filePath, mimeType: image.mimeType });\n\t\t\t\tthis.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst text = await readClipboardText();\n\t\t\tif (text) {\n\t\t\t\tthis.editor.insertTextAtCursor(text);\n\t\t\t\tthis.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.status.setText(\"Clipboard contains no image or text.\");\n\t\t} catch (error) {\n\t\t\tthis.status.setText(`Clipboard paste failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t\tthis.ui.requestRender();\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"interactive-view.d.ts","sourceRoot":"","sources":["../../src/startup/interactive-view.ts"],"names":[],"mappings":"AAIA,OAAO,EACN,KAAK,SAAS,EACd,SAAS,EACT,KAAK,eAAe,EAMpB,GAAG,EACH,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAuC,MAAM,oCAAoC,CAAC;AAE3G,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAMnF,KAAK,cAAc,GAAG,CAAC,UAAU,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AAsCnF,qBAAa,eAAe;IAC3B,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;IACjB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IACrD,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,gBAAgB,CAAC,CAAa;IACtC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,eAAe,YAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmB;IACnD,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAA4C;IAEjE,cA0DC;IAED,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,KAAK,IAAI,IAAI,CAMZ;IAED,KAAK,IAAI,IAAI,CAIZ;IAED,MAAM,IAAI,IAAI,CAKb;IAED,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEjC;IAED,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;IAED,OAAO,IAAI,eAAe,CAGzB;IAED,gBAAgB,CAAC,SAAS,EAAE,MAAM,eAAe,GAAG,IAAI,CAEvD;IAED,gFAAgF;IAChF,QAAQ,IAAI,IAAI,CAYf;IAED,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAS9B;IAEK,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAOxC;IAED,IAAI,IAAI,IAAI,CAUX;IAEK,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAmBlG;IAEK,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO9D;IAEK,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgB5E;IAEK,aAAa,CAClB,qBAAqB,EAAE,cAAc,EACrC,iBAAiB,EAAE,cAAc,GAC/B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBxB;IAED,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,oBAAoB;YA0Bd,cAAc;CA2B5B","sourcesContent":["import * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n\ttype Component,\n\tContainer,\n\ttype EditorComponent,\n\tisFocusable,\n\tProcessTerminal,\n\tSpacer,\n\tsetKeybindings,\n\tText,\n\tTUI,\n} from \"@ashx-j/lunr-tui\";\nimport { getChatboxEditor, renderStatsLine, thinkingThemeToken } from \"../builtin-extensions/ashxj-tui.ts\";\nimport { APP_NAME, getAgentDir, VERSION } from \"../config.ts\";\nimport { KeybindingsManager } from \"../core/keybindings.ts\";\nimport { registerPermissionModeBridge } from \"../core/permission-mode.ts\";\nimport type { SessionInfo, SessionListProgress } from \"../core/session-manager.ts\";\nimport type { Settings } from \"../core/settings-manager.ts\";\nimport { BootScreenComponent } from \"../modes/interactive/components/boot-screen.ts\";\nimport { getEditorTheme, getThemeName, initTheme, theme } from \"../modes/interactive/theme/theme.ts\";\nimport { markStartupMilestone } from \"./startup-milestones.ts\";\n\ntype SessionsLoader = (onProgress?: SessionListProgress) => Promise<SessionInfo[]>;\n\n// Read display preferences only: no auth, models, resources, migrations, or writes.\nfunction readDisplaySettings(): Partial<Settings> {\n\ttry {\n\t\tconst value = JSON.parse(fs.readFileSync(path.join(getAgentDir(), \"settings.json\"), \"utf8\"));\n\t\treturn value && typeof value === \"object\" && !Array.isArray(value) ? value : {};\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nclass StartupProcessTerminal extends ProcessTerminal {\n\tprivate watchForFirstFrame = false;\n\tprivate firstFrameCallback: (() => void) | undefined;\n\n\tsetFirstFrameCallback(callback: () => void): void {\n\t\tthis.firstFrameCallback = callback;\n\t\tthis.watchForFirstFrame = true;\n\t}\n\n\toverride start(onInput: (data: string) => void, onResize: () => void): void {\n\t\tsuper.start(onInput, onResize);\n\t\tmarkStartupMilestone(\"input_handler_armed\");\n\t\tif (process.stdin.isTTY) markStartupMilestone(\"raw_mode_active\");\n\t}\n\n\toverride write(data: string): void {\n\t\tsuper.write(data);\n\t\t// TUI ends each content frame with synchronized-output end. Setup writes do not count.\n\t\tif (this.watchForFirstFrame && data.includes(\"\\x1b[?2026l\")) {\n\t\t\tthis.watchForFirstFrame = false;\n\t\t\tmarkStartupMilestone(\"first_frame_committed\");\n\t\t\tthis.firstFrameCallback?.();\n\t\t}\n\t}\n}\n\nexport class InteractiveView {\n\treadonly ui: TUI;\n\treadonly editor: ReturnType<typeof getChatboxEditor>;\n\treadonly keybindings: KeybindingsManager;\n\tprivate submitRequested = false;\n\tprivate inputUnsubscribe?: () => void;\n\tprivate modalActive = false;\n\tprivate readonly terminal: StartupProcessTerminal;\n\tprivate readonly status = new Text(\"\", 1, 0);\n\treadonly header: Component;\n\treadonly footer: Component;\n\treadonly statusContainer = new Container();\n\tprivate readonly editorContainer = new Container();\n\tprivate firstFramePromise: Promise<void>;\n\tprivate resolveFirstFrame!: () => void;\n\tprivate exitPromise: Promise<void>;\n\tprivate resolveExit!: () => void;\n\tprivate started = false;\n\tprivate handedOff = false;\n\tprivate exitRequested = false;\n\tprivate lastClearAt = 0;\n\tprivate currentEditor: () => EditorComponent = () => this.editor;\n\n\tconstructor() {\n\t\tconst settings = readDisplaySettings();\n\t\tconst permission: unknown = settings.defaultPermissionMode;\n\t\tregisterPermissionModeBridge(() =>\n\t\t\tpermission === \"plan\"\n\t\t\t\t? \"read-only\"\n\t\t\t\t: permission === \"auto\" || permission === \"read-only\"\n\t\t\t\t\t? permission\n\t\t\t\t\t: \"yolo\",\n\t\t);\n\t\tinitTheme(typeof settings.theme === \"string\" ? settings.theme : undefined);\n\t\tthis.terminal = new StartupProcessTerminal();\n\t\tthis.ui = new TUI(this.terminal, settings.showHardwareCursor);\n\t\tthis.ui.setClearOnShrink(settings.terminal?.clearOnShrink ?? false);\n\t\tthis.keybindings = KeybindingsManager.create();\n\t\tsetKeybindings(this.keybindings);\n\t\tconst ctx = {\n\t\t\tmode: \"tui\" as const,\n\t\t\thasUI: true,\n\t\t\tmodel: settings.defaultModel ? { id: settings.defaultModel, provider: settings.defaultProvider } : undefined,\n\t\t\tsessionManager: { getEntries: () => [] },\n\t\t\tgetContextUsage: () => undefined,\n\t\t\tui: { theme, setEditorComponent() {}, setFooter() {} },\n\t\t};\n\t\tconst effort = settings.defaultThinkingLevel ?? \"off\";\n\t\tthis.editor = getChatboxEditor(this.ui, getEditorTheme(), this.keybindings as never, ctx, {\n\t\t\tgetThinkingLevel: () => effort,\n\t\t\ton() {},\n\t\t});\n\t\tthis.editor.borderColor = (text) => theme.fg(thinkingThemeToken(effort) as Parameters<typeof theme.fg>[0], text);\n\t\tthis.editor.disableSubmit = true;\n\t\tthis.header = settings.quietStartup\n\t\t\t? new Text(\"\", 0, 0)\n\t\t\t: new BootScreenComponent(theme.bold(theme.fg(\"accent\", APP_NAME)) + theme.fg(\"dim\", ` v${VERSION}`), [\n\t\t\t\t\t{ label: \"directory\", value: process.cwd() },\n\t\t\t\t\t{ label: \"config\", value: getAgentDir() },\n\t\t\t\t\t{ label: \"theme\", value: getThemeName() },\n\t\t\t\t]);\n\t\tthis.footer = {\n\t\t\tinvalidate() {},\n\t\t\trender: (width) =>\n\t\t\t\trenderStatsLine(width, ctx, theme, {\n\t\t\t\t\tgetGitBranch: () => null,\n\t\t\t\t\tgetExtensionStatuses: () => new Map(),\n\t\t\t\t\tgetAvailableProviderCount: () => 0,\n\t\t\t\t\tonBranchChange: () => () => {},\n\t\t\t\t}),\n\t\t};\n\t\tthis.editorContainer.addChild(this.editor);\n\t\tthis.statusContainer.addChild(this.status);\n\t\tthis.firstFramePromise = new Promise((resolve) => {\n\t\t\tthis.resolveFirstFrame = resolve;\n\t\t});\n\t\tthis.exitPromise = new Promise((resolve) => {\n\t\t\tthis.resolveExit = resolve;\n\t\t});\n\t\tthis.terminal.setFirstFrameCallback(this.resolveFirstFrame);\n\t\tthis.installInputHandlers();\n\t}\n\n\tget isExitRequested(): boolean {\n\t\treturn this.exitRequested;\n\t}\n\n\tstart(): void {\n\t\tif (this.started) return;\n\t\tthis.restoreLayout();\n\t\tthis.ui.setAlternateScreen(true);\n\t\tthis.ui.start();\n\t\tthis.started = true;\n\t}\n\n\tpause(): void {\n\t\tif (!this.started || this.handedOff) return;\n\t\tthis.ui.stop();\n\t\tthis.started = false;\n\t}\n\n\tresume(): void {\n\t\tif (this.started || this.handedOff || this.exitRequested) return;\n\t\tthis.restoreLayout();\n\t\tthis.ui.start();\n\t\tthis.started = true;\n\t}\n\n\twaitForFirstFrame(): Promise<void> {\n\t\treturn this.firstFramePromise;\n\t}\n\n\twaitForExit(): Promise<void> {\n\t\treturn this.exitPromise;\n\t}\n\n\tbinding(): InteractiveView {\n\t\tthis.handedOff = true;\n\t\treturn this;\n\t}\n\n\tsetCurrentEditor(getEditor: () => EditorComponent): void {\n\t\tthis.currentEditor = getEditor;\n\t}\n\n\t/** Called only after the normal submit handler and all extensions are ready. */\n\tactivate(): void {\n\t\tif (this.exitRequested) return;\n\t\tthis.inputUnsubscribe?.();\n\t\tthis.inputUnsubscribe = undefined;\n\t\tthis.editor.onPasteImage = undefined;\n\t\tthis.editor.disableSubmit = false;\n\t\tthis.status.setText(\"\");\n\t\tif (this.submitRequested) {\n\t\t\tthis.submitRequested = false;\n\t\t\tthis.currentEditor().handleInput(\"\\r\");\n\t\t}\n\t\tthis.ui.requestRender();\n\t}\n\n\tshowError(error: unknown): void {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthis.status.setText(\n\t\t\t`Startup failed: ${message}\\nYour draft is intact. Press Ctrl+C twice or Ctrl+D on an empty draft to exit.`,\n\t\t);\n\t\tthis.editor.disableSubmit = true;\n\t\tthis.statusContainer.clear();\n\t\tthis.statusContainer.addChild(this.status);\n\t\tthis.ui.requestRender();\n\t}\n\n\tasync fail(error: unknown): Promise<void> {\n\t\tthis.showError(error);\n\t\tif (process.env.PI_STARTUP_BENCHMARK === \"1\") {\n\t\t\tthis.stop();\n\t\t\treturn;\n\t\t}\n\t\tawait this.exitPromise;\n\t}\n\n\tstop(): void {\n\t\tif (this.exitRequested) return;\n\t\tthis.exitRequested = true;\n\t\tif (this.started) {\n\t\t\tthis.ui.stop();\n\t\t\tthis.started = false;\n\t\t}\n\t\tthis.inputUnsubscribe?.();\n\t\tthis.resolveFirstFrame();\n\t\tthis.resolveExit();\n\t}\n\n\tasync select<T>(title: string, options: Array<{ label: string; value: T }>): Promise<T | undefined> {\n\t\tconst { ExtensionSelectorComponent } = await import(\"../modes/interactive/components/extension-selector.ts\");\n\t\treturn new Promise((resolve) => {\n\t\t\tlet settled = false;\n\t\t\tconst finish = (value: T | undefined) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tthis.restoreLayout();\n\t\t\t\tresolve(value);\n\t\t\t};\n\t\t\tconst selector = new ExtensionSelectorComponent(\n\t\t\t\ttitle,\n\t\t\t\toptions.map((option) => option.label),\n\t\t\t\t(label) => finish(options.find((option) => option.label === label)?.value),\n\t\t\t\t() => finish(undefined),\n\t\t\t\t{ tui: this.ui },\n\t\t\t);\n\t\t\tthis.showModal(selector, selector);\n\t\t});\n\t}\n\n\tasync confirm(title: string, message: string): Promise<boolean> {\n\t\treturn (\n\t\t\t(await this.select(`${title}\\n${message}`, [\n\t\t\t\t{ label: \"Yes\", value: true },\n\t\t\t\t{ label: \"No\", value: false },\n\t\t\t])) ?? false\n\t\t);\n\t}\n\n\tasync input(title: string, placeholder?: string): Promise<string | undefined> {\n\t\tconst { ExtensionInputComponent } = await import(\"../modes/interactive/components/extension-input.ts\");\n\t\treturn new Promise((resolve) => {\n\t\t\tlet settled = false;\n\t\t\tconst finish = (value: string | undefined) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tinput.dispose();\n\t\t\t\tthis.restoreLayout();\n\t\t\t\tresolve(value);\n\t\t\t};\n\t\t\tconst input = new ExtensionInputComponent(title, placeholder, finish, () => finish(undefined), {\n\t\t\t\ttui: this.ui,\n\t\t\t});\n\t\t\tthis.showModal(input, input);\n\t\t});\n\t}\n\n\tasync selectSession(\n\t\tcurrentSessionsLoader: SessionsLoader,\n\t\tallSessionsLoader: SessionsLoader,\n\t): Promise<string | null> {\n\t\tconst { SessionSelectorComponent } = await import(\"../modes/interactive/components/session-selector.ts\");\n\t\treturn new Promise((resolve) => {\n\t\t\tlet settled = false;\n\t\t\tconst finish = (path: string | null) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tthis.restoreLayout();\n\t\t\t\tresolve(path);\n\t\t\t};\n\t\t\tconst selector = new SessionSelectorComponent(\n\t\t\t\tcurrentSessionsLoader,\n\t\t\t\tallSessionsLoader,\n\t\t\t\t(path) => finish(path),\n\t\t\t\t() => finish(null),\n\t\t\t\t() => this.stop(),\n\t\t\t\t() => this.ui.requestRender(),\n\t\t\t\t{ showRenameHint: false, keybindings: this.keybindings },\n\t\t\t);\n\t\t\tthis.showModal(selector, selector.getSessionList());\n\t\t});\n\t}\n\n\tprivate showModal(component: Parameters<TUI[\"addChild\"]>[0], focus: Parameters<TUI[\"setFocus\"]>[0]): void {\n\t\tthis.modalActive = true;\n\t\tthis.ui.pinFrom(null);\n\t\tthis.ui.clear();\n\t\tthis.ui.addChild(component);\n\t\tthis.ui.setFocus(focus);\n\t\tthis.ui.requestRender(true);\n\t}\n\n\tprivate restoreLayout(): void {\n\t\tthis.modalActive = false;\n\t\tthis.ui.pinFrom(null);\n\t\tthis.ui.clear();\n\t\tthis.ui.addChild(new Spacer(1));\n\t\tthis.ui.addChild(this.header);\n\t\tthis.ui.addChild(new Spacer(1));\n\t\tthis.ui.addChild(this.statusContainer);\n\t\tthis.ui.addChild(this.editorContainer);\n\t\tthis.ui.addChild(this.footer);\n\t\tthis.ui.pinFrom(this.editorContainer);\n\t\tthis.ui.setFocus(this.editor);\n\t\tthis.ui.requestRender(true);\n\t}\n\n\tprivate installInputHandlers(): void {\n\t\tthis.editor.onAction(\"app.clear\", () => {\n\t\t\tconst now = Date.now();\n\t\t\tif (this.editor.getText().length === 0 && now - this.lastClearAt < 500) {\n\t\t\t\tthis.stop();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.editor.setText(\"\");\n\t\t\tthis.lastClearAt = now;\n\t\t});\n\t\tthis.editor.onCtrlD = () => this.stop();\n\t\tthis.editor.onPasteImage = () => void this.pasteClipboard();\n\t\tthis.inputUnsubscribe = this.ui.addInputListener((data) => {\n\t\t\tconst editor = this.currentEditor();\n\t\t\tif (this.modalActive || !isFocusable(editor) || !editor.focused) return;\n\t\t\tif (this.keybindings.matches(data, \"tui.input.submit\")) {\n\t\t\t\tthis.submitRequested = editor.getText().trim().length > 0;\n\t\t\t\treturn { consume: true };\n\t\t\t}\n\t\t\tif (this.keybindings.matches(data, \"app.interrupt\") || this.keybindings.matches(data, \"app.clear\")) {\n\t\t\t\tthis.submitRequested = false;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t}\n\n\tprivate async pasteClipboard(): Promise<void> {\n\t\ttry {\n\t\t\tconst [{ readClipboardText }, { extensionForImageMimeType, readClipboardImage }] = await Promise.all([\n\t\t\t\timport(\"../utils/clipboard.ts\"),\n\t\t\t\timport(\"../utils/clipboard-image.ts\"),\n\t\t\t]);\n\t\t\tconst image = await readClipboardImage();\n\t\t\tif (image) {\n\t\t\t\tconst extension = extensionForImageMimeType(image.mimeType) ?? \"png\";\n\t\t\t\tconst filePath = path.join(os.tmpdir(), `lunr-clipboard-${crypto.randomUUID()}.${extension}`);\n\t\t\t\tfs.writeFileSync(filePath, Buffer.from(image.bytes));\n\t\t\t\tthis.editor.insertImageMarker({ path: filePath, mimeType: image.mimeType });\n\t\t\t\tthis.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst text = await readClipboardText();\n\t\t\tif (text) {\n\t\t\t\tthis.editor.insertTextAtCursor(text);\n\t\t\t\tthis.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.status.setText(\"Clipboard contains no image or text.\");\n\t\t} catch (error) {\n\t\t\tthis.status.setText(`Clipboard paste failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t\tthis.ui.requestRender();\n\t}\n}\n"]}
|
|
@@ -68,7 +68,11 @@ export class InteractiveView {
|
|
|
68
68
|
constructor() {
|
|
69
69
|
const settings = readDisplaySettings();
|
|
70
70
|
const permission = settings.defaultPermissionMode;
|
|
71
|
-
registerPermissionModeBridge(() => permission === "
|
|
71
|
+
registerPermissionModeBridge(() => permission === "plan"
|
|
72
|
+
? "read-only"
|
|
73
|
+
: permission === "auto" || permission === "read-only"
|
|
74
|
+
? permission
|
|
75
|
+
: "yolo");
|
|
72
76
|
initTheme(typeof settings.theme === "string" ? settings.theme : undefined);
|
|
73
77
|
this.terminal = new StartupProcessTerminal();
|
|
74
78
|
this.ui = new TUI(this.terminal, settings.showHardwareCursor);
|