one-code-extension 0.1.4 → 0.3.0
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/LICENSE +20 -0
- package/README.md +200 -172
- package/agents/explore.md +9 -6
- package/agents/general-purpose.md +1 -1
- package/agents/plan.md +6 -4
- package/docs/guide/README.md +52 -0
- package/docs/guide/bring-your-claude-code-setup.md +126 -0
- package/docs/guide/configuration.md +171 -0
- package/docs/guide/differences-from-claude-code.md +150 -0
- package/docs/guide/doctor.md +86 -0
- package/docs/guide/hooks.md +109 -0
- package/docs/guide/installation.md +124 -0
- package/docs/guide/permissions-modes-and-auto-mode.md +450 -0
- package/docs/guide/providers-and-models.md +194 -0
- package/docs/guide/reference.md +224 -0
- package/docs/guide/sessions-and-context.md +190 -0
- package/docs/guide/skills-plugins-and-mcp.md +176 -0
- package/docs/guide/subagents-and-workflows.md +193 -0
- package/docs/guide/tasks-and-background-work.md +111 -0
- package/docs/guide/terminal-interface.md +155 -0
- package/docs/guide/tools.md +175 -0
- package/docs/guide/troubleshooting.md +175 -0
- package/extensions/ask-user/index.ts +65 -71
- package/extensions/ask-user/questions.ts +15 -28
- package/extensions/ask-user/widget.ts +533 -0
- package/extensions/auto-mode/actions.ts +9 -26
- package/extensions/auto-mode/classifier-prompt.ts +127 -0
- package/extensions/auto-mode/classifier.ts +305 -227
- package/extensions/auto-mode/config.ts +279 -77
- package/extensions/auto-mode/defaults.ts +17 -60
- package/extensions/auto-mode/instructions.ts +2 -1
- package/extensions/auto-mode/model-picker.ts +53 -31
- package/extensions/auto-mode/model-select.ts +153 -82
- package/extensions/auto-mode/paths.ts +13 -1
- package/extensions/auto-mode/pause.ts +8 -0
- package/extensions/auto-mode/prompt.ts +205 -238
- package/extensions/auto-mode/recoverability.ts +229 -0
- package/extensions/auto-mode/rules.ts +92 -75
- package/extensions/auto-mode/safety-floor.ts +43 -12
- package/extensions/auto-mode/sensitive.ts +11 -0
- package/extensions/auto-mode/setup-run.ts +245 -0
- package/extensions/auto-mode/setup.ts +235 -0
- package/extensions/auto-mode/shell-analysis.ts +332 -26
- package/extensions/auto-mode/transcript.ts +102 -0
- package/extensions/background/index.ts +256 -43
- package/extensions/background/monitor-batch.ts +58 -0
- package/extensions/background/registry.ts +9 -0
- package/extensions/background/wakeup.ts +45 -0
- package/extensions/bash/background.ts +47 -22
- package/extensions/bash/guards.ts +229 -0
- package/extensions/bash/index.ts +81 -19
- package/extensions/branding/index.ts +44 -18
- package/extensions/branding/startup.ts +23 -8
- package/extensions/claude-compat/index.ts +17 -2
- package/extensions/claude-context/index.ts +41 -12
- package/extensions/clear/index.ts +27 -0
- package/extensions/compaction/fit.ts +121 -0
- package/extensions/compaction/index.ts +176 -71
- package/extensions/compaction/prompt.ts +21 -1
- package/extensions/context-budget/budget.ts +61 -0
- package/extensions/context-budget/index.ts +66 -0
- package/extensions/context-management/index.ts +40 -16
- package/extensions/doctor/build.ts +226 -0
- package/extensions/doctor/cli.ts +99 -0
- package/extensions/doctor/compat.ts +532 -0
- package/extensions/doctor/dependencies.ts +186 -0
- package/extensions/doctor/fix-prompt.ts +125 -0
- package/extensions/doctor/index.ts +308 -0
- package/extensions/doctor/models.ts +231 -0
- package/extensions/doctor/presets.ts +208 -0
- package/extensions/doctor/report.ts +189 -0
- package/extensions/doctor/update-lookup.ts +46 -0
- package/extensions/doctor/viewer.ts +124 -0
- package/extensions/effort/index.ts +41 -4
- package/extensions/effort/slider.ts +33 -2
- package/extensions/file-tracker/index.ts +143 -20
- package/extensions/file-tracker/replay.ts +46 -0
- package/extensions/file-tracker/tracker.ts +51 -4
- package/extensions/footer/footer-line.ts +207 -0
- package/extensions/footer/index.ts +152 -0
- package/extensions/footer/pr.ts +53 -0
- package/extensions/hooks/executor.ts +57 -20
- package/extensions/hooks/formatter-notice.ts +76 -0
- package/extensions/hooks/index.ts +314 -73
- package/extensions/hooks/matcher.ts +35 -1
- package/extensions/hooks/plugin-hooks.ts +3 -3
- package/extensions/hooks/protocol.ts +58 -0
- package/extensions/hooks/subagent-bridge.ts +77 -0
- package/extensions/hooks/trust.ts +15 -4
- package/extensions/init/index.ts +26 -0
- package/extensions/init/prompt.ts +40 -0
- package/extensions/interrupted/index.ts +35 -0
- package/extensions/interrupted/line.ts +9 -0
- package/extensions/lib/abort.ts +15 -0
- package/extensions/lib/agent-loader.ts +183 -0
- package/extensions/lib/anthropic-payload.ts +15 -0
- package/extensions/lib/atomic-write.ts +56 -0
- package/extensions/lib/bridge-watch.ts +20 -0
- package/extensions/lib/cache-retention.ts +60 -0
- package/extensions/lib/capability-index.ts +466 -0
- package/extensions/lib/claude-context.ts +318 -27
- package/extensions/lib/claude-settings.ts +64 -0
- package/extensions/lib/consent-preview.ts +30 -0
- package/extensions/lib/deferred.ts +144 -13
- package/extensions/lib/favorites.ts +43 -0
- package/extensions/lib/fetch-timeout.ts +15 -0
- package/extensions/lib/frontmatter.ts +31 -0
- package/extensions/lib/git.ts +44 -2
- package/extensions/lib/hook-gate.ts +90 -0
- package/extensions/lib/interrupt.ts +94 -0
- package/extensions/lib/mcp-overrides.ts +61 -0
- package/extensions/lib/mcp-share.ts +25 -0
- package/extensions/lib/mcp-status.ts +34 -0
- package/extensions/lib/memory.ts +41 -6
- package/extensions/lib/model-facts.generated.json +2480 -0
- package/extensions/lib/model-facts.ts +162 -0
- package/extensions/lib/model-policy.ts +145 -189
- package/extensions/lib/model-tier.ts +480 -64
- package/extensions/lib/model-unusable.ts +37 -0
- package/extensions/lib/notifications.ts +320 -1
- package/extensions/lib/one-code-settings.ts +63 -0
- package/extensions/lib/original-command.ts +71 -0
- package/extensions/lib/package-version.ts +31 -0
- package/extensions/lib/paths.ts +39 -4
- package/extensions/lib/permission-gate.ts +192 -0
- package/extensions/lib/persisted-output.ts +18 -0
- package/extensions/lib/pi-ai-estimate.ts +160 -0
- package/extensions/lib/pi-version.ts +1 -1
- package/extensions/lib/plan-mode-channels.ts +11 -0
- package/extensions/lib/plugin-overrides.ts +24 -0
- package/extensions/lib/plugin-root.ts +44 -0
- package/extensions/lib/plugins.ts +233 -54
- package/extensions/lib/prefix-warm-gate.ts +157 -0
- package/extensions/lib/process-tree.ts +56 -0
- package/extensions/lib/reminders.ts +321 -68
- package/extensions/lib/scratchpad.ts +11 -8
- package/extensions/lib/session-lifecycle.ts +28 -0
- package/extensions/lib/settings-channels.ts +14 -0
- package/extensions/lib/shell-tasks.ts +54 -0
- package/extensions/lib/skill-overrides.ts +86 -0
- package/extensions/lib/skill-scan.ts +110 -0
- package/extensions/lib/text-width.ts +267 -0
- package/extensions/lib/tui-render.ts +281 -54
- package/extensions/lib/usage-bus.ts +75 -0
- package/extensions/lib/usage-tracker.ts +67 -0
- package/extensions/lib/worktree-isolation.ts +170 -0
- package/extensions/lsp/client.ts +69 -12
- package/extensions/lsp/format.ts +12 -2
- package/extensions/lsp/index.ts +273 -84
- package/extensions/lsp/install-hints.ts +43 -0
- package/extensions/lsp/keep-alive.ts +19 -0
- package/extensions/lsp/plugin-servers.ts +331 -0
- package/extensions/lsp/watcher.ts +157 -0
- package/extensions/mcp/announce.ts +99 -0
- package/extensions/mcp/client.ts +181 -22
- package/extensions/mcp/config.ts +55 -24
- package/extensions/mcp/index.ts +586 -86
- package/extensions/mcp/oauth/browser.ts +26 -0
- package/extensions/mcp/oauth/callback.ts +104 -0
- package/extensions/mcp/oauth/flow.ts +68 -0
- package/extensions/mcp/oauth/provider.ts +147 -0
- package/extensions/mcp/oauth/store.ts +86 -0
- package/extensions/mcp/panel/keys.ts +34 -0
- package/extensions/mcp/panel/model.ts +62 -0
- package/extensions/mcp/panel/render.ts +141 -0
- package/extensions/mcp/panel/state.ts +108 -0
- package/extensions/mcp/schema.ts +83 -6
- package/extensions/mcp/trust.ts +340 -0
- package/extensions/memory/entries.ts +163 -0
- package/extensions/memory/index.ts +119 -2
- package/extensions/memory/open-external.ts +97 -0
- package/extensions/memory/panel.ts +124 -0
- package/extensions/model-default/index.ts +74 -0
- package/extensions/notebook/index.ts +36 -18
- package/extensions/notebook/notebook.ts +110 -17
- package/extensions/permissions/index.ts +1012 -247
- package/extensions/permissions/matcher.ts +488 -57
- package/extensions/permissions/modes.ts +55 -7
- package/extensions/permissions/project-trust.ts +81 -0
- package/extensions/permissions/protected-paths.ts +16 -3
- package/extensions/permissions/rule-prose.ts +79 -0
- package/extensions/permissions/session-grant.ts +91 -0
- package/extensions/permissions/settings.ts +112 -33
- package/extensions/permissions/subagent-gate.ts +57 -0
- package/extensions/plan-mode/index.ts +143 -33
- package/extensions/plan-mode/reminder.ts +16 -19
- package/extensions/plan-mode/viewer.ts +40 -31
- package/extensions/plugins/counts.ts +68 -0
- package/extensions/plugins/index.ts +496 -32
- package/extensions/plugins/install/install.ts +167 -0
- package/extensions/plugins/install/paths.ts +23 -0
- package/extensions/plugins/install/registry.ts +72 -0
- package/extensions/plugins/marketplace/git.ts +103 -0
- package/extensions/plugins/marketplace/official.ts +36 -0
- package/extensions/plugins/marketplace/parse.ts +94 -0
- package/extensions/plugins/marketplace/registry.ts +60 -0
- package/extensions/plugins/marketplace/sync.ts +146 -0
- package/extensions/plugins/marketplace/types.ts +128 -0
- package/extensions/plugins/panel/keys.ts +52 -0
- package/extensions/plugins/panel/render.ts +315 -0
- package/extensions/plugins/panel/rows.ts +230 -0
- package/extensions/plugins/panel/state.ts +333 -0
- package/extensions/recap/index.ts +215 -0
- package/extensions/recap/prompt.ts +44 -0
- package/extensions/recap/scheduler.ts +87 -0
- package/extensions/search-tools/index.ts +0 -0
- package/extensions/search-tools/tools.ts +7 -5
- package/extensions/skill/index.ts +360 -34
- package/extensions/skill/invoke.ts +185 -0
- package/extensions/skill/listing.ts +21 -0
- package/extensions/skill/panel/keys.ts +41 -0
- package/extensions/skill/panel/render.ts +91 -0
- package/extensions/skill/panel/state.ts +115 -0
- package/extensions/spinner/index.ts +110 -0
- package/extensions/spinner/line.ts +51 -0
- package/extensions/spinner/verbs.ts +201 -0
- package/extensions/subagents/agents.ts +88 -44
- package/extensions/subagents/default-model.ts +62 -32
- package/extensions/subagents/delegation-steer.ts +23 -0
- package/extensions/subagents/hand-back-review.ts +67 -0
- package/extensions/subagents/index.ts +1545 -346
- package/extensions/subagents/live-runs.ts +293 -0
- package/extensions/subagents/model-select.ts +252 -82
- package/extensions/subagents/outcome.ts +90 -0
- package/extensions/subagents/panel-keys.ts +41 -0
- package/extensions/subagents/panel-render.ts +357 -0
- package/extensions/subagents/panel-widget.ts +330 -0
- package/extensions/subagents/pending-claim.ts +45 -0
- package/extensions/subagents/prose.ts +105 -0
- package/extensions/subagents/runner.ts +674 -0
- package/extensions/subagents/runs.ts +68 -1
- package/extensions/subagents/send-to-main-tool.ts +55 -0
- package/extensions/subagents/session-turns.ts +138 -0
- package/extensions/subagents/shell-panel.ts +198 -0
- package/extensions/subagents/usage.ts +16 -4
- package/extensions/subagents/worktree.ts +13 -0
- package/extensions/system-prompt/environment.ts +5 -3
- package/extensions/system-prompt/git-status.ts +93 -0
- package/extensions/system-prompt/index.ts +23 -1
- package/extensions/system-prompt/template.ts +34 -4
- package/extensions/system-prompt/tiers/common.ts +31 -6
- package/extensions/system-prompt/tiers/low.ts +13 -3
- package/extensions/system-prompt/tiers/mid.ts +21 -8
- package/extensions/system-reminder/index.ts +53 -9
- package/extensions/tasks/index.ts +65 -16
- package/extensions/tasks/store.ts +76 -3
- package/extensions/tool-search/announce.ts +42 -0
- package/extensions/tool-search/index.ts +136 -13
- package/extensions/turn-duration/index.ts +60 -0
- package/extensions/turn-duration/line.ts +22 -0
- package/extensions/turn-duration/span.ts +41 -0
- package/extensions/turn-duration/verbs.ts +24 -0
- package/extensions/web/backends.ts +421 -0
- package/extensions/web/index.ts +178 -21
- package/extensions/web-fetch/index.ts +74 -18
- package/extensions/web-fetch/summarize.ts +1 -1
- package/extensions/workflow/agent-session.ts +182 -112
- package/extensions/workflow/globals.ts +129 -106
- package/extensions/workflow/index.ts +343 -28
- package/extensions/workflow/records.ts +118 -0
- package/extensions/workflow/run-manager.ts +80 -31
- package/extensions/workflow/saved-workflows.ts +2 -1
- package/extensions/workflow/script-worker.mjs +110 -0
- package/extensions/workflow/types.ts +74 -8
- package/extensions/workflow/viewer.ts +562 -0
- package/extensions/workflow/vm-runtime.ts +118 -22
- package/extensions/workflow/widget.ts +126 -18
- package/extensions/worktree/guards.ts +240 -0
- package/extensions/worktree/index.ts +30 -5
- package/extensions/worktree/rewrite.ts +32 -16
- package/package.json +20 -10
- package/skills/code-review/SKILL.md +165 -0
- package/skills/fewer-permission-prompts/SKILL.md +61 -0
- package/skills/security-review/SKILL.md +178 -0
- package/skills/simplify/SKILL.md +70 -0
- package/themes/{one-code-light.json → onecode-light.json} +6 -1
- package/themes/{one-code.json → onecode.json} +6 -1
- package/types/app.d.ts +8 -1
- package/types/community-packages.d.ts +45 -2
- package/docs/decisions/auto-mode.md +0 -526
- package/docs/decisions/branding.md +0 -127
- package/docs/decisions/code-review-remediation.md +0 -106
- package/docs/decisions/compaction.md +0 -140
- package/docs/decisions/distribution.md +0 -168
- package/docs/decisions/hooks.md +0 -64
- package/docs/decisions/lsp.md +0 -58
- package/docs/decisions/mcp.md +0 -104
- package/docs/decisions/memory-state.md +0 -170
- package/docs/decisions/model-policy.md +0 -126
- package/docs/decisions/modes.md +0 -178
- package/docs/decisions/skills-plugins.md +0 -56
- package/docs/decisions/subagents-workflows.md +0 -225
- package/docs/decisions/system-prompt.md +0 -98
- package/docs/decisions/tools.md +0 -407
- package/docs/decisions/tui.md +0 -217
- package/docs/decisions.md +0 -148
- package/extensions/subagents/child.ts +0 -414
- package/extensions/subagents/rpc-turns.ts +0 -123
- package/extensions/todo/index.ts +0 -133
- package/extensions/workflow/permission-gate.ts +0 -71
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The backstop for a fabricated agent result (pure).
|
|
3
|
+
*
|
|
4
|
+
* Putting Claude Code's prohibition in the Agent tool's RESULT rather than only
|
|
5
|
+
* in its description was the first fix for WEAK-MODEL-REVIEW-2026-09-06 H1, and
|
|
6
|
+
* measured live it was not enough: `openai-codex/gpt-5.6-luna` still ended a
|
|
7
|
+
* turn with the pending agent's answer in 3 of 6 `pending` runs, with the
|
|
8
|
+
* prohibition verifiably on the wire. The failure has a signature — the model
|
|
9
|
+
* writes "I'm waiting for the agent's result" and then states the result in the
|
|
10
|
+
* same message — and a shape the harness can see without reading the text at
|
|
11
|
+
* all: the agent loop ended while a run started inside it was still live.
|
|
12
|
+
*
|
|
13
|
+
* So the harness says so on the next request. This cannot un-print the sentence
|
|
14
|
+
* the user already saw; what it does is stop the model treating the real
|
|
15
|
+
* notification as confirmation of something it invented, which is how the
|
|
16
|
+
* fabrication survived into the final answer ("The agent confirmed the same
|
|
17
|
+
* result").
|
|
18
|
+
*
|
|
19
|
+
* Wording is deliberately CONDITIONAL. The trigger fires on correct behaviour
|
|
20
|
+
* too — a model that said only "I'm waiting for the agent" ends its turn the
|
|
21
|
+
* same way — so the text must not accuse. Measured precision on the six-run
|
|
22
|
+
* battery: 4 fires, 3 of them real fabrications.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
/** A live run the model started during the agent loop that just ended. */
|
|
26
|
+
export interface PendingRun {
|
|
27
|
+
name: string;
|
|
28
|
+
taskId: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The one-shot for a turn that ended with runs still pending, or undefined when
|
|
33
|
+
* there is nothing to say. Named runs, so a model with several in flight knows
|
|
34
|
+
* which ones it cannot have heard from.
|
|
35
|
+
*/
|
|
36
|
+
export function pendingClaimReminder(runs: readonly PendingRun[]): string | undefined {
|
|
37
|
+
if (runs.length === 0) return undefined;
|
|
38
|
+
const named = runs.map((run) => `${run.name} (task ${run.taskId})`).join(", ");
|
|
39
|
+
const subject = runs.length === 1 ? "It has" : "They have";
|
|
40
|
+
return (
|
|
41
|
+
`You ended that turn while ${named} ${runs.length === 1 ? "was" : "were"} still running. ${subject} not reported yet, ` +
|
|
42
|
+
"so anything you stated about the result did not come from the agent — if you gave the user a result, say plainly in your next message that it was not the agent's and correct it. " +
|
|
43
|
+
"Wait for the notification, or call task_output with block=true."
|
|
44
|
+
);
|
|
45
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown prose for the subagent transcript viewer: the child's assistant
|
|
3
|
+
* text renders through pi-tui's real `Markdown` component — the exact renderer
|
|
4
|
+
* the main transcript uses — so the panel matches the main session's text
|
|
5
|
+
* fidelity (headings, code highlighting, lists) instead of plain wrapped text.
|
|
6
|
+
*
|
|
7
|
+
* pi-tui is pi's own nested dependency (not hoisted, not ours to pin), and it
|
|
8
|
+
* cannot be require.resolve'd: pi-coding-agent's exports map defines only the
|
|
9
|
+
* "import" condition (createRequire fails with `No "exports" main defined`)
|
|
10
|
+
* and exposes no "./package.json" subpath. So the package is located by
|
|
11
|
+
* walking the same node_modules candidates Node itself would try — nested
|
|
12
|
+
* under pi-coding-agent first (npm's layout here), then hoisted as a sibling —
|
|
13
|
+
* and its entry file is imported by URL. Resolving relative to THIS file gives
|
|
14
|
+
* the same pi-coding-agent instance the rest of the package's imports bind to.
|
|
15
|
+
*
|
|
16
|
+
* `Markdown` memoizes render by (text, width); instances are cached per
|
|
17
|
+
* transcript block (immutable text → WeakMap, GC'd with the block) and per
|
|
18
|
+
* streaming slot (mutable text → keyed Map + setText, guarded so an unchanged
|
|
19
|
+
* text never invalidates the cache). The markdown theme comes from
|
|
20
|
+
* pi-coding-agent's `getMarkdownTheme()`, which reads the theme pi initialized
|
|
21
|
+
* at startup.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
25
|
+
import { createRequire } from "node:module";
|
|
26
|
+
import { join } from "node:path";
|
|
27
|
+
import { pathToFileURL } from "node:url";
|
|
28
|
+
import { getMarkdownTheme } from "@earendil-works/pi-coding-agent";
|
|
29
|
+
import type { ProseRenderer } from "./panel-render.ts";
|
|
30
|
+
|
|
31
|
+
interface MarkdownLike {
|
|
32
|
+
setText(text: string): void;
|
|
33
|
+
render(width: number): string[];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
type MarkdownCtor = new (text: string, paddingX: number, paddingY: number, theme: unknown) => MarkdownLike;
|
|
37
|
+
|
|
38
|
+
/** The pi-tui entry file, found by walking node_modules (see module doc). Exported for tests. */
|
|
39
|
+
export function resolvePiTuiEntry(): string {
|
|
40
|
+
const req = createRequire(import.meta.url);
|
|
41
|
+
const bases = req.resolve.paths("@earendil-works/pi-coding-agent") ?? [];
|
|
42
|
+
for (const base of bases) {
|
|
43
|
+
const agentDir = join(base, "@earendil-works", "pi-coding-agent");
|
|
44
|
+
if (!existsSync(join(agentDir, "package.json"))) continue;
|
|
45
|
+
for (const candidate of [
|
|
46
|
+
join(agentDir, "node_modules", "@earendil-works", "pi-tui"),
|
|
47
|
+
join(base, "@earendil-works", "pi-tui"),
|
|
48
|
+
]) {
|
|
49
|
+
const pkgPath = join(candidate, "package.json");
|
|
50
|
+
if (!existsSync(pkgPath)) continue;
|
|
51
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf8")) as {
|
|
52
|
+
exports?: Record<string, string | { import?: string; default?: string }>;
|
|
53
|
+
module?: string;
|
|
54
|
+
main?: string;
|
|
55
|
+
};
|
|
56
|
+
const dot = pkg.exports?.["."];
|
|
57
|
+
const entry = (typeof dot === "string" ? dot : (dot?.import ?? dot?.default)) ?? pkg.module ?? pkg.main ?? "index.js";
|
|
58
|
+
return join(candidate, entry);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
throw new Error("cannot locate @earendil-works/pi-tui next to pi-coding-agent");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let ctorPromise: Promise<MarkdownCtor> | undefined;
|
|
65
|
+
|
|
66
|
+
async function loadMarkdownCtor(): Promise<MarkdownCtor> {
|
|
67
|
+
return (ctorPromise ??= (async () => {
|
|
68
|
+
const mod = (await import(pathToFileURL(resolvePiTuiEntry()).href)) as { Markdown?: MarkdownCtor };
|
|
69
|
+
if (typeof mod.Markdown !== "function") throw new Error("pi-tui exports no Markdown component");
|
|
70
|
+
return mod.Markdown;
|
|
71
|
+
})().catch((error) => {
|
|
72
|
+
ctorPromise = undefined; // a transient failure may recover on retry
|
|
73
|
+
throw error;
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Build the markdown ProseRenderer. Throws when pi-tui cannot be resolved —
|
|
79
|
+
* the caller falls back to plain wrapped text and tells the user once.
|
|
80
|
+
*/
|
|
81
|
+
export async function createMarkdownProse(): Promise<ProseRenderer> {
|
|
82
|
+
const Markdown = await loadMarkdownCtor();
|
|
83
|
+
const theme = getMarkdownTheme();
|
|
84
|
+
const blockCache = new WeakMap<object, MarkdownLike>();
|
|
85
|
+
const streamCache = new Map<string, { md: MarkdownLike; text: string }>();
|
|
86
|
+
return (ref, text, width) => {
|
|
87
|
+
if (typeof ref === "string") {
|
|
88
|
+
let slot = streamCache.get(ref);
|
|
89
|
+
if (!slot) {
|
|
90
|
+
slot = { md: new Markdown(text, 0, 0, theme), text };
|
|
91
|
+
streamCache.set(ref, slot);
|
|
92
|
+
} else if (slot.text !== text) {
|
|
93
|
+
slot.md.setText(text);
|
|
94
|
+
slot.text = text;
|
|
95
|
+
}
|
|
96
|
+
return slot.md.render(width);
|
|
97
|
+
}
|
|
98
|
+
let md = blockCache.get(ref);
|
|
99
|
+
if (!md) {
|
|
100
|
+
md = new Markdown(text, 0, 0, theme);
|
|
101
|
+
blockCache.set(ref, md);
|
|
102
|
+
}
|
|
103
|
+
return md.render(width);
|
|
104
|
+
};
|
|
105
|
+
}
|