@astralyn/pi 0.84.14 → 0.84.15
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 +15 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +12 -6
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/extensions/types.d.ts +4 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/tools/bash.d.ts +1 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +4 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/find.d.ts +2 -0
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +18 -15
- package/dist/core/tools/find.js.map +1 -1
- package/dist/extensions/background/actions.d.ts.map +1 -1
- package/dist/extensions/background/actions.js +3 -2
- package/dist/extensions/background/actions.js.map +1 -1
- package/dist/extensions/background/manager.d.ts.map +1 -1
- package/dist/extensions/background/manager.js +8 -9
- package/dist/extensions/background/manager.js.map +1 -1
- package/dist/extensions/background/registry.d.ts +4 -1
- package/dist/extensions/background/registry.d.ts.map +1 -1
- package/dist/extensions/background/registry.js +30 -17
- package/dist/extensions/background/registry.js.map +1 -1
- package/dist/extensions/background/task-view.d.ts +6 -0
- package/dist/extensions/background/task-view.d.ts.map +1 -1
- package/dist/extensions/background/task-view.js +11 -6
- package/dist/extensions/background/task-view.js.map +1 -1
- package/dist/extensions/deepwiki/client.d.ts.map +1 -1
- package/dist/extensions/deepwiki/client.js +3 -0
- package/dist/extensions/deepwiki/client.js.map +1 -1
- package/dist/extensions/deepwiki/execute.d.ts +2 -1
- package/dist/extensions/deepwiki/execute.d.ts.map +1 -1
- package/dist/extensions/deepwiki/execute.js +17 -2
- package/dist/extensions/deepwiki/execute.js.map +1 -1
- package/dist/extensions/deepwiki/http.d.ts +1 -0
- package/dist/extensions/deepwiki/http.d.ts.map +1 -1
- package/dist/extensions/deepwiki/http.js +16 -2
- package/dist/extensions/deepwiki/http.js.map +1 -1
- package/dist/extensions/deepwiki/schema.d.ts +1 -1
- package/dist/extensions/deepwiki/schema.d.ts.map +1 -1
- package/dist/extensions/deepwiki/schema.js +8 -2
- package/dist/extensions/deepwiki/schema.js.map +1 -1
- package/dist/extensions/question/dialog.d.ts.map +1 -1
- package/dist/extensions/question/dialog.js +80 -9
- package/dist/extensions/question/dialog.js.map +1 -1
- package/dist/extensions/question/index.d.ts.map +1 -1
- package/dist/extensions/question/index.js +8 -0
- package/dist/extensions/question/index.js.map +1 -1
- package/dist/extensions/question/schema.d.ts +2 -2
- package/dist/extensions/question/schema.d.ts.map +1 -1
- package/dist/extensions/question/schema.js +41 -11
- package/dist/extensions/question/schema.js.map +1 -1
- package/dist/extensions/question/types.d.ts +1 -1
- package/dist/extensions/question/types.d.ts.map +1 -1
- package/dist/extensions/question/types.js.map +1 -1
- package/dist/extensions/router/probe.d.ts.map +1 -1
- package/dist/extensions/router/probe.js +10 -29
- package/dist/extensions/router/probe.js.map +1 -1
- package/dist/extensions/router/register.d.ts.map +1 -1
- package/dist/extensions/router/register.js +16 -6
- package/dist/extensions/router/register.js.map +1 -1
- package/dist/extensions/router/store.d.ts.map +1 -1
- package/dist/extensions/router/store.js +108 -51
- package/dist/extensions/router/store.js.map +1 -1
- package/dist/extensions/router/ui.d.ts +6 -0
- package/dist/extensions/router/ui.d.ts.map +1 -1
- package/dist/extensions/router/ui.js +14 -6
- package/dist/extensions/router/ui.js.map +1 -1
- package/dist/extensions/statusline/index.d.ts.map +1 -1
- package/dist/extensions/statusline/index.js +40 -43
- package/dist/extensions/statusline/index.js.map +1 -1
- package/dist/extensions/subagent/activity.d.ts +7 -1
- package/dist/extensions/subagent/activity.d.ts.map +1 -1
- package/dist/extensions/subagent/activity.js +69 -6
- package/dist/extensions/subagent/activity.js.map +1 -1
- package/dist/extensions/subagent/agents-command.js +1 -1
- package/dist/extensions/subagent/agents-command.js.map +1 -1
- package/dist/extensions/subagent/agents.d.ts.map +1 -1
- package/dist/extensions/subagent/agents.js +0 -3
- package/dist/extensions/subagent/agents.js.map +1 -1
- package/dist/extensions/subagent/budget.d.ts.map +1 -1
- package/dist/extensions/subagent/budget.js +29 -2
- package/dist/extensions/subagent/budget.js.map +1 -1
- package/dist/extensions/subagent/cancellation.d.ts +4 -4
- package/dist/extensions/subagent/cancellation.d.ts.map +1 -1
- package/dist/extensions/subagent/cancellation.js +31 -13
- package/dist/extensions/subagent/cancellation.js.map +1 -1
- package/dist/extensions/subagent/constants.d.ts +1 -0
- package/dist/extensions/subagent/constants.d.ts.map +1 -1
- package/dist/extensions/subagent/constants.js +1 -0
- package/dist/extensions/subagent/constants.js.map +1 -1
- package/dist/extensions/subagent/index.d.ts.map +1 -1
- package/dist/extensions/subagent/index.js +1 -0
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent/render.d.ts +8 -1
- package/dist/extensions/subagent/render.d.ts.map +1 -1
- package/dist/extensions/subagent/render.js +148 -178
- package/dist/extensions/subagent/render.js.map +1 -1
- package/dist/extensions/subagent/runner.d.ts +1 -0
- package/dist/extensions/subagent/runner.d.ts.map +1 -1
- package/dist/extensions/subagent/runner.js +53 -44
- package/dist/extensions/subagent/runner.js.map +1 -1
- package/dist/extensions/subagent/sdk-runner.d.ts.map +1 -1
- package/dist/extensions/subagent/sdk-runner.js +0 -3
- package/dist/extensions/subagent/sdk-runner.js.map +1 -1
- package/dist/extensions/subagent/settings.d.ts +1 -1
- package/dist/extensions/subagent/settings.d.ts.map +1 -1
- package/dist/extensions/subagent/settings.js +74 -25
- package/dist/extensions/subagent/settings.js.map +1 -1
- package/dist/extensions/subagent/state.d.ts +1 -0
- package/dist/extensions/subagent/state.d.ts.map +1 -1
- package/dist/extensions/subagent/state.js +46 -16
- package/dist/extensions/subagent/state.js.map +1 -1
- package/dist/extensions/subagent/types.d.ts +0 -7
- package/dist/extensions/subagent/types.d.ts.map +1 -1
- package/dist/extensions/subagent/types.js.map +1 -1
- package/dist/extensions/subagent/ui/agents-dialog.js +1 -1
- package/dist/extensions/subagent/ui/agents-dialog.js.map +1 -1
- package/dist/extensions/subagent/ui/model-list.d.ts.map +1 -1
- package/dist/extensions/subagent/ui/model-list.js +3 -4
- package/dist/extensions/subagent/ui/model-list.js.map +1 -1
- package/dist/extensions/subagent/ui/model-picker.d.ts.map +1 -1
- package/dist/extensions/subagent/ui/model-picker.js +2 -1
- package/dist/extensions/subagent/ui/model-picker.js.map +1 -1
- package/dist/extensions/web-search/format.d.ts.map +1 -1
- package/dist/extensions/web-search/format.js +36 -15
- package/dist/extensions/web-search/format.js.map +1 -1
- package/dist/extensions/web-search/index.d.ts.map +1 -1
- package/dist/extensions/web-search/index.js +11 -8
- package/dist/extensions/web-search/index.js.map +1 -1
- package/dist/extensions/web-search/providers/deepseek.d.ts.map +1 -1
- package/dist/extensions/web-search/providers/deepseek.js +36 -5
- package/dist/extensions/web-search/providers/deepseek.js.map +1 -1
- package/dist/extensions/web-search/providers/http.d.ts +2 -7
- package/dist/extensions/web-search/providers/http.d.ts.map +1 -1
- package/dist/extensions/web-search/providers/http.js +12 -57
- package/dist/extensions/web-search/providers/http.js.map +1 -1
- package/dist/extensions/web-search/providers/minimax.d.ts.map +1 -1
- package/dist/extensions/web-search/providers/minimax.js +18 -6
- package/dist/extensions/web-search/providers/minimax.js.map +1 -1
- package/dist/extensions/web-search/render.d.ts.map +1 -1
- package/dist/extensions/web-search/render.js +16 -5
- package/dist/extensions/web-search/render.js.map +1 -1
- package/dist/extensions/web-search/results.d.ts +10 -3
- package/dist/extensions/web-search/results.d.ts.map +1 -1
- package/dist/extensions/web-search/results.js +25 -7
- package/dist/extensions/web-search/results.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +7 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-group.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-group.js +10 -0
- package/dist/modes/interactive/components/tool-group.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +3 -40
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +0 -4
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +16 -23
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/utils/http-response.d.ts +10 -0
- package/dist/utils/http-response.d.ts.map +1 -0
- package/dist/utils/http-response.js +68 -0
- package/dist/utils/http-response.js.map +1 -0
- package/docs/bundled/extensions/background.md +2 -1
- package/docs/bundled/extensions/deepwiki.md +7 -5
- package/docs/bundled/extensions/question.md +6 -4
- package/docs/bundled/extensions/router.md +1 -1
- package/docs/bundled/extensions/statusline.md +1 -0
- package/docs/bundled/extensions/subagent.md +29 -39
- package/docs/bundled/extensions/web-search.md +3 -3
- package/docs/development.md +7 -2
- package/docs/extensions.md +2 -2
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-view.js","sourceRoot":"","sources":["../../../src/extensions/background/task-view.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC7D,iGAAiG;AACjG,MAAM,UAAU,SAAS,CAAC,IAA6C,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACxF,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAA6C,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAC3F,OAAO,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,QAAmC;IAC9D,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,CAAC;AACpD,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,UAAU,CAAC,QAAmC,EAAE,SAAiB;IAChF,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,QAAQ,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,SAAS,CAAC,IAA+C;IACxE,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACxE,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,eAAe,CAAC,IAA+C,EAAE,KAAa;IAC7F,OAAO,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,KAAa;IAC1D,OAAO,eAAe,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAoB,EAAE,OAAiB;IAClE,IAAI,OAAO;QAAE,OAAO,GAAG,CAAC;IACxB,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,WAAW;YACf,OAAO,GAAG,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS;YACb,OAAO,GAAG,CAAC;QACZ,KAAK,QAAQ;YACZ,OAAO,GAAG,CAAC;QACZ;YACC,OAAO,GAAG,CAAC;IACb,CAAC;AACF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAoB,EAAE,OAAiB;IAClE,IAAI,OAAO;QAAE,OAAO,SAAS,CAAC;IAC9B,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,WAAW;YACf,OAAO,SAAS,CAAC;QAClB,KAAK,QAAQ;YACZ,OAAO,OAAO,CAAC;QAChB,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ;YACZ,OAAO,SAAS,CAAC;QAClB;YACC,OAAO,QAAQ,CAAC;IAClB,CAAC;AACF,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"task-view.js","sourceRoot":"","sources":["../../../src/extensions/background/task-view.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * background — how a task is described, everywhere.\n *\n * Every output this extension produces (five tool results, two notifications,\n * the statusline, the /bg list and detail header) is the same thing: a BgTask\n * projected into a medium. The values those projections derive — runtime, exit\n * suffix, label, glyph — live here once, so the media can differ without the\n * vocabulary drifting. Pure functions; no TUI components, no theme.\n */\n\nimport { truncateToWidth } from \"@earendil-works/pi-tui\";\nimport type { BgTaskStatus } from \"./registry.ts\";\nimport { firstCommandLine, formatDuration } from \"./text.ts\";\n/** How long a task has run, or ran. A running task has no `endedAt`, so it measures to `now`. */\nexport function runtimeMs(task: { startedAt: number; endedAt?: number }, now = Date.now()): number {\n\treturn (task.endedAt ?? now) - task.startedAt;\n}\n\nexport function runtimeLabel(task: { startedAt: number; endedAt?: number }, now = Date.now()): string {\n\treturn formatDuration(runtimeMs(task, now));\n}\n\n/**\n * Whether a task produced an exit code. Three-state by necessity: `undefined`\n * while running or when the run produced none, `null` when reaped by a signal —\n * and historical session entries still hold `null`, so this must keep accepting it.\n */\nexport function hasExitCode(exitCode: number | null | undefined): exitCode is number {\n\treturn exitCode !== undefined && exitCode !== null;\n}\n\n/** `<separator>exit <code>`, or nothing. Callers pick the separator: \" \", \", \", \" · \". */\nexport function exitSuffix(exitCode: number | null | undefined, separator: string): string {\n\treturn hasExitCode(exitCode) ? `${separator}exit ${exitCode}` : \"\";\n}\n\n/** Label for listings: the model-provided description over the first command line. */\nexport function taskLabel(task: { description?: string; command: string }): string {\n\tconst command = firstCommandLine(task.command);\n\treturn task.description ? `${task.description} — ${command}` : command;\n}\n\n/** A listing row's label, fitted to a visible-column budget. */\nexport function taskLabelWithin(task: { description?: string; command: string }, width: number): string {\n\treturn truncateToWidth(taskLabel(task), width, \"…\");\n}\n\n/** First command line fitted to a visible-column budget — wide characters count as two. */\nexport function commandLabel(command: string, width: number): string {\n\treturn truncateToWidth(firstCommandLine(command), width, \"…\");\n}\n\nexport function statusGlyph(status: BgTaskStatus, stalled?: boolean): string {\n\tif (stalled) return \"…\";\n\tswitch (status) {\n\t\tcase \"completed\":\n\t\t\treturn \"✓\";\n\t\tcase \"failed\":\n\t\tcase \"timeout\":\n\t\t\treturn \"✗\";\n\t\tcase \"killed\":\n\t\t\treturn \"○\";\n\t\tdefault:\n\t\t\treturn \"●\";\n\t}\n}\n\nexport function statusColor(status: BgTaskStatus, stalled?: boolean): \"success\" | \"error\" | \"warning\" | \"accent\" {\n\tif (stalled) return \"warning\";\n\tswitch (status) {\n\t\tcase \"completed\":\n\t\t\treturn \"success\";\n\t\tcase \"failed\":\n\t\t\treturn \"error\";\n\t\tcase \"timeout\":\n\t\tcase \"killed\":\n\t\t\treturn \"warning\";\n\t\tdefault:\n\t\t\treturn \"accent\";\n\t}\n}\n\n/** Shared running/waiting/finished count vocabulary for tools, menus, and footer. */\nexport function formatTaskCounts(counts: { running: number; total: number; stalled: number }): string | undefined {\n\tif (counts.total === 0) return undefined;\n\t// Stalled tasks are running tasks: report them separately so the counts add up.\n\tconst running = counts.running - counts.stalled;\n\tconst finished = counts.total - counts.running;\n\tconst parts: string[] = [];\n\tif (running > 0) parts.push(`${running} running`);\n\tif (counts.stalled > 0) parts.push(`${counts.stalled} waiting for input`);\n\tif (finished > 0) parts.push(`${finished} finished`);\n\treturn parts.join(\" · \");\n}\n\n/** The footer segment, or nothing when this session has no tasks at all. */\nexport function formatStatusline(counts: { running: number; total: number; stalled: number }): string | undefined {\n\tconst summary = formatTaskCounts(counts);\n\treturn summary ? `bg ${summary}` : undefined;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAA2B,MAAM,aAAa,CAAC;AAW3E,KAAK,gBAAgB,GAAG,qBAAqB,GAAG,oBAAoB,GAAG,cAAc,CAAC;AA0BtF,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAkHD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE1D;AAmBD,wBAAsB,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAA2B,MAAM,aAAa,CAAC;AAW3E,KAAK,gBAAgB,GAAG,qBAAqB,GAAG,oBAAoB,GAAG,cAAc,CAAC;AA0BtF,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAkHD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE1D;AAmBD,wBAAsB,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+DrH"}
|
|
@@ -140,6 +140,7 @@ function extractPageTitles(toolName, text) {
|
|
|
140
140
|
return [];
|
|
141
141
|
}
|
|
142
142
|
export async function callDeepWiki(params, signal) {
|
|
143
|
+
signal?.throwIfAborted();
|
|
143
144
|
const normalizedParams = normalizeDeepWikiParams(params);
|
|
144
145
|
const key = cacheKey(normalizedParams);
|
|
145
146
|
const cached = responseCache.get(key);
|
|
@@ -169,6 +170,7 @@ export async function callDeepWiki(params, signal) {
|
|
|
169
170
|
},
|
|
170
171
|
body: bodyJson,
|
|
171
172
|
}, { timeoutMs: REQUEST_TIMEOUT_MS, retries: MAX_RETRIES, signal, label: "DeepWiki" });
|
|
173
|
+
signal?.throwIfAborted();
|
|
172
174
|
if (!response.ok) {
|
|
173
175
|
throw new Error(`DeepWiki HTTP ${response.status}: ${truncate(text)}`);
|
|
174
176
|
}
|
|
@@ -184,6 +186,7 @@ export async function callDeepWiki(params, signal) {
|
|
|
184
186
|
outputLength: resultText.length,
|
|
185
187
|
...(pageTitles.length ? { pageTitles } : {}),
|
|
186
188
|
};
|
|
189
|
+
signal?.throwIfAborted();
|
|
187
190
|
responseCache.set(key, { expiresAt: Date.now() + CACHE_TTL_MS, response: cloneResponse(result, false) });
|
|
188
191
|
while (responseCache.size > MAX_CACHE_ENTRIES) {
|
|
189
192
|
const oldest = responseCache.keys().next().value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { PAGE_HEADER_RE } from \"./contents.ts\";\nimport { fetchWithRetry } from \"./http.ts\";\nimport { type DeepWikiParams, normalizeDeepWikiParams } from \"./schema.ts\";\n\nconst DEEPWIKI_MCP_URL = \"https://mcp.deepwiki.com/mcp\";\nconst MCP_PROTOCOL_VERSION = \"2024-11-05\";\nconst REQUEST_TIMEOUT_MS = 45_000;\nconst CACHE_TTL_MS = 10 * 60_000;\n/** Long-lived process guard: entries are only otherwise dropped on re-read after expiry. */\nconst MAX_CACHE_ENTRIES = 50;\n/** Transient-failure retries (network blips, 5xx, 429). Aborts/timeouts are not retried. */\nconst MAX_RETRIES = 2;\n\ntype DeepWikiToolName = \"read_wiki_structure\" | \"read_wiki_contents\" | \"ask_question\";\n\ninterface JsonRpcErrorPayload {\n\tcode?: number;\n\tmessage?: string;\n\tdata?: unknown;\n}\n\ninterface JsonRpcEnvelope {\n\tjsonrpc?: string;\n\tid?: string | number | null;\n\tresult?: unknown;\n\terror?: JsonRpcErrorPayload;\n}\n\ninterface McpTextContent {\n\ttype: \"text\";\n\ttext: string;\n}\n\ninterface McpToolCallResult {\n\tcontent?: unknown;\n\tstructuredContent?: unknown;\n\tisError?: boolean;\n}\n\nexport interface DeepWikiResponse {\n\ttoolName: DeepWikiToolName;\n\ttext: string;\n\toutputLength: number;\n\tpageTitles?: string[];\n\tcacheHit?: boolean;\n}\n\ninterface CacheEntry {\n\texpiresAt: number;\n\tresponse: DeepWikiResponse;\n}\n\nconst responseCache = new Map<string, CacheEntry>();\n\nfunction toolNameForAction(action: DeepWikiParams[\"action\"]): DeepWikiToolName {\n\tif (action === \"structure\") return \"read_wiki_structure\";\n\tif (action === \"contents\") return \"read_wiki_contents\";\n\treturn \"ask_question\";\n}\n\n// Callers pass params already normalized by callDeepWiki's entry gate; no re-normalization.\nfunction argumentsForParams(params: DeepWikiParams): Record<string, unknown> {\n\tif (params.action === \"question\") {\n\t\tconst question = params.question?.trim();\n\t\tif (!question) throw new Error(\"question is required when action is question\");\n\t\treturn { repoName: params.repoName, question };\n\t}\n\treturn { repoName: params.repoName };\n}\n\nfunction cacheKey(params: DeepWikiParams): string {\n\tconst repos = Array.isArray(params.repoName) ? params.repoName : [params.repoName];\n\treturn JSON.stringify([params.action, repos, params.question ?? \"\"]);\n}\n\nfunction cloneResponse(response: DeepWikiResponse, cacheHit: boolean): DeepWikiResponse {\n\treturn {\n\t\t...response,\n\t\t...(response.pageTitles ? { pageTitles: [...response.pageTitles] } : {}),\n\t\tcacheHit,\n\t};\n}\n\nfunction truncate(text: string, maxLength = 500): string {\n\tif (text.length <= maxLength) return text;\n\treturn `${text.slice(0, maxLength - 3)}...`;\n}\n\nfunction parseJson(text: string): JsonRpcEnvelope {\n\ttry {\n\t\treturn JSON.parse(text) as JsonRpcEnvelope;\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`DeepWiki returned invalid JSON: ${message}`);\n\t}\n}\n\nfunction parseSse(text: string): JsonRpcEnvelope {\n\tconst blocks = text.split(/\\r?\\n\\r?\\n/);\n\tlet fallback: JsonRpcEnvelope | undefined;\n\tfor (const block of blocks) {\n\t\tconst dataLines = block\n\t\t\t.split(/\\r?\\n/)\n\t\t\t.filter((line) => line.startsWith(\"data:\"))\n\t\t\t.map((line) => line.slice(5).replace(/^ /, \"\"));\n\t\tif (dataLines.length === 0) continue;\n\n\t\tconst data = dataLines.join(\"\\n\").trim();\n\t\tif (!data || data === \"[DONE]\") continue;\n\t\tconst envelope = parseJson(data);\n\t\tif (envelope.error || envelope.result !== undefined) return envelope;\n\t\tfallback = envelope;\n\t}\n\tif (fallback) return fallback;\n\tthrow new Error(\"DeepWiki returned an empty event stream\");\n}\n\nfunction parseEnvelope(text: string, contentType: string | null): JsonRpcEnvelope {\n\tif (contentType?.includes(\"text/event-stream\")) return parseSse(text);\n\treturn parseJson(text);\n}\n\nfunction extractStructuredResult(result: McpToolCallResult): string | undefined {\n\tif (!result.structuredContent || typeof result.structuredContent !== \"object\") return undefined;\n\tconst value = (result.structuredContent as Record<string, unknown>).result;\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction extractContentResult(result: McpToolCallResult): string {\n\tif (!Array.isArray(result.content)) return \"\";\n\treturn result.content\n\t\t.filter((part): part is McpTextContent => {\n\t\t\tif (!part || typeof part !== \"object\") return false;\n\t\t\tconst record = part as Record<string, unknown>;\n\t\t\treturn record.type === \"text\" && typeof record.text === \"string\";\n\t\t})\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\nfunction isDeepWikiErrorText(text: string): boolean {\n\tconst trimmed = text.trim();\n\treturn (\n\t\t/^Error fetching wiki for .+?: Repository not found\\./i.test(trimmed) ||\n\t\t/^Error processing question: Repository not found\\./i.test(trimmed)\n\t);\n}\n\nfunction extractToolText(result: unknown): string {\n\tif (!result || typeof result !== \"object\") throw new Error(\"DeepWiki returned no result object\");\n\n\tconst toolResult = result as McpToolCallResult;\n\tconst text = extractStructuredResult(toolResult) ?? extractContentResult(toolResult);\n\tif (!text) throw new Error(\"DeepWiki returned no text content\");\n\tif (toolResult.isError || isDeepWikiErrorText(text)) throw new Error(text);\n\treturn text;\n}\n\nexport function extractStructureSections(text: string): string[] {\n\treturn uniqueTitles(text.split(\"\\n\").map((line) => line.match(/^\\s*-\\s+\\d+\\s+(.+)$/)?.[1]?.trim()));\n}\n\nexport function extractContentPages(text: string): string[] {\n\treturn uniqueTitles(text.split(\"\\n\").map((line) => line.match(PAGE_HEADER_RE)?.[1]?.trim()));\n}\n\nfunction uniqueTitles(titles: Array<string | undefined>): string[] {\n\tconst seen = new Set<string>();\n\tconst result: string[] = [];\n\tfor (const title of titles) {\n\t\tif (!title || seen.has(title)) continue;\n\t\tseen.add(title);\n\t\tresult.push(title);\n\t}\n\treturn result;\n}\n\nfunction extractPageTitles(toolName: DeepWikiToolName, text: string): string[] {\n\tif (toolName === \"read_wiki_structure\") return extractStructureSections(text);\n\tif (toolName === \"read_wiki_contents\") return extractContentPages(text);\n\treturn [];\n}\n\nexport async function callDeepWiki(params: DeepWikiParams, signal: AbortSignal | undefined): Promise<DeepWikiResponse> {\n\tconst normalizedParams = normalizeDeepWikiParams(params);\n\tconst key = cacheKey(normalizedParams);\n\tconst cached = responseCache.get(key);\n\tif (cached && cached.expiresAt > Date.now()) {\n\t\treturn cloneResponse(cached.response, true);\n\t}\n\tif (cached) responseCache.delete(key);\n\n\tconst toolName = toolNameForAction(normalizedParams.action);\n\tconst bodyJson = JSON.stringify({\n\t\tjsonrpc: \"2.0\",\n\t\tid: 1,\n\t\tmethod: \"tools/call\",\n\t\tparams: {\n\t\t\tname: toolName,\n\t\t\targuments: argumentsForParams(normalizedParams),\n\t\t},\n\t});\n\n\t// Timeout + bounded transient retry live in this extension's http.ts; non-retryable\n\t// statuses come back here for the domain-specific HTTP error below.\n\tconst { response, text } = await fetchWithRetry(\n\t\tDEEPWIKI_MCP_URL,\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\tAccept: \"application/json, text/event-stream\",\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"MCP-Protocol-Version\": MCP_PROTOCOL_VERSION,\n\t\t\t},\n\t\t\tbody: bodyJson,\n\t\t},\n\t\t{ timeoutMs: REQUEST_TIMEOUT_MS, retries: MAX_RETRIES, signal, label: \"DeepWiki\" },\n\t);\n\n\tif (!response.ok) {\n\t\tthrow new Error(`DeepWiki HTTP ${response.status}: ${truncate(text)}`);\n\t}\n\n\tconst envelope = parseEnvelope(text, response.headers.get(\"content-type\"));\n\tif (envelope.error) {\n\t\tthrow new Error(envelope.error.message ?? `DeepWiki JSON-RPC error ${envelope.error.code ?? \"unknown\"}`);\n\t}\n\n\tconst resultText = extractToolText(envelope.result);\n\tconst pageTitles = extractPageTitles(toolName, resultText);\n\tconst result: DeepWikiResponse = {\n\t\ttoolName,\n\t\ttext: resultText,\n\t\toutputLength: resultText.length,\n\t\t...(pageTitles.length ? { pageTitles } : {}),\n\t};\n\tresponseCache.set(key, { expiresAt: Date.now() + CACHE_TTL_MS, response: cloneResponse(result, false) });\n\twhile (responseCache.size > MAX_CACHE_ENTRIES) {\n\t\tconst oldest = responseCache.keys().next().value;\n\t\tif (oldest === undefined) break;\n\t\tresponseCache.delete(oldest);\n\t}\n\treturn result;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { PAGE_HEADER_RE } from \"./contents.ts\";\nimport { fetchWithRetry } from \"./http.ts\";\nimport { type DeepWikiParams, normalizeDeepWikiParams } from \"./schema.ts\";\n\nconst DEEPWIKI_MCP_URL = \"https://mcp.deepwiki.com/mcp\";\nconst MCP_PROTOCOL_VERSION = \"2024-11-05\";\nconst REQUEST_TIMEOUT_MS = 45_000;\nconst CACHE_TTL_MS = 10 * 60_000;\n/** Long-lived process guard: entries are only otherwise dropped on re-read after expiry. */\nconst MAX_CACHE_ENTRIES = 50;\n/** Transient-failure retries (network blips, 5xx, 429). Aborts/timeouts are not retried. */\nconst MAX_RETRIES = 2;\n\ntype DeepWikiToolName = \"read_wiki_structure\" | \"read_wiki_contents\" | \"ask_question\";\n\ninterface JsonRpcErrorPayload {\n\tcode?: number;\n\tmessage?: string;\n\tdata?: unknown;\n}\n\ninterface JsonRpcEnvelope {\n\tjsonrpc?: string;\n\tid?: string | number | null;\n\tresult?: unknown;\n\terror?: JsonRpcErrorPayload;\n}\n\ninterface McpTextContent {\n\ttype: \"text\";\n\ttext: string;\n}\n\ninterface McpToolCallResult {\n\tcontent?: unknown;\n\tstructuredContent?: unknown;\n\tisError?: boolean;\n}\n\nexport interface DeepWikiResponse {\n\ttoolName: DeepWikiToolName;\n\ttext: string;\n\toutputLength: number;\n\tpageTitles?: string[];\n\tcacheHit?: boolean;\n}\n\ninterface CacheEntry {\n\texpiresAt: number;\n\tresponse: DeepWikiResponse;\n}\n\nconst responseCache = new Map<string, CacheEntry>();\n\nfunction toolNameForAction(action: DeepWikiParams[\"action\"]): DeepWikiToolName {\n\tif (action === \"structure\") return \"read_wiki_structure\";\n\tif (action === \"contents\") return \"read_wiki_contents\";\n\treturn \"ask_question\";\n}\n\n// Callers pass params already normalized by callDeepWiki's entry gate; no re-normalization.\nfunction argumentsForParams(params: DeepWikiParams): Record<string, unknown> {\n\tif (params.action === \"question\") {\n\t\tconst question = params.question?.trim();\n\t\tif (!question) throw new Error(\"question is required when action is question\");\n\t\treturn { repoName: params.repoName, question };\n\t}\n\treturn { repoName: params.repoName };\n}\n\nfunction cacheKey(params: DeepWikiParams): string {\n\tconst repos = Array.isArray(params.repoName) ? params.repoName : [params.repoName];\n\treturn JSON.stringify([params.action, repos, params.question ?? \"\"]);\n}\n\nfunction cloneResponse(response: DeepWikiResponse, cacheHit: boolean): DeepWikiResponse {\n\treturn {\n\t\t...response,\n\t\t...(response.pageTitles ? { pageTitles: [...response.pageTitles] } : {}),\n\t\tcacheHit,\n\t};\n}\n\nfunction truncate(text: string, maxLength = 500): string {\n\tif (text.length <= maxLength) return text;\n\treturn `${text.slice(0, maxLength - 3)}...`;\n}\n\nfunction parseJson(text: string): JsonRpcEnvelope {\n\ttry {\n\t\treturn JSON.parse(text) as JsonRpcEnvelope;\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`DeepWiki returned invalid JSON: ${message}`);\n\t}\n}\n\nfunction parseSse(text: string): JsonRpcEnvelope {\n\tconst blocks = text.split(/\\r?\\n\\r?\\n/);\n\tlet fallback: JsonRpcEnvelope | undefined;\n\tfor (const block of blocks) {\n\t\tconst dataLines = block\n\t\t\t.split(/\\r?\\n/)\n\t\t\t.filter((line) => line.startsWith(\"data:\"))\n\t\t\t.map((line) => line.slice(5).replace(/^ /, \"\"));\n\t\tif (dataLines.length === 0) continue;\n\n\t\tconst data = dataLines.join(\"\\n\").trim();\n\t\tif (!data || data === \"[DONE]\") continue;\n\t\tconst envelope = parseJson(data);\n\t\tif (envelope.error || envelope.result !== undefined) return envelope;\n\t\tfallback = envelope;\n\t}\n\tif (fallback) return fallback;\n\tthrow new Error(\"DeepWiki returned an empty event stream\");\n}\n\nfunction parseEnvelope(text: string, contentType: string | null): JsonRpcEnvelope {\n\tif (contentType?.includes(\"text/event-stream\")) return parseSse(text);\n\treturn parseJson(text);\n}\n\nfunction extractStructuredResult(result: McpToolCallResult): string | undefined {\n\tif (!result.structuredContent || typeof result.structuredContent !== \"object\") return undefined;\n\tconst value = (result.structuredContent as Record<string, unknown>).result;\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction extractContentResult(result: McpToolCallResult): string {\n\tif (!Array.isArray(result.content)) return \"\";\n\treturn result.content\n\t\t.filter((part): part is McpTextContent => {\n\t\t\tif (!part || typeof part !== \"object\") return false;\n\t\t\tconst record = part as Record<string, unknown>;\n\t\t\treturn record.type === \"text\" && typeof record.text === \"string\";\n\t\t})\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\nfunction isDeepWikiErrorText(text: string): boolean {\n\tconst trimmed = text.trim();\n\treturn (\n\t\t/^Error fetching wiki for .+?: Repository not found\\./i.test(trimmed) ||\n\t\t/^Error processing question: Repository not found\\./i.test(trimmed)\n\t);\n}\n\nfunction extractToolText(result: unknown): string {\n\tif (!result || typeof result !== \"object\") throw new Error(\"DeepWiki returned no result object\");\n\n\tconst toolResult = result as McpToolCallResult;\n\tconst text = extractStructuredResult(toolResult) ?? extractContentResult(toolResult);\n\tif (!text) throw new Error(\"DeepWiki returned no text content\");\n\tif (toolResult.isError || isDeepWikiErrorText(text)) throw new Error(text);\n\treturn text;\n}\n\nexport function extractStructureSections(text: string): string[] {\n\treturn uniqueTitles(text.split(\"\\n\").map((line) => line.match(/^\\s*-\\s+\\d+\\s+(.+)$/)?.[1]?.trim()));\n}\n\nexport function extractContentPages(text: string): string[] {\n\treturn uniqueTitles(text.split(\"\\n\").map((line) => line.match(PAGE_HEADER_RE)?.[1]?.trim()));\n}\n\nfunction uniqueTitles(titles: Array<string | undefined>): string[] {\n\tconst seen = new Set<string>();\n\tconst result: string[] = [];\n\tfor (const title of titles) {\n\t\tif (!title || seen.has(title)) continue;\n\t\tseen.add(title);\n\t\tresult.push(title);\n\t}\n\treturn result;\n}\n\nfunction extractPageTitles(toolName: DeepWikiToolName, text: string): string[] {\n\tif (toolName === \"read_wiki_structure\") return extractStructureSections(text);\n\tif (toolName === \"read_wiki_contents\") return extractContentPages(text);\n\treturn [];\n}\n\nexport async function callDeepWiki(params: DeepWikiParams, signal: AbortSignal | undefined): Promise<DeepWikiResponse> {\n\tsignal?.throwIfAborted();\n\tconst normalizedParams = normalizeDeepWikiParams(params);\n\tconst key = cacheKey(normalizedParams);\n\tconst cached = responseCache.get(key);\n\tif (cached && cached.expiresAt > Date.now()) {\n\t\treturn cloneResponse(cached.response, true);\n\t}\n\tif (cached) responseCache.delete(key);\n\n\tconst toolName = toolNameForAction(normalizedParams.action);\n\tconst bodyJson = JSON.stringify({\n\t\tjsonrpc: \"2.0\",\n\t\tid: 1,\n\t\tmethod: \"tools/call\",\n\t\tparams: {\n\t\t\tname: toolName,\n\t\t\targuments: argumentsForParams(normalizedParams),\n\t\t},\n\t});\n\n\t// Timeout + bounded transient retry live in this extension's http.ts; non-retryable\n\t// statuses come back here for the domain-specific HTTP error below.\n\tconst { response, text } = await fetchWithRetry(\n\t\tDEEPWIKI_MCP_URL,\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\tAccept: \"application/json, text/event-stream\",\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"MCP-Protocol-Version\": MCP_PROTOCOL_VERSION,\n\t\t\t},\n\t\t\tbody: bodyJson,\n\t\t},\n\t\t{ timeoutMs: REQUEST_TIMEOUT_MS, retries: MAX_RETRIES, signal, label: \"DeepWiki\" },\n\t);\n\tsignal?.throwIfAborted();\n\n\tif (!response.ok) {\n\t\tthrow new Error(`DeepWiki HTTP ${response.status}: ${truncate(text)}`);\n\t}\n\n\tconst envelope = parseEnvelope(text, response.headers.get(\"content-type\"));\n\tif (envelope.error) {\n\t\tthrow new Error(envelope.error.message ?? `DeepWiki JSON-RPC error ${envelope.error.code ?? \"unknown\"}`);\n\t}\n\n\tconst resultText = extractToolText(envelope.result);\n\tconst pageTitles = extractPageTitles(toolName, resultText);\n\tconst result: DeepWikiResponse = {\n\t\ttoolName,\n\t\ttext: resultText,\n\t\toutputLength: resultText.length,\n\t\t...(pageTitles.length ? { pageTitles } : {}),\n\t};\n\tsignal?.throwIfAborted();\n\tresponseCache.set(key, { expiresAt: Date.now() + CACHE_TTL_MS, response: cloneResponse(result, false) });\n\twhile (responseCache.size > MAX_CACHE_ENTRIES) {\n\t\tconst oldest = responseCache.keys().next().value;\n\t\tif (oldest === undefined) break;\n\t\tresponseCache.delete(oldest);\n\t}\n\treturn result;\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AgentToolResult, AgentToolUpdateCallback } from "../../core/extensions/types.ts";
|
|
2
2
|
import { type DeepWikiAction, type DeepWikiParams } from "./schema.ts";
|
|
3
|
+
export declare const DEEPWIKI_OUTPUT_CHAR_BUDGET = 120000;
|
|
3
4
|
export interface DeepWikiDetails {
|
|
4
5
|
action: DeepWikiAction;
|
|
5
6
|
repoName: string;
|
|
@@ -13,7 +14,7 @@ export interface DeepWikiDetails {
|
|
|
13
14
|
/** Resolved title and 1-based position of a single-page contents read. */
|
|
14
15
|
requestedPage?: string;
|
|
15
16
|
pageIndex?: number;
|
|
16
|
-
/** Set
|
|
17
|
+
/** Set when model-facing text was truncated to the character budget. */
|
|
17
18
|
shownPages?: number;
|
|
18
19
|
truncatedChars?: number;
|
|
19
20
|
/** Legacy fields kept so older session entries still render. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAI/F,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAA2B,MAAM,aAAa,CAAC;AAEhG,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAI/F,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAA2B,MAAM,aAAa,CAAC;AAEhG,eAAO,MAAM,2BAA2B,SAAU,CAAC;AAGnD,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AA+BD,wBAAsB,eAAe,CACpC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,uBAAuB,CAAC,eAAe,CAAC,GAAG,SAAS,GAC5D,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAuE3C"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { callDeepWiki } from "./client.js";
|
|
2
2
|
import { extractPage, truncateContentsByPages } from "./contents.js";
|
|
3
3
|
import { normalizeDeepWikiParams } from "./schema.js";
|
|
4
|
+
export const DEEPWIKI_OUTPUT_CHAR_BUDGET = 120_000;
|
|
5
|
+
const CONTENTS_BODY_CHAR_BUDGET = DEEPWIKI_OUTPUT_CHAR_BUDGET - 2_000;
|
|
4
6
|
function buildResult(params, text, extra = {}) {
|
|
5
7
|
const repoNames = Array.isArray(params.repoName) ? params.repoName : [params.repoName];
|
|
6
8
|
return {
|
|
@@ -14,6 +16,14 @@ function buildResult(params, text, extra = {}) {
|
|
|
14
16
|
},
|
|
15
17
|
};
|
|
16
18
|
}
|
|
19
|
+
function boundDeepWikiOutput(text, action) {
|
|
20
|
+
if (text.length <= DEEPWIKI_OUTPUT_CHAR_BUDGET)
|
|
21
|
+
return { text, truncated: false, truncatedChars: 0 };
|
|
22
|
+
const notice = `\n\n[DeepWiki ${action} output truncated to ${DEEPWIKI_OUTPUT_CHAR_BUDGET} characters. Use a focused page or question request for the omitted content.]`;
|
|
23
|
+
const keepLength = Math.max(0, DEEPWIKI_OUTPUT_CHAR_BUDGET - notice.length);
|
|
24
|
+
const kept = text.slice(0, keepLength).trimEnd();
|
|
25
|
+
return { text: `${kept}${notice}`, truncated: true, truncatedChars: text.length - kept.length };
|
|
26
|
+
}
|
|
17
27
|
export async function executeDeepWiki(params, signal, onUpdate) {
|
|
18
28
|
const normalizedParams = normalizeDeepWikiParams(params);
|
|
19
29
|
const repoLabel = Array.isArray(normalizedParams.repoName)
|
|
@@ -57,7 +67,7 @@ export async function executeDeepWiki(params, signal, onUpdate) {
|
|
|
57
67
|
const more = lookup.titles.length > 30 ? ` … +${lookup.titles.length - 30} more` : "";
|
|
58
68
|
throw new Error(`page "${normalizedParams.page}" not found in ${repoLabel} wiki (${lookup.titles.length} pages).\nAvailable pages: ${list}${more}`);
|
|
59
69
|
}
|
|
60
|
-
const truncation = truncateContentsByPages(lookup.found.text);
|
|
70
|
+
const truncation = truncateContentsByPages(lookup.found.text, CONTENTS_BODY_CHAR_BUDGET);
|
|
61
71
|
resultText = truncation.text;
|
|
62
72
|
extra.requestedPage = lookup.found.title;
|
|
63
73
|
extra.pageIndex = lookup.found.index;
|
|
@@ -65,7 +75,7 @@ export async function executeDeepWiki(params, signal, onUpdate) {
|
|
|
65
75
|
extra.truncatedChars = truncation.truncatedChars;
|
|
66
76
|
}
|
|
67
77
|
else {
|
|
68
|
-
const truncation = truncateContentsByPages(response.text);
|
|
78
|
+
const truncation = truncateContentsByPages(response.text, CONTENTS_BODY_CHAR_BUDGET);
|
|
69
79
|
if (truncation.truncated) {
|
|
70
80
|
resultText = truncation.text;
|
|
71
81
|
extra.shownPages = truncation.shownPages;
|
|
@@ -73,6 +83,11 @@ export async function executeDeepWiki(params, signal, onUpdate) {
|
|
|
73
83
|
}
|
|
74
84
|
}
|
|
75
85
|
}
|
|
86
|
+
const bounded = boundDeepWikiOutput(resultText, normalizedParams.action);
|
|
87
|
+
if (bounded.truncated) {
|
|
88
|
+
resultText = bounded.text;
|
|
89
|
+
extra.truncatedChars = Math.max(extra.truncatedChars ?? 0, bounded.truncatedChars);
|
|
90
|
+
}
|
|
76
91
|
return buildResult(normalizedParams, resultText, extra);
|
|
77
92
|
}
|
|
78
93
|
//# sourceMappingURL=execute.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/execute.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAyB,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAA4C,uBAAuB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/execute.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult, AgentToolUpdateCallback } from \"../../core/extensions/types.ts\";\n\nimport { callDeepWiki, type DeepWikiResponse } from \"./client.ts\";\nimport { extractPage, truncateContentsByPages } from \"./contents.ts\";\nimport { type DeepWikiAction, type DeepWikiParams, normalizeDeepWikiParams } from \"./schema.ts\";\n\nexport const DEEPWIKI_OUTPUT_CHAR_BUDGET = 120_000;\nconst CONTENTS_BODY_CHAR_BUDGET = DEEPWIKI_OUTPUT_CHAR_BUDGET - 2_000;\n\nexport interface DeepWikiDetails {\n\taction: DeepWikiAction;\n\trepoName: string;\n\trepoNames?: string[];\n\tquestion?: string;\n\ttoolName?: string;\n\toutputLength?: number;\n\tcacheHit?: boolean;\n\tpageCount?: number;\n\tpageTitles?: string[];\n\t/** Resolved title and 1-based position of a single-page contents read. */\n\trequestedPage?: string;\n\tpageIndex?: number;\n\t/** Set when model-facing text was truncated to the character budget. */\n\tshownPages?: number;\n\ttruncatedChars?: number;\n\t/** Legacy fields kept so older session entries still render. */\n\tsectionCount?: number;\n\tsectionTitles?: string[];\n\terrorMessage?: string;\n}\n\nfunction buildResult(\n\tparams: DeepWikiParams,\n\ttext: string,\n\textra: Partial<DeepWikiDetails> = {},\n): AgentToolResult<DeepWikiDetails> {\n\tconst repoNames = Array.isArray(params.repoName) ? params.repoName : [params.repoName];\n\treturn {\n\t\tcontent: [{ type: \"text\", text }],\n\t\tdetails: {\n\t\t\taction: params.action,\n\t\t\trepoName: repoNames.join(\", \"),\n\t\t\t...(repoNames.length > 1 ? { repoNames } : {}),\n\t\t\t...(params.question ? { question: params.question } : {}),\n\t\t\t...extra,\n\t\t},\n\t};\n}\n\nfunction boundDeepWikiOutput(\n\ttext: string,\n\taction: DeepWikiAction,\n): { text: string; truncated: boolean; truncatedChars: number } {\n\tif (text.length <= DEEPWIKI_OUTPUT_CHAR_BUDGET) return { text, truncated: false, truncatedChars: 0 };\n\tconst notice = `\\n\\n[DeepWiki ${action} output truncated to ${DEEPWIKI_OUTPUT_CHAR_BUDGET} characters. Use a focused page or question request for the omitted content.]`;\n\tconst keepLength = Math.max(0, DEEPWIKI_OUTPUT_CHAR_BUDGET - notice.length);\n\tconst kept = text.slice(0, keepLength).trimEnd();\n\treturn { text: `${kept}${notice}`, truncated: true, truncatedChars: text.length - kept.length };\n}\n\nexport async function executeDeepWiki(\n\tparams: DeepWikiParams,\n\tsignal: AbortSignal | undefined,\n\tonUpdate: AgentToolUpdateCallback<DeepWikiDetails> | undefined,\n): Promise<AgentToolResult<DeepWikiDetails>> {\n\tconst normalizedParams = normalizeDeepWikiParams(params);\n\tconst repoLabel = Array.isArray(normalizedParams.repoName)\n\t\t? normalizedParams.repoName.join(\", \")\n\t\t: normalizedParams.repoName;\n\n\tonUpdate?.(buildResult(normalizedParams, `Querying DeepWiki for ${repoLabel}...`));\n\n\tlet response: DeepWikiResponse;\n\ttry {\n\t\tresponse = await callDeepWiki(normalizedParams, signal);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`DeepWiki call failed: ${message}`);\n\t}\n\n\tconst extra: Partial<DeepWikiDetails> = {\n\t\ttoolName: response.toolName,\n\t\toutputLength: response.outputLength,\n\t\t...(response.cacheHit ? { cacheHit: true } : {}),\n\t\t...(response.pageTitles\n\t\t\t? {\n\t\t\t\t\tpageCount: response.pageTitles.length,\n\t\t\t\t\tpageTitles: response.pageTitles,\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n\n\t// Bounded model-facing output: the cache keeps the full response\n\t// (outputLength/pageTitles describe it); only the returned text is cut.\n\t// truncateContentsByPages/extractPage are deterministic, so cached and\n\t// fresh calls produce identical text.\n\tlet resultText = response.text;\n\tif (normalizedParams.action === \"contents\") {\n\t\tif (normalizedParams.page !== undefined) {\n\t\t\t// Single-page read: upstream has no per-page fetch, so slice the page\n\t\t\t// out of the (cached) full wiki locally.\n\t\t\tconst lookup = extractPage(response.text, normalizedParams.page);\n\t\t\tif (!lookup.found) {\n\t\t\t\tif (lookup.titles.length === 0) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`page \"${normalizedParams.page}\" not found: this wiki has no page structure. Call contents without page.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst list = lookup.titles.slice(0, 30).join(\"; \");\n\t\t\t\tconst more = lookup.titles.length > 30 ? ` … +${lookup.titles.length - 30} more` : \"\";\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`page \"${normalizedParams.page}\" not found in ${repoLabel} wiki (${lookup.titles.length} pages).\\nAvailable pages: ${list}${more}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst truncation = truncateContentsByPages(lookup.found.text, CONTENTS_BODY_CHAR_BUDGET);\n\t\t\tresultText = truncation.text;\n\t\t\textra.requestedPage = lookup.found.title;\n\t\t\textra.pageIndex = lookup.found.index;\n\t\t\tif (truncation.truncated) extra.truncatedChars = truncation.truncatedChars;\n\t\t} else {\n\t\t\tconst truncation = truncateContentsByPages(response.text, CONTENTS_BODY_CHAR_BUDGET);\n\t\t\tif (truncation.truncated) {\n\t\t\t\tresultText = truncation.text;\n\t\t\t\textra.shownPages = truncation.shownPages;\n\t\t\t\textra.truncatedChars = truncation.truncatedChars;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst bounded = boundDeepWikiOutput(resultText, normalizedParams.action);\n\tif (bounded.truncated) {\n\t\tresultText = bounded.text;\n\t\textra.truncatedChars = Math.max(extra.truncatedChars ?? 0, bounded.truncatedChars);\n\t}\n\treturn buildResult(normalizedParams, resultText, extra);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/http.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/http.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,4BAA4B,QAAkB,CAAC;AAG5D,MAAM,WAAW,iBAAiB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAkED,mFAAmF;AACnF,wBAAsB,cAAc,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,iBAAiB,GACxB,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB/C"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { readResponseTextBounded } from "../../utils/http-response.js";
|
|
2
|
+
export const DEEPWIKI_RESPONSE_BODY_BYTES = 8 * 1024 * 1024;
|
|
3
|
+
const DEEPWIKI_RESPONSE_OVERFLOW_MESSAGE = `DeepWiki response exceeded ${DEEPWIKI_RESPONSE_BODY_BYTES} bytes`;
|
|
1
4
|
function delay(milliseconds, label, signal) {
|
|
2
5
|
return new Promise((resolve, reject) => {
|
|
3
6
|
const handleAbort = () => {
|
|
@@ -33,7 +36,11 @@ async function attemptOnce(url, request, timeoutMs, label, signal) {
|
|
|
33
36
|
signal?.addEventListener("abort", abortFromParent, { once: true });
|
|
34
37
|
try {
|
|
35
38
|
const response = await fetch(url, { ...request, signal: controller.signal });
|
|
36
|
-
const text = await response
|
|
39
|
+
const text = await readResponseTextBounded(response, {
|
|
40
|
+
maxBytes: DEEPWIKI_RESPONSE_BODY_BYTES,
|
|
41
|
+
overflowMessage: DEEPWIKI_RESPONSE_OVERFLOW_MESSAGE,
|
|
42
|
+
signal: controller.signal,
|
|
43
|
+
});
|
|
37
44
|
return { ok: true, response, text };
|
|
38
45
|
}
|
|
39
46
|
catch (error) {
|
|
@@ -41,7 +48,12 @@ async function attemptOnce(url, request, timeoutMs, label, signal) {
|
|
|
41
48
|
throw new Error(`${label} request timed out after ${timeoutMs / 1000}s`);
|
|
42
49
|
if (signal?.aborted)
|
|
43
50
|
throw new Error(`${label} request aborted`);
|
|
44
|
-
|
|
51
|
+
const normalizedError = error instanceof Error ? error : new Error(String(error));
|
|
52
|
+
return {
|
|
53
|
+
ok: false,
|
|
54
|
+
error: normalizedError,
|
|
55
|
+
retryable: normalizedError.message !== DEEPWIKI_RESPONSE_OVERFLOW_MESSAGE,
|
|
56
|
+
};
|
|
45
57
|
}
|
|
46
58
|
finally {
|
|
47
59
|
clearTimeout(timeout);
|
|
@@ -59,6 +71,8 @@ export async function fetchWithRetry(url, request, options) {
|
|
|
59
71
|
const outcome = await attemptOnce(url, request, options.timeoutMs, label, options.signal);
|
|
60
72
|
if (!outcome.ok) {
|
|
61
73
|
lastError = outcome.error;
|
|
74
|
+
if (!outcome.retryable)
|
|
75
|
+
throw outcome.error;
|
|
62
76
|
continue;
|
|
63
77
|
}
|
|
64
78
|
const { response, text } = outcome;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/http.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/http.ts"],"names":[],"mappings":"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","sourcesContent":["import { readResponseTextBounded } from \"../../utils/http-response.ts\";\n\nexport const DEEPWIKI_RESPONSE_BODY_BYTES = 8 * 1024 * 1024;\nconst DEEPWIKI_RESPONSE_OVERFLOW_MESSAGE = `DeepWiki response exceeded ${DEEPWIKI_RESPONSE_BODY_BYTES} bytes`;\n\nexport interface FetchRetryOptions {\n\ttimeoutMs: number;\n\tretries?: number;\n\tsignal?: AbortSignal;\n\tlabel?: string;\n}\n\nfunction delay(milliseconds: number, label: string, signal: AbortSignal | undefined): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst handleAbort = () => {\n\t\t\tcleanup();\n\t\t\treject(new Error(`${label} request aborted`));\n\t\t};\n\t\tconst timer = setTimeout(() => {\n\t\t\tcleanup();\n\t\t\tresolve();\n\t\t}, milliseconds);\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timer);\n\t\t\tsignal?.removeEventListener(\"abort\", handleAbort);\n\t\t};\n\n\t\tif (signal?.aborted) {\n\t\t\thandleAbort();\n\t\t\treturn;\n\t\t}\n\t\tsignal?.addEventListener(\"abort\", handleAbort, { once: true });\n\t});\n}\n\nasync function attemptOnce(\n\turl: string,\n\trequest: RequestInit,\n\ttimeoutMs: number,\n\tlabel: string,\n\tsignal: AbortSignal | undefined,\n): Promise<{ ok: true; response: Response; text: string } | { ok: false; error: Error; retryable: boolean }> {\n\tconst controller = new AbortController();\n\tlet timedOut = false;\n\tconst abortFromParent = () => controller.abort(signal?.reason);\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, timeoutMs);\n\n\tif (signal?.aborted) abortFromParent();\n\telse signal?.addEventListener(\"abort\", abortFromParent, { once: true });\n\n\ttry {\n\t\tconst response = await fetch(url, { ...request, signal: controller.signal });\n\t\tconst text = await readResponseTextBounded(response, {\n\t\t\tmaxBytes: DEEPWIKI_RESPONSE_BODY_BYTES,\n\t\t\toverflowMessage: DEEPWIKI_RESPONSE_OVERFLOW_MESSAGE,\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\treturn { ok: true, response, text };\n\t} catch (error) {\n\t\tif (timedOut) throw new Error(`${label} request timed out after ${timeoutMs / 1000}s`);\n\t\tif (signal?.aborted) throw new Error(`${label} request aborted`);\n\t\tconst normalizedError = error instanceof Error ? error : new Error(String(error));\n\t\treturn {\n\t\t\tok: false,\n\t\t\terror: normalizedError,\n\t\t\tretryable: normalizedError.message !== DEEPWIKI_RESPONSE_OVERFLOW_MESSAGE,\n\t\t};\n\t} finally {\n\t\tclearTimeout(timeout);\n\t\tsignal?.removeEventListener(\"abort\", abortFromParent);\n\t}\n}\n\n/** Fetch with a per-attempt timeout and bounded retries for transient failures. */\nexport async function fetchWithRetry(\n\turl: string,\n\trequest: RequestInit,\n\toptions: FetchRetryOptions,\n): Promise<{ response: Response; text: string }> {\n\tconst retries = options.retries ?? 2;\n\tconst label = options.label ?? \"HTTP\";\n\tlet lastError: Error | undefined;\n\n\tfor (let attemptIndex = 0; attemptIndex <= retries; attemptIndex++) {\n\t\tif (attemptIndex > 0) await delay(1000 * attemptIndex, label, options.signal);\n\t\tconst outcome = await attemptOnce(url, request, options.timeoutMs, label, options.signal);\n\t\tif (!outcome.ok) {\n\t\t\tlastError = outcome.error;\n\t\t\tif (!outcome.retryable) throw outcome.error;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst { response, text } = outcome;\n\t\tconst retryable = response.status >= 500 || response.status === 429;\n\t\tif (!response.ok && retryable && attemptIndex < retries) {\n\t\t\tlastError = new Error(`${label} HTTP ${response.status}`);\n\t\t\tcontinue;\n\t\t}\n\t\treturn { response, text };\n\t}\n\n\tthrow lastError ?? new Error(`${label} request failed`);\n}\n"]}
|
|
@@ -4,7 +4,7 @@ export declare const DeepWikiParamsSchema: Type.TObject<{
|
|
|
4
4
|
action: Type.TUnsafe<"structure" | "contents" | "question">;
|
|
5
5
|
repoName: Type.TUnion<[Type.TString, Type.TArray<Type.TString>]>;
|
|
6
6
|
question: Type.TOptional<Type.TString>;
|
|
7
|
-
page: Type.TOptional<Type.TUnion<[Type.TString, Type.
|
|
7
|
+
page: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
|
|
8
8
|
}>;
|
|
9
9
|
export type DeepWikiAction = (typeof DEEPWIKI_ACTIONS)[number];
|
|
10
10
|
export type DeepWikiParams = Static<typeof DeepWikiParamsSchema>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAI5C,eAAO,MAAM,gBAAgB,gDAAiD,CAAC;AAQ/E,eAAO,MAAM,oBAAoB;;;;;EAkC/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC/D,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAI5C,eAAO,MAAM,gBAAgB,gDAAiD,CAAC;AAQ/E,eAAO,MAAM,oBAAoB;;;;;EAkC/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC/D,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAqFjE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAkCxD;AA4BD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAsCtE"}
|
|
@@ -26,7 +26,7 @@ export const DeepWikiParamsSchema = Type.Object({
|
|
|
26
26
|
minLength: 1,
|
|
27
27
|
description: "Required for action question. Ask a focused question about architecture, APIs, implementation patterns, extension points, onboarding, or cross-repo comparison.",
|
|
28
28
|
})),
|
|
29
|
-
page: Type.Optional(Type.Union([Type.String({ minLength: 1 }), Type.
|
|
29
|
+
page: Type.Optional(Type.Union([Type.String({ minLength: 1 }), Type.Integer({ minimum: 1 })], {
|
|
30
30
|
description: 'Only for action contents: one page by 1-based index or by title from structure (e.g. "Extension System") — titles do not include outline numbers like "4.4". Run structure first if unsure. Prefer page reads over omitting page.',
|
|
31
31
|
})),
|
|
32
32
|
});
|
|
@@ -59,10 +59,16 @@ function readString(record, keys) {
|
|
|
59
59
|
function readPageRef(record) {
|
|
60
60
|
for (const key of ["page", "pageName", "pageTitle"]) {
|
|
61
61
|
const value = record[key];
|
|
62
|
-
if (
|
|
62
|
+
if (value === undefined || value === null)
|
|
63
|
+
continue;
|
|
64
|
+
if (typeof value === "number") {
|
|
65
|
+
if (!Number.isInteger(value) || value < 1)
|
|
66
|
+
throw new Error("page must be a positive 1-based integer");
|
|
63
67
|
return value;
|
|
68
|
+
}
|
|
64
69
|
if (typeof value === "string" && value.trim())
|
|
65
70
|
return normalizePageRef(value.trim());
|
|
71
|
+
throw new Error("page must be a non-empty title or positive 1-based integer");
|
|
66
72
|
}
|
|
67
73
|
return undefined;
|
|
68
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { StringEnum } from \"@earendil-works/pi-ai\";\nimport { type Static, Type } from \"typebox\";\n\nimport { normalizePageRef } from \"./contents.ts\";\n\nexport const DEEPWIKI_ACTIONS = [\"structure\", \"contents\", \"question\"] as const;\nconst MAX_QUESTION_REPOS = 10;\n\nconst DeepWikiActionSchema = StringEnum(DEEPWIKI_ACTIONS, {\n\tdescription:\n\t\t\"DeepWiki operation: structure lists a repo's generated wiki pages, contents reads one page of that wiki (or all of it when page is omitted), and question answers focused repo/reference/comparison questions across up to 10 repos.\",\n});\n\nexport const DeepWikiParamsSchema = Type.Object({\n\taction: DeepWikiActionSchema,\n\trepoName: Type.Union([\n\t\tType.String({\n\t\t\tminLength: 1,\n\t\t\tdescription:\n\t\t\t\t'One public GitHub repo as \"owner/repo\" (preferred), or a GitHub/DeepWiki URL. Required for structure and contents; for question with a single repo use this string form — not a one-element array.',\n\t\t}),\n\t\tType.Array(\n\t\t\tType.String({\n\t\t\t\tminLength: 1,\n\t\t\t\tdescription: 'Public GitHub repo in \"owner/repo\" format.',\n\t\t\t}),\n\t\t\t{\n\t\t\t\tminItems: 1,\n\t\t\t\tmaxItems: MAX_QUESTION_REPOS,\n\t\t\t\tdescription:\n\t\t\t\t\t\"Only for action question when comparing 2-10 repos. Each entry is owner/repo. For one repo use a string repoName instead.\",\n\t\t\t},\n\t\t),\n\t]),\n\tquestion: Type.Optional(\n\t\tType.String({\n\t\t\tminLength: 1,\n\t\t\tdescription:\n\t\t\t\t\"Required for action question. Ask a focused question about architecture, APIs, implementation patterns, extension points, onboarding, or cross-repo comparison.\",\n\t\t}),\n\t),\n\tpage: Type.Optional(\n\t\tType.Union([Type.String({ minLength: 1 }), Type.Number()], {\n\t\t\tdescription:\n\t\t\t\t'Only for action contents: one page by 1-based index or by title from structure (e.g. \"Extension System\") — titles do not include outline numbers like \"4.4\". Run structure first if unsure. Prefer page reads over omitting page.',\n\t\t}),\n\t),\n});\n\nexport type DeepWikiAction = (typeof DEEPWIKI_ACTIONS)[number];\nexport type DeepWikiParams = Static<typeof DeepWikiParamsSchema>;\n\nconst ACTION_ALIASES: Record<string, DeepWikiAction> = {\n\task: \"question\",\n\task_question: \"question\",\n\tcontents: \"contents\",\n\tcontent: \"contents\",\n\tfull: \"contents\",\n\tmap: \"structure\",\n\tpages: \"structure\",\n\tquestion: \"question\",\n\tquery: \"question\",\n\tread_wiki_contents: \"contents\",\n\tread_wiki_structure: \"structure\",\n\tstructure: \"structure\",\n\ttopics: \"structure\",\n\twiki: \"contents\",\n};\n\nconst GITHUB_OWNER_RE = /^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38}[A-Za-z0-9])?$/;\nconst GITHUB_REPO_RE = /^[A-Za-z0-9._-]{1,100}$/;\n\nfunction readString(record: Record<string, unknown>, keys: string[]): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = record[key];\n\t\tif (typeof value === \"string\" && value.trim()) return value.trim();\n\t}\n\treturn undefined;\n}\n\nfunction readPageRef(record: Record<string, unknown>): string | number | undefined {\n\tfor (const key of [\"page\", \"pageName\", \"pageTitle\"]) {\n\t\tconst value = record[key];\n\t\tif (typeof value === \"number\" && Number.isFinite(value)) return value;\n\t\tif (typeof value === \"string\" && value.trim()) return normalizePageRef(value.trim());\n\t}\n\treturn undefined;\n}\n\nfunction coerceRepoNameInput(value: unknown): unknown {\n\tif (Array.isArray(value)) return value;\n\tif (typeof value !== \"string\") return value;\n\tconst trimmed = value.trim();\n\tif (!trimmed.startsWith(\"[\")) return value;\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(trimmed);\n\t\tif (Array.isArray(parsed)) return parsed;\n\t} catch {\n\t\t/* keep original string */\n\t}\n\treturn value;\n}\n\nfunction normalizeAction(\n\taction: unknown,\n\tquestion: string | undefined,\n\tpage: string | number | undefined,\n): DeepWikiAction {\n\tif (typeof action === \"string\") {\n\t\tconst key = action\n\t\t\t.trim()\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[\\s-]+/g, \"_\");\n\t\tif (!key) return inferAction(question, page);\n\t\tconst normalized = ACTION_ALIASES[key];\n\t\tif (normalized) return normalized;\n\t\tthrow new Error(`unsupported deepwiki action: ${action}`);\n\t}\n\tif (action !== undefined && action !== null) {\n\t\tthrow new Error(\"deepwiki action must be a string\");\n\t}\n\treturn inferAction(question, page);\n}\n\nfunction inferAction(question: string | undefined, page: string | number | undefined): DeepWikiAction {\n\tif (question) return \"question\";\n\tif (page !== undefined) return \"contents\";\n\treturn \"structure\";\n}\n\nexport function normalizeRepoName(value: unknown): string {\n\tif (typeof value !== \"string\") throw new Error(\"repoName is required\");\n\n\tconst input = value.trim().replace(/^\\/+|\\/+$/g, \"\");\n\tif (!input) throw new Error(\"repoName is required\");\n\n\tlet owner: string | undefined;\n\tlet repo: string | undefined;\n\n\tconst sshMatch = input.match(/^git@github\\.com:([^/\\s]+)\\/([^/\\s]+?)(?:\\.git)?$/i);\n\tif (sshMatch) {\n\t\towner = sshMatch[1];\n\t\trepo = sshMatch[2];\n\t} else if (/^(?:https?:\\/\\/)?(?:www\\.)?(?:github\\.com|deepwiki\\.com)\\//i.test(input)) {\n\t\tconst urlInput = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(input) ? input : `https://${input}`;\n\t\ttry {\n\t\t\tconst url = new URL(urlInput);\n\t\t\tconst [urlOwner, urlRepo] = url.pathname.replace(/^\\/+|\\/+$/g, \"\").split(\"/\");\n\t\t\towner = urlOwner;\n\t\t\trepo = urlRepo?.replace(/\\.git$/i, \"\");\n\t\t} catch {\n\t\t\tthrow new Error('repoName must use \"owner/repo\" format');\n\t\t}\n\t} else {\n\t\tconst parts = input.replace(/\\.git$/i, \"\").split(\"/\");\n\t\tif (parts.length === 2) {\n\t\t\t[owner, repo] = parts;\n\t\t}\n\t}\n\n\tif (!owner || !repo || !GITHUB_OWNER_RE.test(owner) || !GITHUB_REPO_RE.test(repo)) {\n\t\tthrow new Error('repoName must use a public GitHub \"owner/repo\" identifier');\n\t}\n\treturn `${owner}/${repo}`;\n}\n\nfunction normalizeRepoNames(value: unknown): string[] {\n\tvalue = coerceRepoNameInput(value);\n\tconst values =\n\t\ttypeof value === \"string\" && value.includes(\",\")\n\t\t\t? value\n\t\t\t\t\t.split(\",\")\n\t\t\t\t\t.map((repo) => repo.trim())\n\t\t\t\t\t.filter(Boolean)\n\t\t\t: Array.isArray(value)\n\t\t\t\t? value\n\t\t\t\t: [value];\n\tconst repos = values.map((item) => normalizeRepoName(item));\n\tconst seen = new Set<string>();\n\tconst unique: string[] = [];\n\tfor (const repo of repos) {\n\t\tconst key = repo.toLowerCase();\n\t\tif (seen.has(key)) continue;\n\t\tseen.add(key);\n\t\tunique.push(repo);\n\t}\n\tif (unique.length > MAX_QUESTION_REPOS) {\n\t\tthrow new Error(`question action supports at most ${MAX_QUESTION_REPOS} repositories`);\n\t}\n\treturn unique;\n}\n\nexport function normalizeDeepWikiParams(input: unknown): DeepWikiParams {\n\tif (!input || typeof input !== \"object\") {\n\t\tthrow new Error(\"deepwiki arguments must be an object\");\n\t}\n\n\tconst record = input as Record<string, unknown>;\n\tconst question = readString(record, [\"question\", \"query\", \"prompt\"]);\n\tconst page = readPageRef(record);\n\tconst action = normalizeAction(record.action, question, page);\n\tconst rawRepoName =\n\t\trecord.repoName ??\n\t\trecord.repo ??\n\t\trecord.repos ??\n\t\trecord.repository ??\n\t\trecord.repositories ??\n\t\trecord.githubRepo ??\n\t\trecord.githubRepos;\n\tconst repoNames = normalizeRepoNames(rawRepoName);\n\n\tif (action === \"question\") {\n\t\tif (!question) throw new Error(\"question is required when action is question\");\n\t\treturn {\n\t\t\taction,\n\t\t\trepoName: repoNames.length > 1 ? repoNames : repoNames[0],\n\t\t\tquestion,\n\t\t};\n\t}\n\n\tif (repoNames.length !== 1) {\n\t\tthrow new Error(`${action} action requires exactly one repository`);\n\t}\n\n\t// page is meaningful only for contents; structure/question ignore it.\n\treturn {\n\t\taction,\n\t\trepoName: repoNames[0],\n\t\t...(action === \"contents\" && page !== undefined ? { page } : {}),\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { StringEnum } from \"@earendil-works/pi-ai\";\nimport { type Static, Type } from \"typebox\";\n\nimport { normalizePageRef } from \"./contents.ts\";\n\nexport const DEEPWIKI_ACTIONS = [\"structure\", \"contents\", \"question\"] as const;\nconst MAX_QUESTION_REPOS = 10;\n\nconst DeepWikiActionSchema = StringEnum(DEEPWIKI_ACTIONS, {\n\tdescription:\n\t\t\"DeepWiki operation: structure lists a repo's generated wiki pages, contents reads one page of that wiki (or all of it when page is omitted), and question answers focused repo/reference/comparison questions across up to 10 repos.\",\n});\n\nexport const DeepWikiParamsSchema = Type.Object({\n\taction: DeepWikiActionSchema,\n\trepoName: Type.Union([\n\t\tType.String({\n\t\t\tminLength: 1,\n\t\t\tdescription:\n\t\t\t\t'One public GitHub repo as \"owner/repo\" (preferred), or a GitHub/DeepWiki URL. Required for structure and contents; for question with a single repo use this string form — not a one-element array.',\n\t\t}),\n\t\tType.Array(\n\t\t\tType.String({\n\t\t\t\tminLength: 1,\n\t\t\t\tdescription: 'Public GitHub repo in \"owner/repo\" format.',\n\t\t\t}),\n\t\t\t{\n\t\t\t\tminItems: 1,\n\t\t\t\tmaxItems: MAX_QUESTION_REPOS,\n\t\t\t\tdescription:\n\t\t\t\t\t\"Only for action question when comparing 2-10 repos. Each entry is owner/repo. For one repo use a string repoName instead.\",\n\t\t\t},\n\t\t),\n\t]),\n\tquestion: Type.Optional(\n\t\tType.String({\n\t\t\tminLength: 1,\n\t\t\tdescription:\n\t\t\t\t\"Required for action question. Ask a focused question about architecture, APIs, implementation patterns, extension points, onboarding, or cross-repo comparison.\",\n\t\t}),\n\t),\n\tpage: Type.Optional(\n\t\tType.Union([Type.String({ minLength: 1 }), Type.Integer({ minimum: 1 })], {\n\t\t\tdescription:\n\t\t\t\t'Only for action contents: one page by 1-based index or by title from structure (e.g. \"Extension System\") — titles do not include outline numbers like \"4.4\". Run structure first if unsure. Prefer page reads over omitting page.',\n\t\t}),\n\t),\n});\n\nexport type DeepWikiAction = (typeof DEEPWIKI_ACTIONS)[number];\nexport type DeepWikiParams = Static<typeof DeepWikiParamsSchema>;\n\nconst ACTION_ALIASES: Record<string, DeepWikiAction> = {\n\task: \"question\",\n\task_question: \"question\",\n\tcontents: \"contents\",\n\tcontent: \"contents\",\n\tfull: \"contents\",\n\tmap: \"structure\",\n\tpages: \"structure\",\n\tquestion: \"question\",\n\tquery: \"question\",\n\tread_wiki_contents: \"contents\",\n\tread_wiki_structure: \"structure\",\n\tstructure: \"structure\",\n\ttopics: \"structure\",\n\twiki: \"contents\",\n};\n\nconst GITHUB_OWNER_RE = /^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38}[A-Za-z0-9])?$/;\nconst GITHUB_REPO_RE = /^[A-Za-z0-9._-]{1,100}$/;\n\nfunction readString(record: Record<string, unknown>, keys: string[]): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = record[key];\n\t\tif (typeof value === \"string\" && value.trim()) return value.trim();\n\t}\n\treturn undefined;\n}\n\nfunction readPageRef(record: Record<string, unknown>): string | number | undefined {\n\tfor (const key of [\"page\", \"pageName\", \"pageTitle\"]) {\n\t\tconst value = record[key];\n\t\tif (value === undefined || value === null) continue;\n\t\tif (typeof value === \"number\") {\n\t\t\tif (!Number.isInteger(value) || value < 1) throw new Error(\"page must be a positive 1-based integer\");\n\t\t\treturn value;\n\t\t}\n\t\tif (typeof value === \"string\" && value.trim()) return normalizePageRef(value.trim());\n\t\tthrow new Error(\"page must be a non-empty title or positive 1-based integer\");\n\t}\n\treturn undefined;\n}\n\nfunction coerceRepoNameInput(value: unknown): unknown {\n\tif (Array.isArray(value)) return value;\n\tif (typeof value !== \"string\") return value;\n\tconst trimmed = value.trim();\n\tif (!trimmed.startsWith(\"[\")) return value;\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(trimmed);\n\t\tif (Array.isArray(parsed)) return parsed;\n\t} catch {\n\t\t/* keep original string */\n\t}\n\treturn value;\n}\n\nfunction normalizeAction(\n\taction: unknown,\n\tquestion: string | undefined,\n\tpage: string | number | undefined,\n): DeepWikiAction {\n\tif (typeof action === \"string\") {\n\t\tconst key = action\n\t\t\t.trim()\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[\\s-]+/g, \"_\");\n\t\tif (!key) return inferAction(question, page);\n\t\tconst normalized = ACTION_ALIASES[key];\n\t\tif (normalized) return normalized;\n\t\tthrow new Error(`unsupported deepwiki action: ${action}`);\n\t}\n\tif (action !== undefined && action !== null) {\n\t\tthrow new Error(\"deepwiki action must be a string\");\n\t}\n\treturn inferAction(question, page);\n}\n\nfunction inferAction(question: string | undefined, page: string | number | undefined): DeepWikiAction {\n\tif (question) return \"question\";\n\tif (page !== undefined) return \"contents\";\n\treturn \"structure\";\n}\n\nexport function normalizeRepoName(value: unknown): string {\n\tif (typeof value !== \"string\") throw new Error(\"repoName is required\");\n\n\tconst input = value.trim().replace(/^\\/+|\\/+$/g, \"\");\n\tif (!input) throw new Error(\"repoName is required\");\n\n\tlet owner: string | undefined;\n\tlet repo: string | undefined;\n\n\tconst sshMatch = input.match(/^git@github\\.com:([^/\\s]+)\\/([^/\\s]+?)(?:\\.git)?$/i);\n\tif (sshMatch) {\n\t\towner = sshMatch[1];\n\t\trepo = sshMatch[2];\n\t} else if (/^(?:https?:\\/\\/)?(?:www\\.)?(?:github\\.com|deepwiki\\.com)\\//i.test(input)) {\n\t\tconst urlInput = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(input) ? input : `https://${input}`;\n\t\ttry {\n\t\t\tconst url = new URL(urlInput);\n\t\t\tconst [urlOwner, urlRepo] = url.pathname.replace(/^\\/+|\\/+$/g, \"\").split(\"/\");\n\t\t\towner = urlOwner;\n\t\t\trepo = urlRepo?.replace(/\\.git$/i, \"\");\n\t\t} catch {\n\t\t\tthrow new Error('repoName must use \"owner/repo\" format');\n\t\t}\n\t} else {\n\t\tconst parts = input.replace(/\\.git$/i, \"\").split(\"/\");\n\t\tif (parts.length === 2) {\n\t\t\t[owner, repo] = parts;\n\t\t}\n\t}\n\n\tif (!owner || !repo || !GITHUB_OWNER_RE.test(owner) || !GITHUB_REPO_RE.test(repo)) {\n\t\tthrow new Error('repoName must use a public GitHub \"owner/repo\" identifier');\n\t}\n\treturn `${owner}/${repo}`;\n}\n\nfunction normalizeRepoNames(value: unknown): string[] {\n\tvalue = coerceRepoNameInput(value);\n\tconst values =\n\t\ttypeof value === \"string\" && value.includes(\",\")\n\t\t\t? value\n\t\t\t\t\t.split(\",\")\n\t\t\t\t\t.map((repo) => repo.trim())\n\t\t\t\t\t.filter(Boolean)\n\t\t\t: Array.isArray(value)\n\t\t\t\t? value\n\t\t\t\t: [value];\n\tconst repos = values.map((item) => normalizeRepoName(item));\n\tconst seen = new Set<string>();\n\tconst unique: string[] = [];\n\tfor (const repo of repos) {\n\t\tconst key = repo.toLowerCase();\n\t\tif (seen.has(key)) continue;\n\t\tseen.add(key);\n\t\tunique.push(repo);\n\t}\n\tif (unique.length > MAX_QUESTION_REPOS) {\n\t\tthrow new Error(`question action supports at most ${MAX_QUESTION_REPOS} repositories`);\n\t}\n\treturn unique;\n}\n\nexport function normalizeDeepWikiParams(input: unknown): DeepWikiParams {\n\tif (!input || typeof input !== \"object\") {\n\t\tthrow new Error(\"deepwiki arguments must be an object\");\n\t}\n\n\tconst record = input as Record<string, unknown>;\n\tconst question = readString(record, [\"question\", \"query\", \"prompt\"]);\n\tconst page = readPageRef(record);\n\tconst action = normalizeAction(record.action, question, page);\n\tconst rawRepoName =\n\t\trecord.repoName ??\n\t\trecord.repo ??\n\t\trecord.repos ??\n\t\trecord.repository ??\n\t\trecord.repositories ??\n\t\trecord.githubRepo ??\n\t\trecord.githubRepos;\n\tconst repoNames = normalizeRepoNames(rawRepoName);\n\n\tif (action === \"question\") {\n\t\tif (!question) throw new Error(\"question is required when action is question\");\n\t\treturn {\n\t\t\taction,\n\t\t\trepoName: repoNames.length > 1 ? repoNames : repoNames[0],\n\t\t\tquestion,\n\t\t};\n\t}\n\n\tif (repoNames.length !== 1) {\n\t\tthrow new Error(`${action} action requires exactly one repository`);\n\t}\n\n\t// page is meaningful only for contents; structure/question ignore it.\n\treturn {\n\t\taction,\n\t\trepoName: repoNames[0],\n\t\t...(action === \"contents\" && page !== undefined ? { page } : {}),\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,GAAG,EAAiC,MAAM,wBAAwB,CAAC;AACrH,OAAO,KAAK,EAAc,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEhF,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAYtF,OAAO,KAAK,EAAE,YAAY,EAA4B,QAAQ,EAAkC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,GAAG,EAAiC,MAAM,wBAAwB,CAAC;AACrH,OAAO,KAAK,EAAc,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEhF,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAYtF,OAAO,KAAK,EAAE,YAAY,EAA4B,QAAQ,EAAkC,MAAM,YAAY,CAAC;AA0DnH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,IACvE,KAAK,GAAG,EAAE,OAAO,KAAK,EAAE,aAAa,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI;aA4rBhF,OAAO;oBA/RJ,MAAM,KAAG,MAAM,EAAE;;wBALb,MAAM,KAAG,IAAI;;EAkTzC"}
|