pi-kot 0.1.21 → 0.1.22
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/bin/pi-kot.mjs +148 -0
- package/client/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/client/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/client/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/client/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/client/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/client/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/client/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/client/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/client/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/client/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/client/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/client/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/client/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/client/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/client/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/client/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/client/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/client/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/client/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/client/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/client/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/client/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/client/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/client/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/client/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/client/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/client/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/client/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/client/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/client/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/client/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/client/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/client/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/client/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/client/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/client/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/client/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/client/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/client/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/client/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/client/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/client/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/client/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/client/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/client/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/client/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/client/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/client/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/client/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/client/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/client/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/client/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/client/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/client/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/client/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/client/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/client/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/client/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/client/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/client/assets/index-CE_Na97I.js +75 -0
- package/client/assets/index-CE_Na97I.js.map +1 -0
- package/client/assets/index-QP95zkpd.css +1 -0
- package/client/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/client/assets/vendor-codemirror-CD3uCqRj.js +48 -0
- package/client/assets/vendor-codemirror-CD3uCqRj.js.map +1 -0
- package/client/assets/vendor-icons-W8thHNMl.js +2 -0
- package/client/assets/vendor-icons-W8thHNMl.js.map +1 -0
- package/client/assets/vendor-katex-4z5K3dyr.js +260 -0
- package/client/assets/vendor-katex-4z5K3dyr.js.map +1 -0
- package/client/assets/vendor-katex-CYlHEDRF.css +1 -0
- package/client/assets/vendor-markdown-BSzxNR_7.js +35 -0
- package/client/assets/vendor-markdown-BSzxNR_7.js.map +1 -0
- package/client/assets/vendor-prism-CQGp13s2.js +4 -0
- package/client/assets/vendor-prism-CQGp13s2.js.map +1 -0
- package/client/assets/vendor-xterm-BrP-ENHg.css +1 -0
- package/client/assets/vendor-xterm-DXwh06H3.js +36 -0
- package/client/assets/vendor-xterm-DXwh06H3.js.map +1 -0
- package/client/index.html +23 -0
- package/package.json +5 -3
- package/server/ask-user-question/envelope.d.ts +11 -0
- package/server/ask-user-question/envelope.d.ts.map +1 -0
- package/server/ask-user-question/envelope.js +41 -0
- package/server/ask-user-question/envelope.js.map +1 -0
- package/server/ask-user-question/plan-mode-question-tool.d.ts +26 -0
- package/server/ask-user-question/plan-mode-question-tool.d.ts.map +1 -0
- package/server/ask-user-question/plan-mode-question-tool.js +273 -0
- package/server/ask-user-question/plan-mode-question-tool.js.map +1 -0
- package/server/ask-user-question/prompt-strings.d.ts +4 -0
- package/server/ask-user-question/prompt-strings.d.ts.map +1 -0
- package/server/ask-user-question/prompt-strings.js +18 -0
- package/server/ask-user-question/prompt-strings.js.map +1 -0
- package/server/ask-user-question/registry.d.ts +39 -0
- package/server/ask-user-question/registry.d.ts.map +1 -0
- package/server/ask-user-question/registry.js +124 -0
- package/server/ask-user-question/registry.js.map +1 -0
- package/server/ask-user-question/tool.d.ts +4 -0
- package/server/ask-user-question/tool.d.ts.map +1 -0
- package/server/ask-user-question/tool.js +68 -0
- package/server/ask-user-question/tool.js.map +1 -0
- package/server/ask-user-question/types.d.ts +50 -0
- package/server/ask-user-question/types.d.ts.map +1 -0
- package/server/ask-user-question/types.js +7 -0
- package/server/ask-user-question/types.js.map +1 -0
- package/server/ask-user-question/validate.d.ts +3 -0
- package/server/ask-user-question/validate.d.ts.map +1 -0
- package/server/ask-user-question/validate.js +67 -0
- package/server/ask-user-question/validate.js.map +1 -0
- package/server/clone-provider.d.ts +55 -0
- package/server/clone-provider.d.ts.map +1 -0
- package/server/clone-provider.js +172 -0
- package/server/clone-provider.js.map +1 -0
- package/server/compaction-cards.d.ts +62 -0
- package/server/compaction-cards.d.ts.map +1 -0
- package/server/compaction-cards.js +180 -0
- package/server/compaction-cards.js.map +1 -0
- package/server/compaction-continuation.d.ts +112 -0
- package/server/compaction-continuation.d.ts.map +1 -0
- package/server/compaction-continuation.js +65 -0
- package/server/compaction-continuation.js.map +1 -0
- package/server/config-store.d.ts +97 -0
- package/server/config-store.d.ts.map +1 -0
- package/server/config-store.js +351 -0
- package/server/config-store.js.map +1 -0
- package/server/config.d.ts +24 -0
- package/server/config.d.ts.map +1 -0
- package/server/config.js +67 -0
- package/server/config.js.map +1 -0
- package/server/event-stream.d.ts +28 -0
- package/server/event-stream.d.ts.map +1 -0
- package/server/event-stream.js +153 -0
- package/server/event-stream.js.map +1 -0
- package/server/extension-manager.d.ts +116 -0
- package/server/extension-manager.d.ts.map +1 -0
- package/server/extension-manager.js +586 -0
- package/server/extension-manager.js.map +1 -0
- package/server/extension-scanner.d.ts +26 -0
- package/server/extension-scanner.d.ts.map +1 -0
- package/server/extension-scanner.js +107 -0
- package/server/extension-scanner.js.map +1 -0
- package/server/extension-ui-bridge.d.ts +35 -0
- package/server/extension-ui-bridge.d.ts.map +1 -0
- package/server/extension-ui-bridge.js +228 -0
- package/server/extension-ui-bridge.js.map +1 -0
- package/server/file-manager.d.ts +79 -0
- package/server/file-manager.d.ts.map +1 -0
- package/server/file-manager.js +535 -0
- package/server/file-manager.js.map +1 -0
- package/server/file-searcher.d.ts +29 -0
- package/server/file-searcher.d.ts.map +1 -0
- package/server/file-searcher.js +318 -0
- package/server/file-searcher.js.map +1 -0
- package/server/git-operations.d.ts +346 -0
- package/server/git-operations.d.ts.map +1 -0
- package/server/git-operations.js +884 -0
- package/server/git-operations.js.map +1 -0
- package/server/hunk-stager.d.ts +56 -0
- package/server/hunk-stager.d.ts.map +1 -0
- package/server/hunk-stager.js +137 -0
- package/server/hunk-stager.js.map +1 -0
- package/server/index.d.ts +21 -0
- package/server/index.d.ts.map +1 -0
- package/server/index.js +262 -0
- package/server/index.js.map +1 -0
- package/server/mcp/config.d.ts +23 -0
- package/server/mcp/config.d.ts.map +1 -0
- package/server/mcp/config.js +139 -0
- package/server/mcp/config.js.map +1 -0
- package/server/mcp/manager.d.ts +40 -0
- package/server/mcp/manager.d.ts.map +1 -0
- package/server/mcp/manager.js +435 -0
- package/server/mcp/manager.js.map +1 -0
- package/server/mcp/stdio-trust.d.ts +5 -0
- package/server/mcp/stdio-trust.d.ts.map +1 -0
- package/server/mcp/stdio-trust.js +78 -0
- package/server/mcp/stdio-trust.js.map +1 -0
- package/server/mcp/tool-bridge.d.ts +33 -0
- package/server/mcp/tool-bridge.d.ts.map +1 -0
- package/server/mcp/tool-bridge.js +138 -0
- package/server/mcp/tool-bridge.js.map +1 -0
- package/server/orchestration/config.d.ts +5 -0
- package/server/orchestration/config.d.ts.map +1 -0
- package/server/orchestration/config.js +35 -0
- package/server/orchestration/config.js.map +1 -0
- package/server/orchestration/event-bridge.d.ts +32 -0
- package/server/orchestration/event-bridge.d.ts.map +1 -0
- package/server/orchestration/event-bridge.js +110 -0
- package/server/orchestration/event-bridge.js.map +1 -0
- package/server/orchestration/inbox.d.ts +9 -0
- package/server/orchestration/inbox.d.ts.map +1 -0
- package/server/orchestration/inbox.js +186 -0
- package/server/orchestration/inbox.js.map +1 -0
- package/server/orchestration/init.d.ts +2 -0
- package/server/orchestration/init.d.ts.map +1 -0
- package/server/orchestration/init.js +22 -0
- package/server/orchestration/init.js.map +1 -0
- package/server/orchestration/store.d.ts +33 -0
- package/server/orchestration/store.d.ts.map +1 -0
- package/server/orchestration/store.js +331 -0
- package/server/orchestration/store.js.map +1 -0
- package/server/orchestration/tools.d.ts +15 -0
- package/server/orchestration/tools.d.ts.map +1 -0
- package/server/orchestration/tools.js +621 -0
- package/server/orchestration/tools.js.map +1 -0
- package/server/orchestration/types.d.ts +68 -0
- package/server/orchestration/types.d.ts.map +1 -0
- package/server/orchestration/types.js +43 -0
- package/server/orchestration/types.js.map +1 -0
- package/server/orchestration/worker-lifecycle.d.ts +15 -0
- package/server/orchestration/worker-lifecycle.d.ts.map +1 -0
- package/server/orchestration/worker-lifecycle.js +45 -0
- package/server/orchestration/worker-lifecycle.js.map +1 -0
- package/server/path-refs.d.ts +5 -0
- package/server/path-refs.d.ts.map +1 -0
- package/server/path-refs.js +249 -0
- package/server/path-refs.js.map +1 -0
- package/server/routes/_schemas.d.ts +16 -0
- package/server/routes/_schemas.d.ts.map +1 -0
- package/server/routes/_schemas.js +12 -0
- package/server/routes/_schemas.js.map +1 -0
- package/server/routes/ask-user-question.d.ts +3 -0
- package/server/routes/ask-user-question.d.ts.map +1 -0
- package/server/routes/ask-user-question.js +105 -0
- package/server/routes/ask-user-question.js.map +1 -0
- package/server/routes/auth.d.ts +8 -0
- package/server/routes/auth.d.ts.map +1 -0
- package/server/routes/auth.js +225 -0
- package/server/routes/auth.js.map +1 -0
- package/server/routes/config.d.ts +3 -0
- package/server/routes/config.d.ts.map +1 -0
- package/server/routes/config.js +602 -0
- package/server/routes/config.js.map +1 -0
- package/server/routes/control.d.ts +3 -0
- package/server/routes/control.d.ts.map +1 -0
- package/server/routes/control.js +365 -0
- package/server/routes/control.js.map +1 -0
- package/server/routes/exec.d.ts +3 -0
- package/server/routes/exec.d.ts.map +1 -0
- package/server/routes/exec.js +426 -0
- package/server/routes/exec.js.map +1 -0
- package/server/routes/extension-commands.d.ts +22 -0
- package/server/routes/extension-commands.d.ts.map +1 -0
- package/server/routes/extension-commands.js +178 -0
- package/server/routes/extension-commands.js.map +1 -0
- package/server/routes/extensions.d.ts +8 -0
- package/server/routes/extensions.d.ts.map +1 -0
- package/server/routes/extensions.js +414 -0
- package/server/routes/extensions.js.map +1 -0
- package/server/routes/files.d.ts +3 -0
- package/server/routes/files.d.ts.map +1 -0
- package/server/routes/files.js +835 -0
- package/server/routes/files.js.map +1 -0
- package/server/routes/git.d.ts +3 -0
- package/server/routes/git.d.ts.map +1 -0
- package/server/routes/git.js +1058 -0
- package/server/routes/git.js.map +1 -0
- package/server/routes/mcp.d.ts +3 -0
- package/server/routes/mcp.d.ts.map +1 -0
- package/server/routes/mcp.js +403 -0
- package/server/routes/mcp.js.map +1 -0
- package/server/routes/orchestration.d.ts +3 -0
- package/server/routes/orchestration.d.ts.map +1 -0
- package/server/routes/orchestration.js +251 -0
- package/server/routes/orchestration.js.map +1 -0
- package/server/routes/projects.d.ts +3 -0
- package/server/routes/projects.d.ts.map +1 -0
- package/server/routes/projects.js +421 -0
- package/server/routes/projects.js.map +1 -0
- package/server/routes/prompt.d.ts +3 -0
- package/server/routes/prompt.d.ts.map +1 -0
- package/server/routes/prompt.js +311 -0
- package/server/routes/prompt.js.map +1 -0
- package/server/routes/session-extensions.d.ts +11 -0
- package/server/routes/session-extensions.d.ts.map +1 -0
- package/server/routes/session-extensions.js +171 -0
- package/server/routes/session-extensions.js.map +1 -0
- package/server/routes/sessions.d.ts +3 -0
- package/server/routes/sessions.d.ts.map +1 -0
- package/server/routes/sessions.js +706 -0
- package/server/routes/sessions.js.map +1 -0
- package/server/routes/skills.d.ts +14 -0
- package/server/routes/skills.d.ts.map +1 -0
- package/server/routes/skills.js +448 -0
- package/server/routes/skills.js.map +1 -0
- package/server/routes/stream.d.ts +3 -0
- package/server/routes/stream.d.ts.map +1 -0
- package/server/routes/stream.js +112 -0
- package/server/routes/stream.js.map +1 -0
- package/server/routes/terminal.d.ts +28 -0
- package/server/routes/terminal.d.ts.map +1 -0
- package/server/routes/terminal.js +211 -0
- package/server/routes/terminal.js.map +1 -0
- package/server/routes/tunnel.d.ts +13 -0
- package/server/routes/tunnel.d.ts.map +1 -0
- package/server/routes/tunnel.js +231 -0
- package/server/routes/tunnel.js.map +1 -0
- package/server/session-alerts.d.ts +28 -0
- package/server/session-alerts.d.ts.map +1 -0
- package/server/session-alerts.js +38 -0
- package/server/session-alerts.js.map +1 -0
- package/server/session-store.d.ts +164 -0
- package/server/session-store.d.ts.map +1 -0
- package/server/session-store.js +754 -0
- package/server/session-store.js.map +1 -0
- package/server/skill-policy.d.ts +47 -0
- package/server/skill-policy.d.ts.map +1 -0
- package/server/skill-policy.js +178 -0
- package/server/skill-policy.js.map +1 -0
- package/server/terminal-provider.d.ts +54 -0
- package/server/terminal-provider.d.ts.map +1 -0
- package/server/terminal-provider.js +220 -0
- package/server/terminal-provider.js.map +1 -0
- package/server/tool-policy.d.ts +39 -0
- package/server/tool-policy.d.ts.map +1 -0
- package/server/tool-policy.js +121 -0
- package/server/tool-policy.js.map +1 -0
- package/server/tunnel/executable-search.d.ts +43 -0
- package/server/tunnel/executable-search.d.ts.map +1 -0
- package/server/tunnel/executable-search.js +148 -0
- package/server/tunnel/executable-search.js.map +1 -0
- package/server/tunnel/install-help.d.ts +19 -0
- package/server/tunnel/install-help.d.ts.map +1 -0
- package/server/tunnel/install-help.js +47 -0
- package/server/tunnel/install-help.js.map +1 -0
- package/server/tunnel/providers/ngrok.d.ts +31 -0
- package/server/tunnel/providers/ngrok.d.ts.map +1 -0
- package/server/tunnel/providers/ngrok.js +461 -0
- package/server/tunnel/providers/ngrok.js.map +1 -0
- package/server/tunnel/registry.d.ts +13 -0
- package/server/tunnel/registry.d.ts.map +1 -0
- package/server/tunnel/registry.js +56 -0
- package/server/tunnel/registry.js.map +1 -0
- package/server/tunnel/service.d.ts +13 -0
- package/server/tunnel/service.d.ts.map +1 -0
- package/server/tunnel/service.js +156 -0
- package/server/tunnel/service.js.map +1 -0
- package/server/tunnel/types.d.ts +163 -0
- package/server/tunnel/types.d.ts.map +1 -0
- package/server/tunnel/types.js +214 -0
- package/server/tunnel/types.js.map +1 -0
- package/server/ui-settings-store.d.ts +25 -0
- package/server/ui-settings-store.d.ts.map +1 -0
- package/server/ui-settings-store.js +91 -0
- package/server/ui-settings-store.js.map +1 -0
- package/server/workspace-store.d.ts +25 -0
- package/server/workspace-store.d.ts.map +1 -0
- package/server/workspace-store.js +157 -0
- package/server/workspace-store.js.map +1 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { registerPending } from "./registry.js";
|
|
2
|
+
import { validateQuestionnaire } from "./validate.js";
|
|
3
|
+
import { buildResult } from "./envelope.js";
|
|
4
|
+
import { PROMPT_GUIDELINES, PROMPT_SNIPPET, TOOL_DESCRIPTION } from "./prompt-strings.js";
|
|
5
|
+
import { MAX_HEADER_LENGTH, MAX_LABEL_LENGTH, MAX_OPTIONS, MAX_QUESTIONS, MIN_OPTIONS } from "./types.js";
|
|
6
|
+
export const ASK_USER_QUESTION_TOOL_NAME = "ask_user_question";
|
|
7
|
+
const inputSchema = {
|
|
8
|
+
type: "object",
|
|
9
|
+
required: ["questions"],
|
|
10
|
+
properties: {
|
|
11
|
+
questions: {
|
|
12
|
+
type: "array",
|
|
13
|
+
minItems: 1,
|
|
14
|
+
maxItems: MAX_QUESTIONS,
|
|
15
|
+
items: {
|
|
16
|
+
type: "object",
|
|
17
|
+
required: ["question", "header", "options"],
|
|
18
|
+
properties: {
|
|
19
|
+
question: { type: "string", minLength: 1 },
|
|
20
|
+
header: { type: "string", minLength: 1, maxLength: MAX_HEADER_LENGTH },
|
|
21
|
+
multiSelect: { type: "boolean" },
|
|
22
|
+
options: {
|
|
23
|
+
type: "array",
|
|
24
|
+
minItems: MIN_OPTIONS,
|
|
25
|
+
maxItems: MAX_OPTIONS,
|
|
26
|
+
items: {
|
|
27
|
+
type: "object",
|
|
28
|
+
required: ["label", "description"],
|
|
29
|
+
properties: {
|
|
30
|
+
label: { type: "string", minLength: 1, maxLength: MAX_LABEL_LENGTH },
|
|
31
|
+
description: { type: "string", minLength: 1 },
|
|
32
|
+
preview: { type: "string" },
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
export function createAskUserQuestionTool(sessionId) {
|
|
42
|
+
return {
|
|
43
|
+
name: ASK_USER_QUESTION_TOOL_NAME,
|
|
44
|
+
label: "Ask User Question",
|
|
45
|
+
description: TOOL_DESCRIPTION,
|
|
46
|
+
promptSnippet: PROMPT_SNIPPET,
|
|
47
|
+
promptGuidelines: [PROMPT_GUIDELINES],
|
|
48
|
+
parameters: inputSchema,
|
|
49
|
+
async execute(_toolCallId, params, signal) {
|
|
50
|
+
const validation = validateQuestionnaire(params);
|
|
51
|
+
if (!validation.ok) {
|
|
52
|
+
return buildResult([], { cancelled: true, questionCount: 0 });
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const { result } = registerPending({
|
|
56
|
+
sessionId,
|
|
57
|
+
questions: validation.params.questions,
|
|
58
|
+
signal,
|
|
59
|
+
});
|
|
60
|
+
return await result;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return buildResult([], { cancelled: true, questionCount: 0 });
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/ask-user-question/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE1G,MAAM,CAAC,MAAM,2BAA2B,GAAG,mBAAmB,CAAC;AAE/D,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,WAAW,CAAC;IACvB,UAAU,EAAE;QACV,SAAS,EAAE;YACT,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC;gBAC3C,UAAU,EAAE;oBACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE;oBAC1C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE;oBACtE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;oBAChC,OAAO,EAAE;wBACP,IAAI,EAAE,OAAO;wBACb,QAAQ,EAAE,WAAW;wBACrB,QAAQ,EAAE,WAAW;wBACrB,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC;4BAClC,UAAU,EAAE;gCACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;gCACpE,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE;gCAC7C,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;6BAC5B;yBACF;qBACF;iBACF;aACF;SACF;KACF;CACO,CAAC;AAEX,MAAM,UAAU,yBAAyB,CAAC,SAAiB;IACzD,OAAO;QACL,IAAI,EAAE,2BAA2B;QACjC,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,gBAAgB;QAC7B,aAAa,EAAE,cAAc;QAC7B,gBAAgB,EAAE,CAAC,iBAAiB,CAAC;QACrC,UAAU,EAAE,WAAW;QACvB,KAAK,CAAC,OAAO,CAAC,WAAmB,EAAE,MAAe,EAAE,MAA+B;YACjF,MAAM,UAAU,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;gBACnB,OAAO,WAAW,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC;oBACjC,SAAS;oBACT,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,SAAS;oBACtC,MAAM;iBACP,CAAC,CAAC;gBACH,OAAO,MAAM,MAAM,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,WAAW,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;KAC2B,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export declare const MAX_QUESTIONS = 4;
|
|
2
|
+
export declare const MIN_OPTIONS = 2;
|
|
3
|
+
export declare const MAX_OPTIONS = 4;
|
|
4
|
+
export declare const MAX_HEADER_LENGTH = 16;
|
|
5
|
+
export declare const MAX_LABEL_LENGTH = 60;
|
|
6
|
+
export declare const RESERVED_LABELS: readonly ["Other", "Type something.", "Chat about this", "Next"];
|
|
7
|
+
export interface Option {
|
|
8
|
+
label: string;
|
|
9
|
+
description: string;
|
|
10
|
+
preview?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface Question {
|
|
13
|
+
question: string;
|
|
14
|
+
header: string;
|
|
15
|
+
options: Option[];
|
|
16
|
+
multiSelect?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface AskUserQuestionParams {
|
|
19
|
+
questions: Question[];
|
|
20
|
+
}
|
|
21
|
+
export interface QuestionAnswer {
|
|
22
|
+
questionIndex: number;
|
|
23
|
+
question: string;
|
|
24
|
+
kind: "option" | "custom" | "chat" | "multi";
|
|
25
|
+
answer: string | null;
|
|
26
|
+
selected?: string[];
|
|
27
|
+
notes?: string;
|
|
28
|
+
preview?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface AskUserQuestionDetails {
|
|
31
|
+
answers: QuestionAnswer[];
|
|
32
|
+
cancelled: boolean;
|
|
33
|
+
error?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface AskUserQuestionResult {
|
|
36
|
+
content: {
|
|
37
|
+
type: "text";
|
|
38
|
+
text: string;
|
|
39
|
+
}[];
|
|
40
|
+
details: AskUserQuestionDetails;
|
|
41
|
+
}
|
|
42
|
+
export type ValidationResult = {
|
|
43
|
+
ok: true;
|
|
44
|
+
params: AskUserQuestionParams;
|
|
45
|
+
} | {
|
|
46
|
+
ok: false;
|
|
47
|
+
error: string;
|
|
48
|
+
message: string;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ask-user-question/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,eAAO,MAAM,eAAe,YAAI,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,CAAU,CAAC;AAEhG,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IAC7C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,OAAO,EAAE,sBAAsB,CAAC;CACjC;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,qBAAqB,CAAA;CAAE,GAC3C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const MAX_QUESTIONS = 4;
|
|
2
|
+
export const MIN_OPTIONS = 2;
|
|
3
|
+
export const MAX_OPTIONS = 4;
|
|
4
|
+
export const MAX_HEADER_LENGTH = 16;
|
|
5
|
+
export const MAX_LABEL_LENGTH = 60;
|
|
6
|
+
export const RESERVED_LABELS = ["Other", "Type something.", "Chat about this", "Next"];
|
|
7
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ask-user-question/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAC/B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAC7B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAC7B,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,CAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/ask-user-question/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,gBAAgB,EACtB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CAoEpE"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { RESERVED_LABELS, MAX_HEADER_LENGTH, MAX_LABEL_LENGTH, MAX_OPTIONS, MAX_QUESTIONS, MIN_OPTIONS, } from "./types.js";
|
|
2
|
+
export function validateQuestionnaire(raw) {
|
|
3
|
+
if (typeof raw !== "object" || raw === null) {
|
|
4
|
+
return { ok: false, error: "invalid_input", message: "Expected an object" };
|
|
5
|
+
}
|
|
6
|
+
const input = raw;
|
|
7
|
+
const questions = input.questions;
|
|
8
|
+
if (!Array.isArray(questions)) {
|
|
9
|
+
return { ok: false, error: "no_questions", message: "Missing questions array" };
|
|
10
|
+
}
|
|
11
|
+
if (questions.length < 1) {
|
|
12
|
+
return { ok: false, error: "no_questions", message: "At least one question required" };
|
|
13
|
+
}
|
|
14
|
+
if (questions.length > MAX_QUESTIONS) {
|
|
15
|
+
return { ok: false, error: "too_many_questions", message: `Max ${MAX_QUESTIONS} questions` };
|
|
16
|
+
}
|
|
17
|
+
for (const q of questions) {
|
|
18
|
+
if (typeof q !== "object" || q === null) {
|
|
19
|
+
return { ok: false, error: "invalid_question", message: "Question must be an object" };
|
|
20
|
+
}
|
|
21
|
+
const qq = q;
|
|
22
|
+
if (typeof qq.question !== "string" || qq.question.length === 0) {
|
|
23
|
+
return { ok: false, error: "missing_question_text", message: "Question text required" };
|
|
24
|
+
}
|
|
25
|
+
if (typeof qq.header !== "string" || qq.header.length === 0) {
|
|
26
|
+
return { ok: false, error: "missing_header", message: "Header required" };
|
|
27
|
+
}
|
|
28
|
+
if (qq.header.length > MAX_HEADER_LENGTH) {
|
|
29
|
+
return { ok: false, error: "header_too_long", message: `Header max ${MAX_HEADER_LENGTH} chars` };
|
|
30
|
+
}
|
|
31
|
+
const options = qq.options;
|
|
32
|
+
if (!Array.isArray(options)) {
|
|
33
|
+
return { ok: false, error: "too_few_options", message: "Options array required" };
|
|
34
|
+
}
|
|
35
|
+
if (options.length < MIN_OPTIONS) {
|
|
36
|
+
return { ok: false, error: "too_few_options", message: `Min ${MIN_OPTIONS} options` };
|
|
37
|
+
}
|
|
38
|
+
if (options.length > MAX_OPTIONS) {
|
|
39
|
+
return { ok: false, error: "too_many_options", message: `Max ${MAX_OPTIONS} options` };
|
|
40
|
+
}
|
|
41
|
+
const seenLabels = new Set();
|
|
42
|
+
for (const opt of options) {
|
|
43
|
+
if (typeof opt !== "object" || opt === null) {
|
|
44
|
+
return { ok: false, error: "invalid_option", message: "Option must be an object" };
|
|
45
|
+
}
|
|
46
|
+
const oo = opt;
|
|
47
|
+
if (typeof oo.label !== "string" || oo.label.length === 0) {
|
|
48
|
+
return { ok: false, error: "missing_label", message: "Option label required" };
|
|
49
|
+
}
|
|
50
|
+
if (oo.label.length > MAX_LABEL_LENGTH) {
|
|
51
|
+
return { ok: false, error: "label_too_long", message: `Label max ${MAX_LABEL_LENGTH} chars` };
|
|
52
|
+
}
|
|
53
|
+
if (typeof oo.description !== "string" || oo.description.length === 0) {
|
|
54
|
+
return { ok: false, error: "missing_description", message: "Option description required" };
|
|
55
|
+
}
|
|
56
|
+
if (RESERVED_LABELS.includes(oo.label)) {
|
|
57
|
+
return { ok: false, error: "reserved_label", message: `Label "${oo.label}" is reserved` };
|
|
58
|
+
}
|
|
59
|
+
if (seenLabels.has(oo.label)) {
|
|
60
|
+
return { ok: false, error: "duplicate_label", message: `Duplicate label "${oo.label}"` };
|
|
61
|
+
}
|
|
62
|
+
seenLabels.add(oo.label);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return { ok: true, params: input };
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/ask-user-question/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal `git clone` runner for pi-kot's "Clone repository" flow.
|
|
3
|
+
*
|
|
4
|
+
* Supports: HTTPS URLs, optional token auth (x-access-token), progress streaming,
|
|
5
|
+
* branch selection, TLS bypass for self-signed certs.
|
|
6
|
+
*/
|
|
7
|
+
export interface CloneOptions {
|
|
8
|
+
/** Repository URL — HTTPS only */
|
|
9
|
+
url: string;
|
|
10
|
+
/** Absolute path where the clone lands */
|
|
11
|
+
target: string;
|
|
12
|
+
/** Optional branch / tag / sha */
|
|
13
|
+
branch?: string;
|
|
14
|
+
/** Optional access token (PAT) */
|
|
15
|
+
token?: string;
|
|
16
|
+
/** Skip TLS verification */
|
|
17
|
+
insecureTls?: boolean;
|
|
18
|
+
/** Abort signal */
|
|
19
|
+
signal?: AbortSignal;
|
|
20
|
+
}
|
|
21
|
+
export type CloneEvent = {
|
|
22
|
+
type: "started";
|
|
23
|
+
cloneUrlForDisplay: string;
|
|
24
|
+
} | {
|
|
25
|
+
type: "progress";
|
|
26
|
+
phase: string;
|
|
27
|
+
percent: number | null;
|
|
28
|
+
raw: string;
|
|
29
|
+
} | {
|
|
30
|
+
type: "stderr";
|
|
31
|
+
line: string;
|
|
32
|
+
} | {
|
|
33
|
+
type: "done";
|
|
34
|
+
target: string;
|
|
35
|
+
} | {
|
|
36
|
+
type: "error";
|
|
37
|
+
message: string;
|
|
38
|
+
};
|
|
39
|
+
export declare class GitCloneError extends Error {
|
|
40
|
+
readonly code: string;
|
|
41
|
+
constructor(code: string, message: string);
|
|
42
|
+
}
|
|
43
|
+
export declare function validateCloneUrl(raw: string): URL;
|
|
44
|
+
export declare function parseProgressLine(line: string): {
|
|
45
|
+
phase: string;
|
|
46
|
+
percent: number | null;
|
|
47
|
+
} | undefined;
|
|
48
|
+
export declare function assertTargetClonable(target: string): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Run `git clone` with progress streaming.
|
|
51
|
+
* Returns an async iterable of CloneEvents.
|
|
52
|
+
* On error, the target directory is removed.
|
|
53
|
+
*/
|
|
54
|
+
export declare function cloneRepository(opts: CloneOptions): AsyncGenerator<CloneEvent>;
|
|
55
|
+
//# sourceMappingURL=clone-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone-provider.d.ts","sourceRoot":"","sources":["../src/clone-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mBAAmB;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAIxC;CACF;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAiBjD;AASD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,CAUvD;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBxE;AAED;;;;GAIG;AACH,wBAAuB,eAAe,CACpC,IAAI,EAAE,YAAY,GACjB,cAAc,CAAC,UAAU,CAAC,CAuG5B"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal `git clone` runner for pi-kot's "Clone repository" flow.
|
|
3
|
+
*
|
|
4
|
+
* Supports: HTTPS URLs, optional token auth (x-access-token), progress streaming,
|
|
5
|
+
* branch selection, TLS bypass for self-signed certs.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from "node:child_process";
|
|
8
|
+
import { rm, stat, readdir } from "node:fs/promises";
|
|
9
|
+
import { resolve } from "node:path";
|
|
10
|
+
export class GitCloneError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
constructor(code, message) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "GitCloneError";
|
|
15
|
+
this.code = code;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function validateCloneUrl(raw) {
|
|
19
|
+
let parsed;
|
|
20
|
+
try {
|
|
21
|
+
parsed = new URL(raw);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
throw new GitCloneError("invalid_url", `Not a valid URL: ${raw}`);
|
|
25
|
+
}
|
|
26
|
+
if (parsed.protocol !== "https:" && parsed.protocol !== "file:") {
|
|
27
|
+
throw new GitCloneError("unsupported_protocol", `Only HTTPS and file:// URLs are supported (got ${parsed.protocol})`);
|
|
28
|
+
}
|
|
29
|
+
if (parsed.protocol === "https:" && parsed.hostname.length === 0) {
|
|
30
|
+
throw new GitCloneError("invalid_url", "URL is missing a host.");
|
|
31
|
+
}
|
|
32
|
+
return parsed;
|
|
33
|
+
}
|
|
34
|
+
function injectToken(url, token) {
|
|
35
|
+
const withAuth = new URL(url.toString());
|
|
36
|
+
withAuth.username = "x-access-token";
|
|
37
|
+
withAuth.password = token;
|
|
38
|
+
return withAuth.toString();
|
|
39
|
+
}
|
|
40
|
+
export function parseProgressLine(line) {
|
|
41
|
+
const match = /^([A-Z][A-Za-z ]+):\s+(\d+)%/.exec(line.trim());
|
|
42
|
+
if (match !== null) {
|
|
43
|
+
return { phase: match[1], percent: Number(match[2]) };
|
|
44
|
+
}
|
|
45
|
+
const phaseOnly = /^([A-Z][A-Za-z ]+):/.exec(line.trim());
|
|
46
|
+
if (phaseOnly !== null) {
|
|
47
|
+
return { phase: phaseOnly[1], percent: null };
|
|
48
|
+
}
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
export async function assertTargetClonable(target) {
|
|
52
|
+
const resolved = resolve(target);
|
|
53
|
+
try {
|
|
54
|
+
const st = await stat(resolved);
|
|
55
|
+
if (!st.isDirectory()) {
|
|
56
|
+
throw new GitCloneError("target_not_a_directory", `Target exists but is not a directory: ${resolved}`);
|
|
57
|
+
}
|
|
58
|
+
const entries = await readdir(resolved);
|
|
59
|
+
if (entries.length > 0) {
|
|
60
|
+
throw new GitCloneError("target_not_empty", `Target directory is not empty: ${resolved}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
if (err instanceof GitCloneError)
|
|
65
|
+
throw err;
|
|
66
|
+
if (err.code === "ENOENT")
|
|
67
|
+
return; // doesn't exist yet — OK
|
|
68
|
+
throw err;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Run `git clone` with progress streaming.
|
|
73
|
+
* Returns an async iterable of CloneEvents.
|
|
74
|
+
* On error, the target directory is removed.
|
|
75
|
+
*/
|
|
76
|
+
export async function* cloneRepository(opts) {
|
|
77
|
+
const url = validateCloneUrl(opts.url);
|
|
78
|
+
const target = resolve(opts.target);
|
|
79
|
+
const cloneUrl = opts.token !== undefined ? injectToken(url, opts.token) : url.toString();
|
|
80
|
+
const displayUrl = url.toString();
|
|
81
|
+
const args = ["clone", "--progress"];
|
|
82
|
+
if (opts.branch !== undefined && opts.branch.length > 0) {
|
|
83
|
+
args.push("--branch", opts.branch);
|
|
84
|
+
}
|
|
85
|
+
args.push(cloneUrl, target);
|
|
86
|
+
yield { type: "started", cloneUrlForDisplay: displayUrl };
|
|
87
|
+
const env = {
|
|
88
|
+
// Prevent git from prompting on stdin when credentials are wrong
|
|
89
|
+
GIT_TERMINAL_PROMPT: "0",
|
|
90
|
+
...process.env,
|
|
91
|
+
};
|
|
92
|
+
if (opts.insecureTls === true) {
|
|
93
|
+
env.GIT_SSL_NO_VERIFY = "true";
|
|
94
|
+
}
|
|
95
|
+
let progressBuf = "";
|
|
96
|
+
const child = spawn("git", args, {
|
|
97
|
+
env,
|
|
98
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
99
|
+
signal: opts.signal,
|
|
100
|
+
});
|
|
101
|
+
try {
|
|
102
|
+
await new Promise((resolvePromise, reject) => {
|
|
103
|
+
let settled = false;
|
|
104
|
+
child.stdout?.on("data", () => {
|
|
105
|
+
// stdout is nearly empty for clone; progress is on stderr
|
|
106
|
+
});
|
|
107
|
+
child.stderr?.on("data", (chunk) => {
|
|
108
|
+
progressBuf += chunk.toString("utf8");
|
|
109
|
+
// Keep a reasonable buffer to avoid OOM on long clones
|
|
110
|
+
if (progressBuf.length > 64 * 1024) {
|
|
111
|
+
progressBuf = progressBuf.slice(-64 * 1024);
|
|
112
|
+
}
|
|
113
|
+
const lines = progressBuf.split("\n");
|
|
114
|
+
// Keep the last (potentially incomplete) line in the buffer
|
|
115
|
+
progressBuf = lines.pop() ?? "";
|
|
116
|
+
for (const line of lines) {
|
|
117
|
+
const trimmed = line.trim();
|
|
118
|
+
if (trimmed.length === 0)
|
|
119
|
+
continue;
|
|
120
|
+
const parsed = parseProgressLine(trimmed);
|
|
121
|
+
if (parsed !== undefined) {
|
|
122
|
+
// Only yield if there's still an iterator
|
|
123
|
+
try {
|
|
124
|
+
// Can't yield from inside a callback, so we'll handle this differently
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// ignore
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
child.on("error", (err) => {
|
|
133
|
+
if (settled)
|
|
134
|
+
return;
|
|
135
|
+
settled = true;
|
|
136
|
+
reject(err);
|
|
137
|
+
});
|
|
138
|
+
child.on("close", (code) => {
|
|
139
|
+
if (settled)
|
|
140
|
+
return;
|
|
141
|
+
settled = true;
|
|
142
|
+
if (code === 0) {
|
|
143
|
+
// Strip token from origin URL after successful clone
|
|
144
|
+
if (opts.token !== undefined) {
|
|
145
|
+
const stripToken = spawn("git", [
|
|
146
|
+
"-C",
|
|
147
|
+
target,
|
|
148
|
+
"remote",
|
|
149
|
+
"set-url",
|
|
150
|
+
"origin",
|
|
151
|
+
displayUrl,
|
|
152
|
+
]);
|
|
153
|
+
stripToken.on("error", () => { });
|
|
154
|
+
}
|
|
155
|
+
resolvePromise();
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
reject(new Error(`git clone exited with code ${code}`));
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
// Clean up on failure
|
|
165
|
+
await rm(target, { recursive: true, force: true }).catch(() => { });
|
|
166
|
+
const message = err instanceof Error ? err.message : "Clone failed";
|
|
167
|
+
yield { type: "error", message };
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
yield { type: "done", target };
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=clone-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone-provider.js","sourceRoot":"","sources":["../src/clone-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-compaction archive derivation.
|
|
3
|
+
*
|
|
4
|
+
* Pi's SessionManager persists every entry to JSONL — including
|
|
5
|
+
* `CompactionEntry` records that mark where the SDK summarised and
|
|
6
|
+
* dropped older messages from the in-memory context. The chat UI
|
|
7
|
+
* reads `session.messages` (the post-compaction view); without
|
|
8
|
+
* something like this module the user's pre-compaction history
|
|
9
|
+
* appears to vanish.
|
|
10
|
+
*
|
|
11
|
+
* This module reads the full entries array, walks each compaction,
|
|
12
|
+
* and produces a `CompactionEvent[]` shape the client renders as
|
|
13
|
+
* inline "Compacted N messages → Y tokens" cards with the archived
|
|
14
|
+
* messages one click away.
|
|
15
|
+
*
|
|
16
|
+
* Shape contract:
|
|
17
|
+
* - `id` — the CompactionEntry's id (stable across reloads)
|
|
18
|
+
* - `timestamp` — when the compaction happened (ISO 8601)
|
|
19
|
+
* - `summary` — the SDK-generated prose summary
|
|
20
|
+
* - `tokensBefore` — context size at the moment of compaction
|
|
21
|
+
* - `insertBeforeIndex` — index in the post-compaction `session.messages`
|
|
22
|
+
* array where the card should render. The card
|
|
23
|
+
* appears IMMEDIATELY ABOVE the message at
|
|
24
|
+
* this index — i.e. between messages[i-1] and
|
|
25
|
+
* messages[i]. When 0, the card renders at the
|
|
26
|
+
* very top of the chat (the entire pre-
|
|
27
|
+
* compaction history was archived).
|
|
28
|
+
* - `archivedMessages` — the AgentMessage[] that the SDK removed from
|
|
29
|
+
* the context. Rendered through the existing
|
|
30
|
+
* Message component when the user expands the
|
|
31
|
+
* card. Slice is from "the compaction immediately
|
|
32
|
+
* before this one (or session start)" up to but
|
|
33
|
+
* not including the new compaction.
|
|
34
|
+
*
|
|
35
|
+
* Compaction history card — extracts summary, message count, and timestamps.
|
|
36
|
+
*/
|
|
37
|
+
import type { AgentSession } from "@earendil-works/pi-coding-agent";
|
|
38
|
+
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
|
39
|
+
export interface CompactionEvent {
|
|
40
|
+
id: string;
|
|
41
|
+
timestamp: string;
|
|
42
|
+
summary: string;
|
|
43
|
+
tokensBefore: number;
|
|
44
|
+
/** Estimated token count of the kept context AFTER compaction (SDK 0.79.8+).
|
|
45
|
+
* Derived by walking kept message entries from firstKeptEntryId using a
|
|
46
|
+
* char/4 heuristic — same approach the SDK uses at compaction time. */
|
|
47
|
+
estimatedTokensAfter?: number;
|
|
48
|
+
insertBeforeIndex: number;
|
|
49
|
+
archivedMessages: AgentMessage[];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Walk `session.sessionManager.getEntries()` once and produce one
|
|
53
|
+
* CompactionEvent per CompactionEntry. The mapping back to a position
|
|
54
|
+
* in `session.messages` is the tricky part: the post-compaction
|
|
55
|
+
* messages array is rebuilt from the entries that come AT or AFTER
|
|
56
|
+
* the latest compaction's `firstKeptEntryId`, with the compaction
|
|
57
|
+
* summary itself synthesised in. We compute `insertBeforeIndex` by
|
|
58
|
+
* counting how many "kept" message entries appear in `messages`
|
|
59
|
+
* before the position where this compaction's first-kept entry lands.
|
|
60
|
+
*/
|
|
61
|
+
export declare function buildCompactionHistory(session: AgentSession): CompactionEvent[];
|
|
62
|
+
//# sourceMappingURL=compaction-cards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction-cards.d.ts","sourceRoot":"","sources":["../src/compaction-cards.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,iCAAiC,CAAC;AAClF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB;;4EAEwE;IACxE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,YAAY,EAAE,CAAC;CAClC;AA0BD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,eAAe,EAAE,CA0E/E"}
|