@ashx-j/lunr-dev 0.2.16-dev.9.1 → 0.2.19-dev.10.1
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 +32 -1
- package/README.md +7 -1
- package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -0
- package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-thinking.js +44 -19
- package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
- package/dist/builtin-extensions/index.d.ts.map +1 -1
- package/dist/builtin-extensions/index.js +1 -0
- package/dist/builtin-extensions/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-computer-use.d.ts +3 -0
- package/dist/builtin-extensions/lunr-computer-use.d.ts.map +1 -0
- package/dist/builtin-extensions/lunr-computer-use.js +157 -0
- package/dist/builtin-extensions/lunr-computer-use.js.map +1 -0
- package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js +10 -3
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/runtime.d.ts +5 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/runtime.js +26 -4
- package/dist/builtin-extensions/pi-lsp-extension/src/runtime.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 +37 -27
- package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts +6 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +33 -8
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +52 -23
- package/dist/builtin-extensions/pi-subagents/src/extension/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 +6 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js +5 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.d.ts +10 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.js +38 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.js.map +1 -0
- 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 +3 -16
- 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 +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +70 -30
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.js +103 -102
- package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/computer-use/adapter.d.ts +23 -0
- package/dist/core/computer-use/adapter.d.ts.map +1 -0
- package/dist/core/computer-use/adapter.js +116 -0
- package/dist/core/computer-use/adapter.js.map +1 -0
- package/dist/core/computer-use/lease.d.ts +18 -0
- package/dist/core/computer-use/lease.d.ts.map +1 -0
- package/dist/core/computer-use/lease.js +129 -0
- package/dist/core/computer-use/lease.js.map +1 -0
- package/dist/core/computer-use/macos-runtime.d.ts +14 -0
- package/dist/core/computer-use/macos-runtime.d.ts.map +1 -0
- package/dist/core/computer-use/macos-runtime.js +148 -0
- package/dist/core/computer-use/macos-runtime.js.map +1 -0
- package/dist/core/computer-use/policy.d.ts +19 -0
- package/dist/core/computer-use/policy.d.ts.map +1 -0
- package/dist/core/computer-use/policy.js +66 -0
- package/dist/core/computer-use/policy.js.map +1 -0
- package/dist/core/computer-use/release.generated.d.ts +31 -0
- package/dist/core/computer-use/release.generated.d.ts.map +1 -0
- package/dist/core/computer-use/release.generated.js +36 -0
- package/dist/core/computer-use/release.generated.js.map +1 -0
- package/dist/core/computer-use/runtime.d.ts +13 -0
- package/dist/core/computer-use/runtime.d.ts.map +1 -0
- package/dist/core/computer-use/runtime.js +158 -0
- package/dist/core/computer-use/runtime.js.map +1 -0
- package/dist/core/computer-use/schemas.d.ts +88 -0
- package/dist/core/computer-use/schemas.d.ts.map +1 -0
- package/dist/core/computer-use/schemas.js +80 -0
- package/dist/core/computer-use/schemas.js.map +1 -0
- package/dist/core/computer-use/windows-desktop.d.ts +3 -0
- package/dist/core/computer-use/windows-desktop.d.ts.map +1 -0
- package/dist/core/computer-use/windows-desktop.js +48 -0
- package/dist/core/computer-use/windows-desktop.js.map +1 -0
- package/dist/core/computer-use/workflow.d.ts +24 -0
- package/dist/core/computer-use/workflow.d.ts.map +1 -0
- package/dist/core/computer-use/workflow.js +330 -0
- package/dist/core/computer-use/workflow.js.map +1 -0
- package/dist/core/keybindings.d.ts +2 -2
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +2 -2
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-runtime.d.ts +0 -3
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +1 -10
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +1 -1
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/permissions.d.ts +1 -1
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +23 -7
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/plan-mode.d.ts.map +1 -1
- package/dist/core/plan-mode.js +9 -0
- package/dist/core/plan-mode.js.map +1 -1
- package/dist/core/rollback.d.ts.map +1 -1
- package/dist/core/rollback.js +13 -90
- package/dist/core/rollback.js.map +1 -1
- package/dist/core/session-manager.d.ts +0 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +21 -79
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +6 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +19 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/dev-cli.js +0 -0
- package/dist/gateway/agent-bridge.d.ts +6 -1
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js +23 -6
- package/dist/gateway/agent-bridge.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 +23 -7
- package/dist/gateway/cron.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +4 -2
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +23 -32
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/processes-selector.d.ts +2 -3
- package/dist/modes/interactive/components/processes-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/processes-selector.js +5 -10
- package/dist/modes/interactive/components/processes-selector.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 +20 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +18 -8
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/thinking-level-slash.d.ts +4 -0
- package/dist/modes/interactive/thinking-level-slash.d.ts.map +1 -0
- package/dist/modes/interactive/thinking-level-slash.js +23 -0
- package/dist/modes/interactive/thinking-level-slash.js.map +1 -0
- package/dist/node-runtime/adapter-AZMY335J.js +279 -0
- package/dist/node-runtime/{agent-session-services-IFJMSX7Z.js → agent-session-services-RSGP5GDN.js} +15 -12
- package/dist/node-runtime/{builtin-extensions-LYZ3BFWQ.js → builtin-extensions-7STLFW3A.js} +4 -3
- package/dist/node-runtime/chunk-2IDTZAG5.js +1415 -0
- package/dist/node-runtime/{chunk-7NBZ5P7I.js → chunk-4SJWFTUP.js} +1 -1
- package/dist/node-runtime/{chunk-AJX357CL.js → chunk-5NWQCSKR.js} +20 -1013
- package/dist/node-runtime/chunk-5OLJGVCB.js +68 -0
- package/dist/node-runtime/chunk-5Q45AVQG.js +108 -0
- package/dist/node-runtime/{chunk-TQNSPERU.js → chunk-5SQDLSZJ.js} +1 -1
- package/dist/node-runtime/{chunk-F4VQFJI2.js → chunk-6SPPH4FY.js} +4 -4
- package/dist/node-runtime/{chunk-PBC2Y6GS.js → chunk-6UB6NKA3.js} +29 -72
- package/dist/node-runtime/{chunk-A2KQXUJD.js → chunk-7AFOFSDY.js} +1 -1
- package/dist/node-runtime/chunk-BKAZ6BKX.js +2185 -0
- package/dist/node-runtime/{chunk-AHSTJBIB.js → chunk-EH2LJQPM.js} +4 -4
- package/dist/node-runtime/{chunk-N77MY65L.js → chunk-FLYMHKCS.js} +25 -25
- package/dist/node-runtime/{chunk-5P7PZMRU.js → chunk-HRS4HMDX.js} +1 -1
- package/dist/node-runtime/{chunk-IPA627GP.js → chunk-ISQDQIZN.js} +4 -4
- package/dist/node-runtime/{chunk-WJVFOIB5.js → chunk-J7QGQD45.js} +1 -1
- package/dist/node-runtime/{chunk-WOVTOV5P.js → chunk-JT6YCS5B.js} +29 -34
- package/dist/node-runtime/chunk-JZHEUQRL.js +180 -0
- package/dist/node-runtime/{chunk-ZKMFUD3Q.js → chunk-K72NVGUB.js} +3 -3
- package/dist/node-runtime/{chunk-ECD5L7YI.js → chunk-LCACDWHJ.js} +389 -15
- package/dist/node-runtime/{chunk-2QKLKMKC.js → chunk-LTXUQJI4.js} +1 -1
- package/dist/node-runtime/{chunk-MKKH27PH.js → chunk-LWJXTA6Z.js} +274 -2416
- package/dist/node-runtime/{chunk-EDBJNRSM.js → chunk-MGSB2C3M.js} +1 -1
- package/dist/node-runtime/{chunk-CDFZEWPU.js → chunk-MUMMMTW4.js} +6 -2
- package/dist/node-runtime/{chunk-YF63P5ZT.js → chunk-OTT6JMPU.js} +10 -67
- package/dist/node-runtime/{chunk-PGAJ5MO5.js → chunk-T5GM5BFH.js} +1 -1
- package/dist/node-runtime/{chunk-PCGNAY2O.js → chunk-TAP7QTUT.js} +38 -16
- package/dist/node-runtime/{chunk-4TLO4PO2.js → chunk-U6C7VTR5.js} +7 -1401
- package/dist/node-runtime/chunk-URD2SLIT.js +1019 -0
- package/dist/node-runtime/{chunk-QH42CDX3.js → chunk-W7S2REEG.js} +111 -84
- package/dist/node-runtime/{chunk-LZAW4ZX3.js → chunk-ZRDIMBEQ.js} +27 -9
- package/dist/node-runtime/{chunk-AD6VXAO7.js → chunk-ZSEZY3II.js} +5 -100
- package/dist/node-runtime/cli-runtime.js +1 -1
- package/dist/node-runtime/{command-L3LAHDIH.js → command-6UXQ6XZN.js} +1 -1
- package/dist/node-runtime/{commands-RL5YBW5I.js → commands-LGR5VT5X.js} +6 -4
- package/dist/node-runtime/{direct-tool-executor-JVDXTO7A.js → direct-tool-executor-TDJS7TBD.js} +9 -6
- package/dist/node-runtime/{export-html-KR26FOUZ.js → export-html-E4DT6ZJQ.js} +1 -1
- package/dist/node-runtime/{extract-XLQSJN4V.js → extract-IUCVZCWC.js} +2 -2
- package/dist/node-runtime/{gateway-X2TI5X7F.js → gateway-3OLC4GQN.js} +22 -367
- package/dist/node-runtime/{gemini-search-U7SUMPQA.js → gemini-search-NCIDF7NE.js} +1 -1
- package/dist/node-runtime/{gemini-url-context-PXWCBQHK.js → gemini-url-context-OKIN7AIP.js} +2 -2
- package/dist/node-runtime/image-resize-6ZPBFMWW.js +11 -0
- package/dist/node-runtime/index.js +53 -49
- package/dist/node-runtime/{init-NJV2T55N.js → init-EKE277AG.js} +6 -4
- package/dist/node-runtime/{interactive-mode-KOM35YF2.js → interactive-mode-S5M26CQ7.js} +20 -17
- package/dist/node-runtime/{interactive-view-U6OILKF3.js → interactive-view-N6F4KUIT.js} +3 -5
- package/dist/node-runtime/lunr-computer-use-4X3KUNF4.js +206 -0
- package/dist/node-runtime/{lunr-cron-YJ5UHYRD.js → lunr-cron-KKBOGAEF.js} +7 -1
- package/dist/node-runtime/main.js +24 -21
- package/dist/node-runtime/{mcp-auth-flow-QIXHW6QN.js → mcp-auth-flow-YL6RWPYG.js} +2 -1
- package/dist/node-runtime/{package-manager-cli-TZZHJCVI.js → package-manager-cli-C4EJOO5Q.js} +8 -6
- package/dist/node-runtime/{pi-mcp-adapter-QFB37AVN.js → pi-mcp-adapter-DPTJGAAL.js} +33 -27
- package/dist/node-runtime/{pi-subagents-7XJ4H53P.js → pi-subagents-VKCLYIBY.js} +103 -76
- package/dist/node-runtime/{pi-web-access-DPGAVKOA.js → pi-web-access-BV6DSZOP.js} +72 -69
- package/dist/node-runtime/{proxy-modes-HEEFK4KC.js → proxy-modes-R64LU6WZ.js} +12 -9
- package/dist/node-runtime/rpc-entry.js +24 -21
- package/dist/node-runtime/runtime-3SB5ATHQ.js +21 -0
- package/dist/node-runtime/{runtime-bridges-PPHNBFWL.js → runtime-bridges-UJ5WJJLN.js} +3 -3
- package/dist/node-runtime/{session-manager-MQNBYACL.js → session-manager-QEMZBMTM.js} +3 -5
- package/dist/node-runtime/{session-selector-5AZLJS6U.js → session-selector-URVJLOTK.js} +2 -2
- package/dist/node-runtime/{settings-manager-5LF2VQWC.js → settings-manager-K6IPIQTI.js} +3 -1
- package/dist/node-runtime/{src-Y7JSCK64.js → src-GPFAU3N6.js} +30 -10
- package/dist/node-runtime/{subagent-executor-5RNDEPIJ.js → subagent-executor-EFLTO32A.js} +39 -21
- package/dist/node-runtime/{update-cli-A253SZ7P.js → update-cli-I6OVDRPL.js} +3 -1
- package/dist/node-runtime/{video-extract-OYT5WKS5.js → video-extract-ETA5RA7U.js} +2 -2
- package/dist/node-runtime/workflow-SA34S4VX.js +325 -0
- package/dist/node-runtime/{youtube-extract-TQYKGFGS.js → youtube-extract-SRVGNN26.js} +2 -2
- package/dist/rpc.d.ts +3 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +18 -0
- package/dist/rpc.js.map +1 -0
- package/dist/startup/interactive-view.d.ts.map +1 -1
- package/dist/startup/interactive-view.js +1 -2
- package/dist/startup/interactive-view.js.map +1 -1
- package/docs/computer-use.md +277 -0
- package/docs/development.md +0 -32
- package/docs/features.md +2 -2
- package/docs/interactive-startup.md +10 -3
- package/docs/keybindings.md +2 -2
- package/docs/terminal-setup.md +1 -1
- package/docs/usage.md +1 -1
- 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/hidden-thinking-label.ts +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/install-lock/package-lock.json +3827 -0
- package/install-lock/package.json +18 -0
- package/native/computer-use/LICENSE.md +21 -0
- package/npm-shrinkwrap.json +3808 -0
- package/package.json +16 -10
- package/dist/startup/interactive-shell.d.ts +0 -55
- package/dist/startup/interactive-shell.d.ts.map +0 -1
- package/dist/startup/interactive-shell.js +0 -264
- package/dist/startup/interactive-shell.js.map +0 -1
- package/dist/node-runtime/{chunk-YSKSB3BJ.js → chunk-CH6OL6P2.js} +2 -2
- package/dist/node-runtime/{chunk-VSELYKWU.js → chunk-EHMBW7FA.js} +3 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ashx-j/lunr-dev",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.19-dev.10.1",
|
|
4
4
|
"description": "lunR — terminal coding agent CLI with read, bash, edit, write tools and session management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"piConfig": {
|
|
@@ -18,28 +18,31 @@
|
|
|
18
18
|
"import": "./dist/node-runtime/index.js"
|
|
19
19
|
},
|
|
20
20
|
"./rpc-entry": {
|
|
21
|
-
"import": "./dist/
|
|
21
|
+
"import": "./dist/rpc.js"
|
|
22
22
|
}
|
|
23
23
|
},
|
|
24
24
|
"files": [
|
|
25
25
|
"dist",
|
|
26
26
|
"docs",
|
|
27
|
+
"native/computer-use/LICENSE.md",
|
|
27
28
|
"examples",
|
|
28
|
-
"CHANGELOG.md"
|
|
29
|
+
"CHANGELOG.md",
|
|
30
|
+
"npm-shrinkwrap.json",
|
|
31
|
+
"install-lock"
|
|
29
32
|
],
|
|
30
33
|
"scripts": {
|
|
31
34
|
"clean": "shx rm -rf dist",
|
|
32
|
-
"build": "tsgo -p tsconfig.build.json && shx chmod +x dist/cli.js dist/
|
|
33
|
-
"build:binary": "npm --prefix ../tui run build &&
|
|
35
|
+
"build": "node ../../scripts/generate-computer-use-manifest.mjs && tsgo -p tsconfig.build.json && shx chmod +x dist/cli.js dist/rpc-entry.js && npm run copy-assets && node ../../scripts/build-node-runtime.mjs",
|
|
36
|
+
"build:binary": "npm --prefix ../tui run build && tsgo -p ../ai/tsconfig.build.json && npm --prefix ../agent run build && npm run build && bun build --compile ./dist/bun/cli.js ./src/utils/image-resize-worker.ts --outfile dist/lunr && npm run copy-binary-assets",
|
|
34
37
|
"copy-assets": "shx mkdir -p dist/modes/interactive/theme && shx cp src/modes/interactive/theme/*.json dist/modes/interactive/theme/ && shx mkdir -p dist/modes/interactive/assets && shx cp src/modes/interactive/assets/*.png dist/modes/interactive/assets/ && shx mkdir -p dist/core/export-html/vendor && shx cp src/core/export-html/template.html src/core/export-html/template.css src/core/export-html/template.js dist/core/export-html/ && shx cp src/core/export-html/vendor/*.js dist/core/export-html/vendor/ && shx mkdir -p dist/builtin-extensions/lunr-skill-creator/skills/skill-creator && shx cp src/builtin-extensions/lunr-skill-creator/skills/skill-creator/SKILL.md dist/builtin-extensions/lunr-skill-creator/skills/skill-creator/ && shx mkdir -p dist/catalog && shx cp -r ../../catalog/. dist/catalog/",
|
|
35
|
-
"copy-binary-assets": "shx cp package.json dist/ && shx cp README.md dist/ && shx cp CHANGELOG.md dist/ && shx mkdir -p dist/theme && shx cp src/modes/interactive/theme/*.json dist/theme/ && shx mkdir -p dist/assets && shx cp src/modes/interactive/assets/*.png dist/assets/ && shx mkdir -p dist/export-html/vendor && shx cp src/core/export-html/template.html dist/export-html/ && shx cp src/core/export-html/vendor/*.js dist/export-html/vendor/ && shx cp -r docs dist/ && shx cp -r examples dist/ && shx mkdir -p dist/catalog && shx cp -r ../../catalog/. dist/catalog/ && shx cp ../../node_modules/@silvia-odwyer/photon-node/photon_rs_bg.wasm dist/",
|
|
38
|
+
"copy-binary-assets": "shx cp package.json dist/ && shx cp README.md dist/ && shx cp CHANGELOG.md dist/ && shx mkdir -p dist/theme && shx cp src/modes/interactive/theme/*.json dist/theme/ && shx mkdir -p dist/assets && shx cp src/modes/interactive/assets/*.png dist/assets/ && shx mkdir -p dist/export-html/vendor && shx cp src/core/export-html/template.html dist/export-html/ && shx cp src/core/export-html/vendor/*.js dist/export-html/vendor/ && shx cp -r docs dist/ && shx cp -r examples dist/ && shx mkdir -p dist/catalog && shx cp -r ../../catalog/. dist/catalog/ && shx cp ../../node_modules/@silvia-odwyer/photon-node/photon_rs_bg.wasm dist/ && node ../../scripts/computer-use-packages.mjs standalone dist",
|
|
36
39
|
"test": "vitest --run",
|
|
37
40
|
"shrinkwrap": "node ../../scripts/generate-coding-agent-shrinkwrap.mjs"
|
|
38
41
|
},
|
|
39
42
|
"dependencies": {
|
|
40
|
-
"@ashx-j/lunr-agent": "0.2.
|
|
41
|
-
"@ashx-j/lunr-ai": "0.2.
|
|
42
|
-
"@ashx-j/lunr-tui": "0.2.
|
|
43
|
+
"@ashx-j/lunr-agent": "0.2.19-dev.10.1",
|
|
44
|
+
"@ashx-j/lunr-ai": "0.2.19-dev.10.1",
|
|
45
|
+
"@ashx-j/lunr-tui": "0.2.19-dev.10.1",
|
|
43
46
|
"@modelcontextprotocol/ext-apps": "1.7.4",
|
|
44
47
|
"@modelcontextprotocol/sdk": "1.30.0",
|
|
45
48
|
"@mozilla/readability": "0.6.0",
|
|
@@ -80,7 +83,10 @@
|
|
|
80
83
|
}
|
|
81
84
|
},
|
|
82
85
|
"optionalDependencies": {
|
|
83
|
-
"@mariozechner/clipboard": "0.3.9"
|
|
86
|
+
"@mariozechner/clipboard": "0.3.9",
|
|
87
|
+
"@ashx-j/lunr-computer-win32-x64": "0.2.19-dev.10.1",
|
|
88
|
+
"@ashx-j/lunr-computer-win32-arm64": "0.2.19-dev.10.1",
|
|
89
|
+
"@ashx-j/lunr-computer-darwin-arm64": "0.2.19-dev.10.1"
|
|
84
90
|
},
|
|
85
91
|
"devDependencies": {
|
|
86
92
|
"@types/cross-spawn": "6.0.6",
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { type EditorImageAttachment, TUI } from "@ashx-j/lunr-tui";
|
|
2
|
-
import { KeybindingsManager } from "../core/keybindings.ts";
|
|
3
|
-
import type { SessionInfo, SessionListProgress } from "../core/session-manager.ts";
|
|
4
|
-
import { CustomEditor } from "../modes/interactive/components/custom-editor.ts";
|
|
5
|
-
export interface StartupShellSubmission {
|
|
6
|
-
text: string;
|
|
7
|
-
attachments: EditorImageAttachment[];
|
|
8
|
-
}
|
|
9
|
-
export interface InteractiveShellBinding {
|
|
10
|
-
ui: TUI;
|
|
11
|
-
editor: CustomEditor;
|
|
12
|
-
keybindings: KeybindingsManager;
|
|
13
|
-
pendingSubmissions: StartupShellSubmission[];
|
|
14
|
-
}
|
|
15
|
-
type SessionsLoader = (onProgress?: SessionListProgress) => Promise<SessionInfo[]>;
|
|
16
|
-
export declare class InteractiveStartupShell {
|
|
17
|
-
readonly ui: TUI;
|
|
18
|
-
readonly editor: CustomEditor;
|
|
19
|
-
readonly keybindings: KeybindingsManager;
|
|
20
|
-
readonly pendingSubmissions: StartupShellSubmission[];
|
|
21
|
-
private readonly terminal;
|
|
22
|
-
private readonly status;
|
|
23
|
-
private readonly editorContainer;
|
|
24
|
-
private firstFramePromise;
|
|
25
|
-
private resolveFirstFrame;
|
|
26
|
-
private exitPromise;
|
|
27
|
-
private resolveExit;
|
|
28
|
-
private started;
|
|
29
|
-
private handedOff;
|
|
30
|
-
private exitRequested;
|
|
31
|
-
private lastClearAt;
|
|
32
|
-
constructor();
|
|
33
|
-
get isExitRequested(): boolean;
|
|
34
|
-
start(): void;
|
|
35
|
-
pause(): void;
|
|
36
|
-
resume(): void;
|
|
37
|
-
waitForFirstFrame(): Promise<void>;
|
|
38
|
-
binding(): InteractiveShellBinding;
|
|
39
|
-
showError(error: unknown): void;
|
|
40
|
-
fail(error: unknown): Promise<void>;
|
|
41
|
-
stop(): void;
|
|
42
|
-
select<T>(title: string, options: Array<{
|
|
43
|
-
label: string;
|
|
44
|
-
value: T;
|
|
45
|
-
}>): Promise<T | undefined>;
|
|
46
|
-
confirm(title: string, message: string): Promise<boolean>;
|
|
47
|
-
input(title: string, placeholder?: string): Promise<string | undefined>;
|
|
48
|
-
selectSession(currentSessionsLoader: SessionsLoader, allSessionsLoader: SessionsLoader): Promise<string | null>;
|
|
49
|
-
private showModal;
|
|
50
|
-
private restoreShellLayout;
|
|
51
|
-
private installInputHandlers;
|
|
52
|
-
private pasteClipboard;
|
|
53
|
-
}
|
|
54
|
-
export {};
|
|
55
|
-
//# sourceMappingURL=interactive-shell.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-shell.d.ts","sourceRoot":"","sources":["../../src/startup/interactive-shell.ts"],"names":[],"mappings":"AAIA,OAAO,EAEN,KAAK,qBAAqB,EAM1B,GAAG,EACH,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,kDAAkD,CAAC;AAGhF,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,qBAAqB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,GAAG,CAAC;IACR,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,kBAAkB,CAAC;IAChC,kBAAkB,EAAE,sBAAsB,EAAE,CAAC;CAC7C;AAED,KAAK,cAAc,GAAG,CAAC,UAAU,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AAwCnF,qBAAa,uBAAuB;IACnC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;IACjB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,CAAM;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsD;IAC7E,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;IAExB,cAeC;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,OAAO,IAAI,uBAAuB,CAQjC;IAED,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAO9B;IAEK,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAOxC;IAED,IAAI,IAAI,IAAI,CAQX;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;IAQjB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,oBAAoB;YA6Bd,cAAc;CA4B5B","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\tContainer,\n\ttype EditorImageAttachment,\n\ttype EditorTheme,\n\tProcessTerminal,\n\tSpacer,\n\tsetKeybindings,\n\tText,\n\tTUI,\n} from \"@ashx-j/lunr-tui\";\nimport { KeybindingsManager } from \"../core/keybindings.ts\";\nimport type { SessionInfo, SessionListProgress } from \"../core/session-manager.ts\";\nimport { CustomEditor } from \"../modes/interactive/components/custom-editor.ts\";\nimport { markStartupMilestone } from \"./startup-milestones.ts\";\n\nexport interface StartupShellSubmission {\n\ttext: string;\n\tattachments: EditorImageAttachment[];\n}\n\nexport interface InteractiveShellBinding {\n\tui: TUI;\n\teditor: CustomEditor;\n\tkeybindings: KeybindingsManager;\n\tpendingSubmissions: StartupShellSubmission[];\n}\n\ntype SessionsLoader = (onProgress?: SessionListProgress) => Promise<SessionInfo[]>;\n\nconst identity = (text: string) => text;\nconst shellEditorTheme: EditorTheme = {\n\tborderColor: (text) => `\\x1b[38;5;60m${text}\\x1b[0m`,\n\tselectList: {\n\t\tselectedPrefix: identity,\n\t\tselectedText: identity,\n\t\tdescription: identity,\n\t\tscrollInfo: identity,\n\t\tnoMatch: identity,\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\tmarkStartupMilestone(\"input_handler_armed\");\n\t\tsuper.start(onInput, onResize);\n\t\tmarkStartupMilestone(\"raw_mode_active\");\n\t}\n\n\toverride write(data: string): void {\n\t\tsuper.write(data);\n\t\t// Narrow terminals wrap the status line, so do not key off a substring.\n\t\tif (this.watchForFirstFrame && data.length > 0) {\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 InteractiveStartupShell {\n\treadonly ui: TUI;\n\treadonly editor: CustomEditor;\n\treadonly keybindings: KeybindingsManager;\n\treadonly pendingSubmissions: StartupShellSubmission[] = [];\n\tprivate readonly terminal: StartupProcessTerminal;\n\tprivate readonly status = new Text(\"Starting lunR. You can type now.\", 1, 0);\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\n\tconstructor() {\n\t\tthis.terminal = new StartupProcessTerminal();\n\t\tthis.ui = new TUI(this.terminal);\n\t\tthis.keybindings = KeybindingsManager.create();\n\t\tsetKeybindings(this.keybindings);\n\t\tthis.editor = new CustomEditor(this.ui, shellEditorTheme, this.keybindings, { paddingX: 1 });\n\t\tthis.editorContainer.addChild(this.editor);\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.restoreShellLayout();\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.restoreShellLayout();\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\tbinding(): InteractiveShellBinding {\n\t\tthis.handedOff = true;\n\t\treturn {\n\t\t\tui: this.ui,\n\t\t\teditor: this.editor,\n\t\t\tkeybindings: this.keybindings,\n\t\t\tpendingSubmissions: this.pendingSubmissions,\n\t\t};\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.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.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.restoreShellLayout();\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.restoreShellLayout();\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.restoreShellLayout();\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.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 restoreShellLayout(): void {\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.status);\n\t\tthis.ui.addChild(this.editorContainer);\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.editor.onSubmit = (text) => {\n\t\t\tconst attachments = this.editor.takePendingImages();\n\t\t\tif (!text.trim()) return;\n\t\t\tif (this.pendingSubmissions.length > 0) {\n\t\t\t\tthis.editor.setText(text);\n\t\t\t\tthis.editor.restoreImageMarkers(attachments);\n\t\t\t\tthis.status.setText(\"One prompt is already queued. Your current draft will stay in the editor.\");\n\t\t\t\tthis.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.pendingSubmissions.push({ text, attachments });\n\t\t\tthis.editor.addToHistory(text);\n\t\t\tthis.status.setText(\"Prompt queued. Finishing startup before it can run.\");\n\t\t\tthis.ui.requestRender();\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\tconst id = this.editor.insertImageMarker({ path: filePath, mimeType: image.mimeType });\n\t\t\t\tthis.status.setText(`Pasted [image_${id}] while startup continues.`);\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,264 +0,0 @@
|
|
|
1
|
-
import * as crypto from "node:crypto";
|
|
2
|
-
import * as fs from "node:fs";
|
|
3
|
-
import * as os from "node:os";
|
|
4
|
-
import * as path from "node:path";
|
|
5
|
-
import { Container, ProcessTerminal, Spacer, setKeybindings, Text, TUI, } from "@ashx-j/lunr-tui";
|
|
6
|
-
import { KeybindingsManager } from "../core/keybindings.js";
|
|
7
|
-
import { CustomEditor } from "../modes/interactive/components/custom-editor.js";
|
|
8
|
-
import { markStartupMilestone } from "./startup-milestones.js";
|
|
9
|
-
const identity = (text) => text;
|
|
10
|
-
const shellEditorTheme = {
|
|
11
|
-
borderColor: (text) => `\x1b[38;5;60m${text}\x1b[0m`,
|
|
12
|
-
selectList: {
|
|
13
|
-
selectedPrefix: identity,
|
|
14
|
-
selectedText: identity,
|
|
15
|
-
description: identity,
|
|
16
|
-
scrollInfo: identity,
|
|
17
|
-
noMatch: identity,
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
class StartupProcessTerminal extends ProcessTerminal {
|
|
21
|
-
watchForFirstFrame = false;
|
|
22
|
-
firstFrameCallback;
|
|
23
|
-
setFirstFrameCallback(callback) {
|
|
24
|
-
this.firstFrameCallback = callback;
|
|
25
|
-
this.watchForFirstFrame = true;
|
|
26
|
-
}
|
|
27
|
-
start(onInput, onResize) {
|
|
28
|
-
markStartupMilestone("input_handler_armed");
|
|
29
|
-
super.start(onInput, onResize);
|
|
30
|
-
markStartupMilestone("raw_mode_active");
|
|
31
|
-
}
|
|
32
|
-
write(data) {
|
|
33
|
-
super.write(data);
|
|
34
|
-
// Narrow terminals wrap the status line, so do not key off a substring.
|
|
35
|
-
if (this.watchForFirstFrame && data.length > 0) {
|
|
36
|
-
this.watchForFirstFrame = false;
|
|
37
|
-
markStartupMilestone("first_frame_committed");
|
|
38
|
-
this.firstFrameCallback?.();
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
export class InteractiveStartupShell {
|
|
43
|
-
ui;
|
|
44
|
-
editor;
|
|
45
|
-
keybindings;
|
|
46
|
-
pendingSubmissions = [];
|
|
47
|
-
terminal;
|
|
48
|
-
status = new Text("Starting lunR. You can type now.", 1, 0);
|
|
49
|
-
editorContainer = new Container();
|
|
50
|
-
firstFramePromise;
|
|
51
|
-
resolveFirstFrame;
|
|
52
|
-
exitPromise;
|
|
53
|
-
resolveExit;
|
|
54
|
-
started = false;
|
|
55
|
-
handedOff = false;
|
|
56
|
-
exitRequested = false;
|
|
57
|
-
lastClearAt = 0;
|
|
58
|
-
constructor() {
|
|
59
|
-
this.terminal = new StartupProcessTerminal();
|
|
60
|
-
this.ui = new TUI(this.terminal);
|
|
61
|
-
this.keybindings = KeybindingsManager.create();
|
|
62
|
-
setKeybindings(this.keybindings);
|
|
63
|
-
this.editor = new CustomEditor(this.ui, shellEditorTheme, this.keybindings, { paddingX: 1 });
|
|
64
|
-
this.editorContainer.addChild(this.editor);
|
|
65
|
-
this.firstFramePromise = new Promise((resolve) => {
|
|
66
|
-
this.resolveFirstFrame = resolve;
|
|
67
|
-
});
|
|
68
|
-
this.exitPromise = new Promise((resolve) => {
|
|
69
|
-
this.resolveExit = resolve;
|
|
70
|
-
});
|
|
71
|
-
this.terminal.setFirstFrameCallback(this.resolveFirstFrame);
|
|
72
|
-
this.installInputHandlers();
|
|
73
|
-
}
|
|
74
|
-
get isExitRequested() {
|
|
75
|
-
return this.exitRequested;
|
|
76
|
-
}
|
|
77
|
-
start() {
|
|
78
|
-
if (this.started)
|
|
79
|
-
return;
|
|
80
|
-
this.restoreShellLayout();
|
|
81
|
-
this.ui.setAlternateScreen(true);
|
|
82
|
-
this.ui.start();
|
|
83
|
-
this.started = true;
|
|
84
|
-
}
|
|
85
|
-
pause() {
|
|
86
|
-
if (!this.started || this.handedOff)
|
|
87
|
-
return;
|
|
88
|
-
this.ui.stop();
|
|
89
|
-
this.started = false;
|
|
90
|
-
}
|
|
91
|
-
resume() {
|
|
92
|
-
if (this.started || this.handedOff || this.exitRequested)
|
|
93
|
-
return;
|
|
94
|
-
this.restoreShellLayout();
|
|
95
|
-
this.ui.start();
|
|
96
|
-
this.started = true;
|
|
97
|
-
}
|
|
98
|
-
waitForFirstFrame() {
|
|
99
|
-
return this.firstFramePromise;
|
|
100
|
-
}
|
|
101
|
-
binding() {
|
|
102
|
-
this.handedOff = true;
|
|
103
|
-
return {
|
|
104
|
-
ui: this.ui,
|
|
105
|
-
editor: this.editor,
|
|
106
|
-
keybindings: this.keybindings,
|
|
107
|
-
pendingSubmissions: this.pendingSubmissions,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
showError(error) {
|
|
111
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
112
|
-
this.status.setText(`Startup failed: ${message}\nYour draft is intact. Press Ctrl+C twice or Ctrl+D on an empty draft to exit.`);
|
|
113
|
-
this.editor.disableSubmit = true;
|
|
114
|
-
this.ui.requestRender();
|
|
115
|
-
}
|
|
116
|
-
async fail(error) {
|
|
117
|
-
this.showError(error);
|
|
118
|
-
if (process.env.PI_STARTUP_BENCHMARK === "1") {
|
|
119
|
-
this.stop();
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
await this.exitPromise;
|
|
123
|
-
}
|
|
124
|
-
stop() {
|
|
125
|
-
if (this.exitRequested)
|
|
126
|
-
return;
|
|
127
|
-
this.exitRequested = true;
|
|
128
|
-
if (this.started) {
|
|
129
|
-
this.ui.stop();
|
|
130
|
-
this.started = false;
|
|
131
|
-
}
|
|
132
|
-
this.resolveExit();
|
|
133
|
-
}
|
|
134
|
-
async select(title, options) {
|
|
135
|
-
const { ExtensionSelectorComponent } = await import("../modes/interactive/components/extension-selector.js");
|
|
136
|
-
return new Promise((resolve) => {
|
|
137
|
-
let settled = false;
|
|
138
|
-
const finish = (value) => {
|
|
139
|
-
if (settled)
|
|
140
|
-
return;
|
|
141
|
-
settled = true;
|
|
142
|
-
this.restoreShellLayout();
|
|
143
|
-
resolve(value);
|
|
144
|
-
};
|
|
145
|
-
const selector = new ExtensionSelectorComponent(title, options.map((option) => option.label), (label) => finish(options.find((option) => option.label === label)?.value), () => finish(undefined), { tui: this.ui });
|
|
146
|
-
this.showModal(selector, selector);
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
async confirm(title, message) {
|
|
150
|
-
return ((await this.select(`${title}\n${message}`, [
|
|
151
|
-
{ label: "Yes", value: true },
|
|
152
|
-
{ label: "No", value: false },
|
|
153
|
-
])) ?? false);
|
|
154
|
-
}
|
|
155
|
-
async input(title, placeholder) {
|
|
156
|
-
const { ExtensionInputComponent } = await import("../modes/interactive/components/extension-input.js");
|
|
157
|
-
return new Promise((resolve) => {
|
|
158
|
-
let settled = false;
|
|
159
|
-
const finish = (value) => {
|
|
160
|
-
if (settled)
|
|
161
|
-
return;
|
|
162
|
-
settled = true;
|
|
163
|
-
input.dispose();
|
|
164
|
-
this.restoreShellLayout();
|
|
165
|
-
resolve(value);
|
|
166
|
-
};
|
|
167
|
-
const input = new ExtensionInputComponent(title, placeholder, finish, () => finish(undefined), {
|
|
168
|
-
tui: this.ui,
|
|
169
|
-
});
|
|
170
|
-
this.showModal(input, input);
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
async selectSession(currentSessionsLoader, allSessionsLoader) {
|
|
174
|
-
const { SessionSelectorComponent } = await import("../modes/interactive/components/session-selector.js");
|
|
175
|
-
return new Promise((resolve) => {
|
|
176
|
-
let settled = false;
|
|
177
|
-
const finish = (path) => {
|
|
178
|
-
if (settled)
|
|
179
|
-
return;
|
|
180
|
-
settled = true;
|
|
181
|
-
this.restoreShellLayout();
|
|
182
|
-
resolve(path);
|
|
183
|
-
};
|
|
184
|
-
const selector = new SessionSelectorComponent(currentSessionsLoader, allSessionsLoader, (path) => finish(path), () => finish(null), () => this.stop(), () => this.ui.requestRender(), { showRenameHint: false, keybindings: this.keybindings });
|
|
185
|
-
this.showModal(selector, selector.getSessionList());
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
showModal(component, focus) {
|
|
189
|
-
this.ui.pinFrom(null);
|
|
190
|
-
this.ui.clear();
|
|
191
|
-
this.ui.addChild(component);
|
|
192
|
-
this.ui.setFocus(focus);
|
|
193
|
-
this.ui.requestRender(true);
|
|
194
|
-
}
|
|
195
|
-
restoreShellLayout() {
|
|
196
|
-
this.ui.pinFrom(null);
|
|
197
|
-
this.ui.clear();
|
|
198
|
-
this.ui.addChild(new Spacer(1));
|
|
199
|
-
this.ui.addChild(this.status);
|
|
200
|
-
this.ui.addChild(this.editorContainer);
|
|
201
|
-
this.ui.pinFrom(this.editorContainer);
|
|
202
|
-
this.ui.setFocus(this.editor);
|
|
203
|
-
this.ui.requestRender(true);
|
|
204
|
-
}
|
|
205
|
-
installInputHandlers() {
|
|
206
|
-
this.editor.onAction("app.clear", () => {
|
|
207
|
-
const now = Date.now();
|
|
208
|
-
if (this.editor.getText().length === 0 && now - this.lastClearAt < 500) {
|
|
209
|
-
this.stop();
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
this.editor.setText("");
|
|
213
|
-
this.lastClearAt = now;
|
|
214
|
-
});
|
|
215
|
-
this.editor.onCtrlD = () => this.stop();
|
|
216
|
-
this.editor.onPasteImage = () => void this.pasteClipboard();
|
|
217
|
-
this.editor.onSubmit = (text) => {
|
|
218
|
-
const attachments = this.editor.takePendingImages();
|
|
219
|
-
if (!text.trim())
|
|
220
|
-
return;
|
|
221
|
-
if (this.pendingSubmissions.length > 0) {
|
|
222
|
-
this.editor.setText(text);
|
|
223
|
-
this.editor.restoreImageMarkers(attachments);
|
|
224
|
-
this.status.setText("One prompt is already queued. Your current draft will stay in the editor.");
|
|
225
|
-
this.ui.requestRender();
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
this.pendingSubmissions.push({ text, attachments });
|
|
229
|
-
this.editor.addToHistory(text);
|
|
230
|
-
this.status.setText("Prompt queued. Finishing startup before it can run.");
|
|
231
|
-
this.ui.requestRender();
|
|
232
|
-
};
|
|
233
|
-
}
|
|
234
|
-
async pasteClipboard() {
|
|
235
|
-
try {
|
|
236
|
-
const [{ readClipboardText }, { extensionForImageMimeType, readClipboardImage }] = await Promise.all([
|
|
237
|
-
import("../utils/clipboard.js"),
|
|
238
|
-
import("../utils/clipboard-image.js"),
|
|
239
|
-
]);
|
|
240
|
-
const image = await readClipboardImage();
|
|
241
|
-
if (image) {
|
|
242
|
-
const extension = extensionForImageMimeType(image.mimeType) ?? "png";
|
|
243
|
-
const filePath = path.join(os.tmpdir(), `lunr-clipboard-${crypto.randomUUID()}.${extension}`);
|
|
244
|
-
fs.writeFileSync(filePath, Buffer.from(image.bytes));
|
|
245
|
-
const id = this.editor.insertImageMarker({ path: filePath, mimeType: image.mimeType });
|
|
246
|
-
this.status.setText(`Pasted [image_${id}] while startup continues.`);
|
|
247
|
-
this.ui.requestRender();
|
|
248
|
-
return;
|
|
249
|
-
}
|
|
250
|
-
const text = await readClipboardText();
|
|
251
|
-
if (text) {
|
|
252
|
-
this.editor.insertTextAtCursor(text);
|
|
253
|
-
this.ui.requestRender();
|
|
254
|
-
return;
|
|
255
|
-
}
|
|
256
|
-
this.status.setText("Clipboard contains no image or text.");
|
|
257
|
-
}
|
|
258
|
-
catch (error) {
|
|
259
|
-
this.status.setText(`Clipboard paste failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
260
|
-
}
|
|
261
|
-
this.ui.requestRender();
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
//# sourceMappingURL=interactive-shell.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-shell.js","sourceRoot":"","sources":["../../src/startup/interactive-shell.ts"],"names":[],"mappings":"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","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\tContainer,\n\ttype EditorImageAttachment,\n\ttype EditorTheme,\n\tProcessTerminal,\n\tSpacer,\n\tsetKeybindings,\n\tText,\n\tTUI,\n} from \"@ashx-j/lunr-tui\";\nimport { KeybindingsManager } from \"../core/keybindings.ts\";\nimport type { SessionInfo, SessionListProgress } from \"../core/session-manager.ts\";\nimport { CustomEditor } from \"../modes/interactive/components/custom-editor.ts\";\nimport { markStartupMilestone } from \"./startup-milestones.ts\";\n\nexport interface StartupShellSubmission {\n\ttext: string;\n\tattachments: EditorImageAttachment[];\n}\n\nexport interface InteractiveShellBinding {\n\tui: TUI;\n\teditor: CustomEditor;\n\tkeybindings: KeybindingsManager;\n\tpendingSubmissions: StartupShellSubmission[];\n}\n\ntype SessionsLoader = (onProgress?: SessionListProgress) => Promise<SessionInfo[]>;\n\nconst identity = (text: string) => text;\nconst shellEditorTheme: EditorTheme = {\n\tborderColor: (text) => `\\x1b[38;5;60m${text}\\x1b[0m`,\n\tselectList: {\n\t\tselectedPrefix: identity,\n\t\tselectedText: identity,\n\t\tdescription: identity,\n\t\tscrollInfo: identity,\n\t\tnoMatch: identity,\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\tmarkStartupMilestone(\"input_handler_armed\");\n\t\tsuper.start(onInput, onResize);\n\t\tmarkStartupMilestone(\"raw_mode_active\");\n\t}\n\n\toverride write(data: string): void {\n\t\tsuper.write(data);\n\t\t// Narrow terminals wrap the status line, so do not key off a substring.\n\t\tif (this.watchForFirstFrame && data.length > 0) {\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 InteractiveStartupShell {\n\treadonly ui: TUI;\n\treadonly editor: CustomEditor;\n\treadonly keybindings: KeybindingsManager;\n\treadonly pendingSubmissions: StartupShellSubmission[] = [];\n\tprivate readonly terminal: StartupProcessTerminal;\n\tprivate readonly status = new Text(\"Starting lunR. You can type now.\", 1, 0);\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\n\tconstructor() {\n\t\tthis.terminal = new StartupProcessTerminal();\n\t\tthis.ui = new TUI(this.terminal);\n\t\tthis.keybindings = KeybindingsManager.create();\n\t\tsetKeybindings(this.keybindings);\n\t\tthis.editor = new CustomEditor(this.ui, shellEditorTheme, this.keybindings, { paddingX: 1 });\n\t\tthis.editorContainer.addChild(this.editor);\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.restoreShellLayout();\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.restoreShellLayout();\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\tbinding(): InteractiveShellBinding {\n\t\tthis.handedOff = true;\n\t\treturn {\n\t\t\tui: this.ui,\n\t\t\teditor: this.editor,\n\t\t\tkeybindings: this.keybindings,\n\t\t\tpendingSubmissions: this.pendingSubmissions,\n\t\t};\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.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.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.restoreShellLayout();\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.restoreShellLayout();\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.restoreShellLayout();\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.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 restoreShellLayout(): void {\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.status);\n\t\tthis.ui.addChild(this.editorContainer);\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.editor.onSubmit = (text) => {\n\t\t\tconst attachments = this.editor.takePendingImages();\n\t\t\tif (!text.trim()) return;\n\t\t\tif (this.pendingSubmissions.length > 0) {\n\t\t\t\tthis.editor.setText(text);\n\t\t\t\tthis.editor.restoreImageMarkers(attachments);\n\t\t\t\tthis.status.setText(\"One prompt is already queued. Your current draft will stay in the editor.\");\n\t\t\t\tthis.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.pendingSubmissions.push({ text, attachments });\n\t\t\tthis.editor.addToHistory(text);\n\t\t\tthis.status.setText(\"Prompt queued. Finishing startup before it can run.\");\n\t\t\tthis.ui.requestRender();\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\tconst id = this.editor.insertImageMarker({ path: filePath, mimeType: image.mimeType });\n\t\t\t\tthis.status.setText(`Pasted [image_${id}] while startup continues.`);\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"]}
|
|
@@ -17,7 +17,7 @@ var KEYBINDINGS = {
|
|
|
17
17
|
description: "Suspend to background"
|
|
18
18
|
},
|
|
19
19
|
"app.thinking.cycle": {
|
|
20
|
-
defaultKeys:
|
|
20
|
+
defaultKeys: "ctrl+t",
|
|
21
21
|
description: "Cycle thinking level"
|
|
22
22
|
},
|
|
23
23
|
"app.mode.cycle": {
|
|
@@ -43,7 +43,7 @@ var KEYBINDINGS = {
|
|
|
43
43
|
description: "Scroll chat down"
|
|
44
44
|
},
|
|
45
45
|
"app.thinking.toggle": {
|
|
46
|
-
defaultKeys:
|
|
46
|
+
defaultKeys: [],
|
|
47
47
|
description: "Toggle thinking blocks"
|
|
48
48
|
},
|
|
49
49
|
"app.session.toggleNamedFilter": {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { createRequire as __lunrRequire } from "node:module"; const require = __lunrRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
getAgentPath
|
|
4
|
-
} from "./chunk-4HXHDDCF.js";
|
|
5
2
|
import {
|
|
6
3
|
formatToolName,
|
|
7
4
|
isToolExcluded,
|
|
8
5
|
resourceNameToToolName
|
|
9
6
|
} from "./chunk-ARC4KOTI.js";
|
|
7
|
+
import {
|
|
8
|
+
getAgentPath
|
|
9
|
+
} from "./chunk-4HXHDDCF.js";
|
|
10
10
|
|
|
11
11
|
// packages/coding-agent/dist/builtin-extensions/pi-mcp-adapter/config.js
|
|
12
12
|
import { existsSync, readFileSync, writeFileSync, mkdirSync, renameSync } from "node:fs";
|