@opengsd/gsd-pi 1.1.1-dev.74e8dd1 → 1.1.1-dev.9bb7453
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/dist/cli.js +3 -2
- package/dist/help-text.js +10 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +495 -0
- package/dist/resources/extensions/browser-tools/engine/selection.js +16 -0
- package/dist/resources/extensions/browser-tools/extension-manifest.json +2 -2
- package/dist/resources/extensions/browser-tools/index.js +57 -9
- package/dist/resources/extensions/browser-tools/package.json +5 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +0 -1
- package/dist/resources/extensions/gsd/auto-dashboard.js +77 -13
- package/dist/resources/extensions/gsd/auto-dispatch.js +5 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +21 -3
- package/dist/resources/extensions/gsd/auto-prompts.js +59 -22
- package/dist/resources/extensions/gsd/auto-runtime-state.js +3 -0
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +9 -2
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +4 -4
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +9 -5
- package/dist/resources/extensions/gsd/browser-evidence.js +29 -2
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +76 -11
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -1
- package/dist/resources/extensions/gsd/dashboard-overlay.js +21 -7
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +2 -2
- package/dist/resources/extensions/gsd/escalation.js +4 -4
- package/dist/resources/extensions/gsd/forensics.js +74 -2
- package/dist/resources/extensions/gsd/gsd-db.js +5 -2
- package/dist/resources/extensions/gsd/guided-flow.js +29 -68
- package/dist/resources/extensions/gsd/mcp-project-config.js +9 -76
- package/dist/resources/extensions/gsd/memory-store.js +4 -1
- package/dist/resources/extensions/gsd/post-unit-hooks.js +9 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +39 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +7 -0
- package/dist/resources/extensions/gsd/prompts/forensics.md +61 -1
- package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +40 -22
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
- package/dist/resources/extensions/gsd/rule-registry.js +428 -52
- package/dist/resources/extensions/gsd/state.js +2 -2
- package/dist/resources/extensions/gsd/templates/plan.md +3 -1
- package/dist/resources/extensions/gsd/tools/complete-slice.js +15 -1
- package/dist/resources/extensions/gsd/tools/complete-task.js +11 -1
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +46 -16
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +51 -14
- package/dist/resources/extensions/gsd/verdict-parser.js +59 -15
- package/dist/resources/extensions/gsd/verification-gate.js +72 -1
- package/dist/resources/extensions/shared/gsd-browser-cli.js +145 -0
- package/dist/rtk.d.ts +7 -1
- package/dist/rtk.js +27 -11
- package/dist/update-check.d.ts +15 -1
- package/dist/update-check.js +87 -12
- package/dist/update-cmd.d.ts +1 -0
- package/dist/update-cmd.js +53 -2
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/package.json +4 -2
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/agent-session.d.ts +9 -0
- package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/agent-session.js +32 -0
- package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
- package/packages/gsd-agent-core/dist/index.d.ts +1 -0
- package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/index.js +1 -0
- package/packages/gsd-agent-core/dist/index.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.js +8 -2
- package/packages/gsd-agent-core/dist/session/agent-session-compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +7 -0
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +69 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
- package/packages/gsd-agent-core/dist/turn-latency.d.ts +47 -0
- package/packages/gsd-agent-core/dist/turn-latency.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/turn-latency.js +123 -0
- package/packages/gsd-agent-core/dist/turn-latency.js.map +1 -0
- package/packages/gsd-agent-core/package.json +6 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +21 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +213 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +20 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +7 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -1
- package/packages/mcp-server/dist/remote-questions.js +23 -9
- package/packages/mcp-server/dist/remote-questions.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +2 -2
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +38 -0
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -1
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/types.d.ts +3 -0
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/api-registry.d.ts +2 -0
- package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
- package/packages/pi-ai/dist/api-registry.js +23 -0
- package/packages/pi-ai/dist/api-registry.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +68 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +72 -4
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/stream.js +6 -6
- package/packages/pi-ai/dist/stream.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +579 -0
- package/src/resources/extensions/browser-tools/engine/selection.ts +19 -0
- package/src/resources/extensions/browser-tools/extension-manifest.json +2 -2
- package/src/resources/extensions/browser-tools/index.ts +60 -9
- package/src/resources/extensions/browser-tools/package.json +5 -1
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +35 -0
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +33 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +0 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +82 -14
- package/src/resources/extensions/gsd/auto-dispatch.ts +5 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +28 -2
- package/src/resources/extensions/gsd/auto-prompts.ts +93 -15
- package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -0
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +12 -2
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +4 -4
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +9 -5
- package/src/resources/extensions/gsd/browser-evidence.ts +26 -2
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +2 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +76 -11
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -1
- package/src/resources/extensions/gsd/dashboard-overlay.ts +28 -7
- package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +2 -2
- package/src/resources/extensions/gsd/escalation.ts +4 -4
- package/src/resources/extensions/gsd/forensics.ts +99 -5
- package/src/resources/extensions/gsd/gsd-db.ts +5 -2
- package/src/resources/extensions/gsd/guided-flow.ts +90 -82
- package/src/resources/extensions/gsd/mcp-project-config.ts +13 -78
- package/src/resources/extensions/gsd/memory-store.ts +4 -1
- package/src/resources/extensions/gsd/post-unit-hooks.ts +14 -1
- package/src/resources/extensions/gsd/preferences-validation.ts +36 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +8 -0
- package/src/resources/extensions/gsd/prompts/forensics.md +61 -1
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +40 -22
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
- package/src/resources/extensions/gsd/rule-registry.ts +558 -58
- package/src/resources/extensions/gsd/rule-types.ts +2 -0
- package/src/resources/extensions/gsd/state.ts +2 -2
- package/src/resources/extensions/gsd/templates/plan.md +3 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +105 -4
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/browser-evidence.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/doctor-runtime-checks.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/escalation.test.ts +16 -27
- package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/forensics-tool-scope.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/guided-flow.test.ts +12 -9
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +66 -10
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +39 -8
- package/src/resources/extensions/gsd/tests/new-milestone-discuss-routing.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +130 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +14 -1
- package/src/resources/extensions/gsd/tools/complete-task.ts +20 -2
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +46 -15
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +63 -15
- package/src/resources/extensions/gsd/types.ts +69 -5
- package/src/resources/extensions/gsd/verdict-parser.ts +54 -13
- package/src/resources/extensions/gsd/verification-gate.ts +87 -1
- package/src/resources/extensions/shared/gsd-browser-cli.ts +172 -0
- /package/dist/web/standalone/.next/static/{eRWf-RI9bzbrwEurm_3uI → jBtwT9v1u2lUA3UEOy_ZH}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{eRWf-RI9bzbrwEurm_3uI → jBtwT9v1u2lUA3UEOy_ZH}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
// PROTOTYPE - throwaway /gsd auto progress widget layout options.
|
|
2
|
+
// Question: can the widget stay small while using terminal width horizontally?
|
|
3
|
+
// Run: pnpm run prototype:tui-widget [-- current-small|horizontal-bar|split-ribbon|dense-grid|all]
|
|
4
|
+
import { alignRight, padRight, truncateToWidth, visibleWidth } from "@gsd/pi-tui";
|
|
5
|
+
import { theme } from "@gsd/pi-coding-agent/theme/theme.js";
|
|
6
|
+
const SAMPLE = {
|
|
7
|
+
mode: "AUTO",
|
|
8
|
+
state: "running",
|
|
9
|
+
health: "green",
|
|
10
|
+
elapsed: "1h 42m",
|
|
11
|
+
eta: "18m left",
|
|
12
|
+
phase: "execute-task",
|
|
13
|
+
verb: "Execute",
|
|
14
|
+
milestone: "M004",
|
|
15
|
+
slice: "S02",
|
|
16
|
+
unit: "T03",
|
|
17
|
+
title: "Compare horizontal dashboard density",
|
|
18
|
+
slicesDone: 2,
|
|
19
|
+
slicesTotal: 5,
|
|
20
|
+
tasksDone: 2,
|
|
21
|
+
tasksTotal: 4,
|
|
22
|
+
tokens: "182k",
|
|
23
|
+
cost: "$1.83",
|
|
24
|
+
};
|
|
25
|
+
const RECOMMENDED_WIDGET_PROTOTYPE_ID = "dense-grid";
|
|
26
|
+
export { RECOMMENDED_WIDGET_PROTOTYPE_ID };
|
|
27
|
+
function lineStats(lines) {
|
|
28
|
+
const total = lines.length;
|
|
29
|
+
const blank = lines.filter((line) => line.trim().length === 0).length;
|
|
30
|
+
return { total, blank, nonBlank: total - blank };
|
|
31
|
+
}
|
|
32
|
+
export { lineStats };
|
|
33
|
+
function padLine(line, width) {
|
|
34
|
+
return padRight(truncateToWidth(line, width, ""), width);
|
|
35
|
+
}
|
|
36
|
+
function rule(width, color = "borderMuted") {
|
|
37
|
+
return theme.fg(color, "─".repeat(Math.max(1, width)));
|
|
38
|
+
}
|
|
39
|
+
function dim(text) {
|
|
40
|
+
return theme.fg("dim", text);
|
|
41
|
+
}
|
|
42
|
+
function accent(text) {
|
|
43
|
+
return theme.fg("accent", text);
|
|
44
|
+
}
|
|
45
|
+
function success(text) {
|
|
46
|
+
return theme.fg("success", text);
|
|
47
|
+
}
|
|
48
|
+
function text(textValue) {
|
|
49
|
+
return theme.fg("text", textValue);
|
|
50
|
+
}
|
|
51
|
+
function label(textValue, color = "borderAccent") {
|
|
52
|
+
return theme.fg(color, theme.bold(textValue.toUpperCase()));
|
|
53
|
+
}
|
|
54
|
+
function progressBar(width) {
|
|
55
|
+
const done = SAMPLE.slicesDone;
|
|
56
|
+
const total = SAMPLE.slicesTotal;
|
|
57
|
+
const filled = Math.max(0, Math.min(width, Math.round((done / total) * width)));
|
|
58
|
+
return `${success("█".repeat(filled))}${dim("░".repeat(Math.max(0, width - filled)))}`;
|
|
59
|
+
}
|
|
60
|
+
function metric(name, value, width) {
|
|
61
|
+
const raw = `${dim(name)} ${text(value)}`;
|
|
62
|
+
return truncateToWidth(raw, width, "…");
|
|
63
|
+
}
|
|
64
|
+
function column(content, width) {
|
|
65
|
+
return padRight(truncateToWidth(content, width, "…"), width);
|
|
66
|
+
}
|
|
67
|
+
function fitColumns(width, parts) {
|
|
68
|
+
if (parts.length === 0)
|
|
69
|
+
return "";
|
|
70
|
+
const gap = dim(" │ ");
|
|
71
|
+
const gapWidth = visibleWidth(gap) * (parts.length - 1);
|
|
72
|
+
const available = Math.max(parts.length * 8, width - gapWidth);
|
|
73
|
+
const base = Math.floor(available / parts.length);
|
|
74
|
+
let remaining = available - base * parts.length;
|
|
75
|
+
const cols = parts.map((part) => {
|
|
76
|
+
const w = base + (remaining > 0 ? 1 : 0);
|
|
77
|
+
remaining--;
|
|
78
|
+
return column(part, w);
|
|
79
|
+
});
|
|
80
|
+
return truncateToWidth(cols.join(gap), width, "…");
|
|
81
|
+
}
|
|
82
|
+
function stateLine(id, width, renderedLineCount) {
|
|
83
|
+
const state = [
|
|
84
|
+
`variant=${id}`,
|
|
85
|
+
"mode=small-prototype",
|
|
86
|
+
`width=${width}`,
|
|
87
|
+
`lines=${renderedLineCount}`,
|
|
88
|
+
`unit=${SAMPLE.milestone}/${SAMPLE.slice}/${SAMPLE.unit}`,
|
|
89
|
+
];
|
|
90
|
+
return padLine(dim(`STATE ${state.join(" ")}`), width);
|
|
91
|
+
}
|
|
92
|
+
function actionTarget(maxWidth) {
|
|
93
|
+
return truncateToWidth(`${SAMPLE.unit}: ${SAMPLE.title}`, Math.max(8, maxWidth), "…");
|
|
94
|
+
}
|
|
95
|
+
function renderCurrentSmall(width) {
|
|
96
|
+
const pad = " ";
|
|
97
|
+
const lines = [];
|
|
98
|
+
lines.push(rule(width));
|
|
99
|
+
lines.push(alignRight(`${pad}${accent("◒")} ${accent(theme.bold("GSD"))} ${success(SAMPLE.mode)} ${success(SAMPLE.state)}`, dim(`${SAMPLE.elapsed} · ${SAMPLE.eta}`), width));
|
|
100
|
+
lines.push("");
|
|
101
|
+
lines.push(alignRight(`${pad}${accent("▸")} ${accent(SAMPLE.verb)} ${text(actionTarget(Math.floor(width * 0.58)))}`, dim(SAMPLE.phase), width));
|
|
102
|
+
const barWidth = Math.max(6, Math.min(18, Math.floor(width * 0.25)));
|
|
103
|
+
lines.push(`${pad}${progressBar(barWidth)} ${text(`${SAMPLE.slicesDone}`)}${dim(`/${SAMPLE.slicesTotal} slices · task `)}${accent(String(SAMPLE.tasksDone + 1))}${dim(`/${SAMPLE.tasksTotal}`)}`);
|
|
104
|
+
lines.push(rule(width));
|
|
105
|
+
lines.push(stateLine("current-small", width, lines.length + 1));
|
|
106
|
+
return lines.map((line) => padLine(line, width));
|
|
107
|
+
}
|
|
108
|
+
function renderHorizontalBar(width) {
|
|
109
|
+
const lines = [];
|
|
110
|
+
const left = `${accent("◒ GSD")} ${success(SAMPLE.mode)} ${dim("·")} ${success(SAMPLE.state)} ${dim("·")} ${text(`${SAMPLE.verb} ${actionTarget(Math.floor(width * 0.45))}`)}`;
|
|
111
|
+
const right = dim(`${SAMPLE.phase} · ${SAMPLE.elapsed} · ${SAMPLE.eta}`);
|
|
112
|
+
lines.push(rule(width, "borderAccent"));
|
|
113
|
+
lines.push(alignRight(left, right, width));
|
|
114
|
+
const barWidth = Math.max(8, Math.min(16, Math.floor(width * 0.14)));
|
|
115
|
+
const progressLeft = `${progressBar(barWidth)} ${text(`${SAMPLE.slicesDone}/${SAMPLE.slicesTotal}`)}${dim(" slices")} ${dim("· task ")}${accent(String(SAMPLE.tasksDone + 1))}${dim(`/${SAMPLE.tasksTotal}`)}`;
|
|
116
|
+
const rightBudget = Math.max(20, width - visibleWidth(progressLeft) - 4);
|
|
117
|
+
const progressRight = truncateToWidth(`${metric("tokens", SAMPLE.tokens, 18)} ${dim("·")} ${metric("cost", SAMPLE.cost, 12)}`, rightBudget, "…");
|
|
118
|
+
lines.push(alignRight(progressLeft, progressRight, width));
|
|
119
|
+
lines.push(rule(width, "borderAccent"));
|
|
120
|
+
lines.push(stateLine("horizontal-bar", width, lines.length + 1));
|
|
121
|
+
return lines.map((line) => padLine(line, width));
|
|
122
|
+
}
|
|
123
|
+
function renderSplitRibbon(width) {
|
|
124
|
+
const lines = [];
|
|
125
|
+
const title = `${accent("GSD")} ${success(SAMPLE.mode)} ${dim("·")} ${SAMPLE.milestone}/${SAMPLE.slice}/${SAMPLE.unit}`;
|
|
126
|
+
const time = dim(`${SAMPLE.elapsed} · ${SAMPLE.eta}`);
|
|
127
|
+
lines.push(rule(width));
|
|
128
|
+
lines.push(alignRight(title, time, width));
|
|
129
|
+
const actionWidth = Math.max(18, Math.floor(width * 0.42));
|
|
130
|
+
const phaseWidth = Math.max(14, Math.floor(width * 0.18));
|
|
131
|
+
const progressWidth = Math.max(22, Math.floor(width * 0.22));
|
|
132
|
+
const action = `${label("work")} ${text(actionTarget(actionWidth))}`;
|
|
133
|
+
const phase = `${label("phase", "border")} ${dim(SAMPLE.phase)}`;
|
|
134
|
+
const progress = `${label("progress")} ${progressBar(Math.max(8, progressWidth - 18))} ${text(`${SAMPLE.slicesDone}/${SAMPLE.slicesTotal}`)}`;
|
|
135
|
+
const run = `${label("run", "border")} ${dim(`${SAMPLE.tokens} · ${SAMPLE.cost}`)}`;
|
|
136
|
+
lines.push(fitColumns(width, [action, phase, progress, run]));
|
|
137
|
+
lines.push(rule(width));
|
|
138
|
+
lines.push(stateLine("split-ribbon", width, lines.length + 1));
|
|
139
|
+
return lines.map((line) => padLine(line, width));
|
|
140
|
+
}
|
|
141
|
+
function renderDenseGrid(width) {
|
|
142
|
+
const lines = [];
|
|
143
|
+
const rowOne = fitColumns(width, [
|
|
144
|
+
`${label("status", "border")} ${success(`${SAMPLE.mode} ${SAMPLE.state}`)}`,
|
|
145
|
+
`${label("unit")} ${text(`${SAMPLE.milestone}/${SAMPLE.slice}/${SAMPLE.unit}`)}`,
|
|
146
|
+
`${label("spend", "border")} ${dim(`${SAMPLE.tokens} · ${SAMPLE.cost}`)}`,
|
|
147
|
+
`${label("time")} ${dim(`${SAMPLE.elapsed} · ${SAMPLE.eta}`)}`,
|
|
148
|
+
]);
|
|
149
|
+
const rowTwo = fitColumns(width, [
|
|
150
|
+
`${label("phase", "border")} ${dim(SAMPLE.phase)}`,
|
|
151
|
+
`${label("work")} ${text(actionTarget(Math.floor(width * 0.28)))}`,
|
|
152
|
+
`${label("task", "border")} ${accent(String(SAMPLE.tasksDone + 1))}${dim(`/${SAMPLE.tasksTotal}`)}`,
|
|
153
|
+
`${label("slice")} ${progressBar(Math.max(8, Math.min(16, Math.floor(width * 0.16))))} ${text(`${SAMPLE.slicesDone}/${SAMPLE.slicesTotal}`)}`,
|
|
154
|
+
]);
|
|
155
|
+
lines.push(rule(width, "borderAccent"));
|
|
156
|
+
lines.push(rowOne);
|
|
157
|
+
lines.push(rowTwo);
|
|
158
|
+
lines.push(rule(width, "borderAccent"));
|
|
159
|
+
lines.push(stateLine("dense-grid", width, lines.length + 1));
|
|
160
|
+
return lines.map((line) => padLine(line, width));
|
|
161
|
+
}
|
|
162
|
+
export const WIDGET_PROTOTYPES = [
|
|
163
|
+
{
|
|
164
|
+
id: "current-small",
|
|
165
|
+
label: "A · Current small",
|
|
166
|
+
tagline: "Baseline: existing small mode shape, vertical action/progress stack",
|
|
167
|
+
render: renderCurrentSmall,
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
id: "horizontal-bar",
|
|
171
|
+
label: "B · Horizontal bar",
|
|
172
|
+
tagline: "3-line widget, action + status use the full terminal width",
|
|
173
|
+
render: renderHorizontalBar,
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
id: "split-ribbon",
|
|
177
|
+
label: "C · Split ribbon",
|
|
178
|
+
tagline: "Four labeled columns without duplicating footer commands",
|
|
179
|
+
render: renderSplitRibbon,
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
id: "dense-grid",
|
|
183
|
+
label: "D · Dense grid",
|
|
184
|
+
tagline: "Selected: two metric rows, maximum scan data without growing height",
|
|
185
|
+
render: renderDenseGrid,
|
|
186
|
+
},
|
|
187
|
+
];
|
|
188
|
+
export function getWidgetPrototype(id) {
|
|
189
|
+
const found = WIDGET_PROTOTYPES.find((prototype) => prototype.id === id);
|
|
190
|
+
if (!found) {
|
|
191
|
+
throw new Error(`Unknown widget prototype: ${id}. Options: ${WIDGET_PROTOTYPES.map((p) => p.id).join(", ")}`);
|
|
192
|
+
}
|
|
193
|
+
return found;
|
|
194
|
+
}
|
|
195
|
+
export function resolveWidgetPrototypeSet(arg) {
|
|
196
|
+
if (arg === "all")
|
|
197
|
+
return WIDGET_PROTOTYPES;
|
|
198
|
+
if (arg === "recommended")
|
|
199
|
+
return [getWidgetPrototype(RECOMMENDED_WIDGET_PROTOTYPE_ID)];
|
|
200
|
+
return [getWidgetPrototype(arg)];
|
|
201
|
+
}
|
|
202
|
+
export function listWidgetPrototypeIds() {
|
|
203
|
+
return WIDGET_PROTOTYPES.map((prototype) => prototype.id);
|
|
204
|
+
}
|
|
205
|
+
export function renderWidgetPrototypeBanner(prototype, width) {
|
|
206
|
+
const labelText = `${prototype.label} ${prototype.id === RECOMMENDED_WIDGET_PROTOTYPE_ID ? "★ " : ""}${prototype.tagline}`;
|
|
207
|
+
return [
|
|
208
|
+
rule(width, prototype.id === RECOMMENDED_WIDGET_PROTOTYPE_ID ? "borderAccent" : "borderMuted"),
|
|
209
|
+
padLine(labelText, width),
|
|
210
|
+
rule(width, prototype.id === RECOMMENDED_WIDGET_PROTOTYPE_ID ? "borderAccent" : "borderMuted"),
|
|
211
|
+
];
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=gsd-widget-prototype.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gsd-widget-prototype.js","sourceRoot":"","sources":["../../../../../src/modes/interactive/components/__prototype__/gsd-widget-prototype.ts"],"names":[],"mappings":"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","sourcesContent":["// PROTOTYPE - throwaway /gsd auto progress widget layout options.\n// Question: can the widget stay small while using terminal width horizontally?\n// Run: pnpm run prototype:tui-widget [-- current-small|horizontal-bar|split-ribbon|dense-grid|all]\n\nimport { alignRight, padRight, truncateToWidth, visibleWidth } from \"@gsd/pi-tui\";\nimport { theme, type ThemeColor } from \"@gsd/pi-coding-agent/theme/theme.js\";\n\nexport type WidgetPrototypeId = \"current-small\" | \"horizontal-bar\" | \"split-ribbon\" | \"dense-grid\";\n\nexport interface WidgetPrototype {\n\tid: WidgetPrototypeId;\n\tlabel: string;\n\ttagline: string;\n\trender: (width: number) => string[];\n}\n\nconst SAMPLE = {\n\tmode: \"AUTO\",\n\tstate: \"running\",\n\thealth: \"green\",\n\telapsed: \"1h 42m\",\n\teta: \"18m left\",\n\tphase: \"execute-task\",\n\tverb: \"Execute\",\n\tmilestone: \"M004\",\n\tslice: \"S02\",\n\tunit: \"T03\",\n\ttitle: \"Compare horizontal dashboard density\",\n\tslicesDone: 2,\n\tslicesTotal: 5,\n\ttasksDone: 2,\n\ttasksTotal: 4,\n\ttokens: \"182k\",\n\tcost: \"$1.83\",\n};\n\nconst RECOMMENDED_WIDGET_PROTOTYPE_ID: WidgetPrototypeId = \"dense-grid\";\nexport { RECOMMENDED_WIDGET_PROTOTYPE_ID };\n\nfunction lineStats(lines: string[]): { total: number; blank: number; nonBlank: number } {\n\tconst total = lines.length;\n\tconst blank = lines.filter((line) => line.trim().length === 0).length;\n\treturn { total, blank, nonBlank: total - blank };\n}\n\nexport { lineStats };\n\nfunction padLine(line: string, width: number): string {\n\treturn padRight(truncateToWidth(line, width, \"\"), width);\n}\n\nfunction rule(width: number, color: ThemeColor = \"borderMuted\"): string {\n\treturn theme.fg(color, \"─\".repeat(Math.max(1, width)));\n}\n\nfunction dim(text: string): string {\n\treturn theme.fg(\"dim\", text);\n}\n\nfunction accent(text: string): string {\n\treturn theme.fg(\"accent\", text);\n}\n\nfunction success(text: string): string {\n\treturn theme.fg(\"success\", text);\n}\n\nfunction text(textValue: string): string {\n\treturn theme.fg(\"text\", textValue);\n}\n\nfunction label(textValue: string, color: ThemeColor = \"borderAccent\"): string {\n\treturn theme.fg(color, theme.bold(textValue.toUpperCase()));\n}\n\nfunction progressBar(width: number): string {\n\tconst done = SAMPLE.slicesDone;\n\tconst total = SAMPLE.slicesTotal;\n\tconst filled = Math.max(0, Math.min(width, Math.round((done / total) * width)));\n\treturn `${success(\"█\".repeat(filled))}${dim(\"░\".repeat(Math.max(0, width - filled)))}`;\n}\n\nfunction metric(name: string, value: string, width: number): string {\n\tconst raw = `${dim(name)} ${text(value)}`;\n\treturn truncateToWidth(raw, width, \"…\");\n}\n\nfunction column(content: string, width: number): string {\n\treturn padRight(truncateToWidth(content, width, \"…\"), width);\n}\n\nfunction fitColumns(width: number, parts: string[]): string {\n\tif (parts.length === 0) return \"\";\n\tconst gap = dim(\" │ \");\n\tconst gapWidth = visibleWidth(gap) * (parts.length - 1);\n\tconst available = Math.max(parts.length * 8, width - gapWidth);\n\tconst base = Math.floor(available / parts.length);\n\tlet remaining = available - base * parts.length;\n\tconst cols = parts.map((part) => {\n\t\tconst w = base + (remaining > 0 ? 1 : 0);\n\t\tremaining--;\n\t\treturn column(part, w);\n\t});\n\treturn truncateToWidth(cols.join(gap), width, \"…\");\n}\n\nfunction stateLine(id: WidgetPrototypeId, width: number, renderedLineCount: number): string {\n\tconst state = [\n\t\t`variant=${id}`,\n\t\t\"mode=small-prototype\",\n\t\t`width=${width}`,\n\t\t`lines=${renderedLineCount}`,\n\t\t`unit=${SAMPLE.milestone}/${SAMPLE.slice}/${SAMPLE.unit}`,\n\t];\n\treturn padLine(dim(`STATE ${state.join(\" \")}`), width);\n}\n\nfunction actionTarget(maxWidth: number): string {\n\treturn truncateToWidth(`${SAMPLE.unit}: ${SAMPLE.title}`, Math.max(8, maxWidth), \"…\");\n}\n\nfunction renderCurrentSmall(width: number): string[] {\n\tconst pad = \" \";\n\tconst lines: string[] = [];\n\tlines.push(rule(width));\n\tlines.push(alignRight(\n\t\t`${pad}${accent(\"◒\")} ${accent(theme.bold(\"GSD\"))} ${success(SAMPLE.mode)} ${success(SAMPLE.state)}`,\n\t\tdim(`${SAMPLE.elapsed} · ${SAMPLE.eta}`),\n\t\twidth,\n\t));\n\tlines.push(\"\");\n\tlines.push(alignRight(\n\t\t`${pad}${accent(\"▸\")} ${accent(SAMPLE.verb)} ${text(actionTarget(Math.floor(width * 0.58)))}`,\n\t\tdim(SAMPLE.phase),\n\t\twidth,\n\t));\n\tconst barWidth = Math.max(6, Math.min(18, Math.floor(width * 0.25)));\n\tlines.push(`${pad}${progressBar(barWidth)} ${text(`${SAMPLE.slicesDone}`)}${dim(`/${SAMPLE.slicesTotal} slices · task `)}${accent(String(SAMPLE.tasksDone + 1))}${dim(`/${SAMPLE.tasksTotal}`)}`);\n\tlines.push(rule(width));\n\tlines.push(stateLine(\"current-small\", width, lines.length + 1));\n\treturn lines.map((line) => padLine(line, width));\n}\n\nfunction renderHorizontalBar(width: number): string[] {\n\tconst lines: string[] = [];\n\tconst left = `${accent(\"◒ GSD\")} ${success(SAMPLE.mode)} ${dim(\"·\")} ${success(SAMPLE.state)} ${dim(\"·\")} ${text(`${SAMPLE.verb} ${actionTarget(Math.floor(width * 0.45))}`)}`;\n\tconst right = dim(`${SAMPLE.phase} · ${SAMPLE.elapsed} · ${SAMPLE.eta}`);\n\tlines.push(rule(width, \"borderAccent\"));\n\tlines.push(alignRight(left, right, width));\n\n\tconst barWidth = Math.max(8, Math.min(16, Math.floor(width * 0.14)));\n\tconst progressLeft = `${progressBar(barWidth)} ${text(`${SAMPLE.slicesDone}/${SAMPLE.slicesTotal}`)}${dim(\" slices\")} ${dim(\"· task \")}${accent(String(SAMPLE.tasksDone + 1))}${dim(`/${SAMPLE.tasksTotal}`)}`;\n\tconst rightBudget = Math.max(20, width - visibleWidth(progressLeft) - 4);\n\tconst progressRight = truncateToWidth(\n\t\t`${metric(\"tokens\", SAMPLE.tokens, 18)} ${dim(\"·\")} ${metric(\"cost\", SAMPLE.cost, 12)}`,\n\t\trightBudget,\n\t\t\"…\",\n\t);\n\tlines.push(alignRight(progressLeft, progressRight, width));\n\tlines.push(rule(width, \"borderAccent\"));\n\tlines.push(stateLine(\"horizontal-bar\", width, lines.length + 1));\n\treturn lines.map((line) => padLine(line, width));\n}\n\nfunction renderSplitRibbon(width: number): string[] {\n\tconst lines: string[] = [];\n\tconst title = `${accent(\"GSD\")} ${success(SAMPLE.mode)} ${dim(\"·\")} ${SAMPLE.milestone}/${SAMPLE.slice}/${SAMPLE.unit}`;\n\tconst time = dim(`${SAMPLE.elapsed} · ${SAMPLE.eta}`);\n\tlines.push(rule(width));\n\tlines.push(alignRight(title, time, width));\n\n\tconst actionWidth = Math.max(18, Math.floor(width * 0.42));\n\tconst phaseWidth = Math.max(14, Math.floor(width * 0.18));\n\tconst progressWidth = Math.max(22, Math.floor(width * 0.22));\n\tconst action = `${label(\"work\")} ${text(actionTarget(actionWidth))}`;\n\tconst phase = `${label(\"phase\", \"border\")} ${dim(SAMPLE.phase)}`;\n\tconst progress = `${label(\"progress\")} ${progressBar(Math.max(8, progressWidth - 18))} ${text(`${SAMPLE.slicesDone}/${SAMPLE.slicesTotal}`)}`;\n\tconst run = `${label(\"run\", \"border\")} ${dim(`${SAMPLE.tokens} · ${SAMPLE.cost}`)}`;\n\tlines.push(fitColumns(width, [action, phase, progress, run]));\n\tlines.push(rule(width));\n\tlines.push(stateLine(\"split-ribbon\", width, lines.length + 1));\n\treturn lines.map((line) => padLine(line, width));\n}\n\nfunction renderDenseGrid(width: number): string[] {\n\tconst lines: string[] = [];\n\tconst rowOne = fitColumns(width, [\n\t\t`${label(\"status\", \"border\")} ${success(`${SAMPLE.mode} ${SAMPLE.state}`)}`,\n\t\t`${label(\"unit\")} ${text(`${SAMPLE.milestone}/${SAMPLE.slice}/${SAMPLE.unit}`)}`,\n\t\t`${label(\"spend\", \"border\")} ${dim(`${SAMPLE.tokens} · ${SAMPLE.cost}`)}`,\n\t\t`${label(\"time\")} ${dim(`${SAMPLE.elapsed} · ${SAMPLE.eta}`)}`,\n\t]);\n\tconst rowTwo = fitColumns(width, [\n\t\t`${label(\"phase\", \"border\")} ${dim(SAMPLE.phase)}`,\n\t\t`${label(\"work\")} ${text(actionTarget(Math.floor(width * 0.28)))}`,\n\t\t`${label(\"task\", \"border\")} ${accent(String(SAMPLE.tasksDone + 1))}${dim(`/${SAMPLE.tasksTotal}`)}`,\n\t\t`${label(\"slice\")} ${progressBar(Math.max(8, Math.min(16, Math.floor(width * 0.16))))} ${text(`${SAMPLE.slicesDone}/${SAMPLE.slicesTotal}`)}`,\n\t]);\n\tlines.push(rule(width, \"borderAccent\"));\n\tlines.push(rowOne);\n\tlines.push(rowTwo);\n\tlines.push(rule(width, \"borderAccent\"));\n\tlines.push(stateLine(\"dense-grid\", width, lines.length + 1));\n\treturn lines.map((line) => padLine(line, width));\n}\n\nexport const WIDGET_PROTOTYPES: WidgetPrototype[] = [\n\t{\n\t\tid: \"current-small\",\n\t\tlabel: \"A · Current small\",\n\t\ttagline: \"Baseline: existing small mode shape, vertical action/progress stack\",\n\t\trender: renderCurrentSmall,\n\t},\n\t{\n\t\tid: \"horizontal-bar\",\n\t\tlabel: \"B · Horizontal bar\",\n\t\ttagline: \"3-line widget, action + status use the full terminal width\",\n\t\trender: renderHorizontalBar,\n\t},\n\t{\n\t\tid: \"split-ribbon\",\n\t\tlabel: \"C · Split ribbon\",\n\t\ttagline: \"Four labeled columns without duplicating footer commands\",\n\t\trender: renderSplitRibbon,\n\t},\n\t{\n\t\tid: \"dense-grid\",\n\t\tlabel: \"D · Dense grid\",\n\t\ttagline: \"Selected: two metric rows, maximum scan data without growing height\",\n\t\trender: renderDenseGrid,\n\t},\n];\n\nexport function getWidgetPrototype(id: string): WidgetPrototype {\n\tconst found = WIDGET_PROTOTYPES.find((prototype) => prototype.id === id);\n\tif (!found) {\n\t\tthrow new Error(`Unknown widget prototype: ${id}. Options: ${WIDGET_PROTOTYPES.map((p) => p.id).join(\", \")}`);\n\t}\n\treturn found;\n}\n\nexport function resolveWidgetPrototypeSet(arg: string): WidgetPrototype[] {\n\tif (arg === \"all\") return WIDGET_PROTOTYPES;\n\tif (arg === \"recommended\") return [getWidgetPrototype(RECOMMENDED_WIDGET_PROTOTYPE_ID)];\n\treturn [getWidgetPrototype(arg)];\n}\n\nexport function listWidgetPrototypeIds(): WidgetPrototypeId[] {\n\treturn WIDGET_PROTOTYPES.map((prototype) => prototype.id);\n}\n\nexport function renderWidgetPrototypeBanner(prototype: WidgetPrototype, width: number): string[] {\n\tconst labelText = `${prototype.label} ${prototype.id === RECOMMENDED_WIDGET_PROTOTYPE_ID ? \"★ \" : \"\"}${prototype.tagline}`;\n\treturn [\n\t\trule(width, prototype.id === RECOMMENDED_WIDGET_PROTOTYPE_ID ? \"borderAccent\" : \"borderMuted\"),\n\t\tpadLine(labelText, width),\n\t\trule(width, prototype.id === RECOMMENDED_WIDGET_PROTOTYPE_ID ? \"borderAccent\" : \"borderMuted\"),\n\t];\n}\n"]}
|
package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-controller.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/controllers/chat-controller.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-controller.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/controllers/chat-controller.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAsJnG,0FAA0F;AAC1F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1D;AAKD;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAQzF;AAiED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC5C,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EACrD,IAAI,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAE,GACpC,MAAM,GAAG,SAAS,CAkBpB;AAyGD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ/D;AAyCD,wBAAgB,4BAA4B,CAC3C,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,GACvB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB/C;AAED,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAExE;AA6HD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,wBAAwB,GAAG;IACvE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,4BAA4B,EAAE,MAAM,GAAG,CAAC;IACxC,gBAAgB,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACxD,qBAAqB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;IACpD,2BAA2B,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,CAAC;IACvD,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,uBAAuB,EAAE,MAAM,IAAI,CAAC;IACpC,oBAAoB,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,4BAA4B,EAAE,MAAM,IAAI,CAAC;IACzC,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,uBAAuB,EAAE,MAAM,IAAI,CAAC;IACpC,wBAAwB,EAAE;QAAE,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;CAChD,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAszB7C"}
|
|
@@ -53,6 +53,7 @@ function registerPendingToolComponent(host, toolCallId, toolName, args, source,
|
|
|
53
53
|
const component = createComponent();
|
|
54
54
|
component.setExpanded(host.toolOutputExpanded);
|
|
55
55
|
host.chatContainer.addChild(component);
|
|
56
|
+
markFirstVisibleAssistantOutput(host, "tool", { toolName, source });
|
|
56
57
|
host.pendingTools.set(toolCallId, component);
|
|
57
58
|
toolRegistrationSources.set(component, new Set([source]));
|
|
58
59
|
return { component, created: true };
|
|
@@ -72,6 +73,12 @@ function startLoadingAnimation(host) {
|
|
|
72
73
|
host.pendingWorkingMessage = undefined;
|
|
73
74
|
}
|
|
74
75
|
}
|
|
76
|
+
function markTuiLatency(host, phase, data) {
|
|
77
|
+
host.session?.markTurnLatency?.(phase, data);
|
|
78
|
+
}
|
|
79
|
+
function markFirstVisibleAssistantOutput(host, kind, data) {
|
|
80
|
+
host.session?.markFirstVisibleTurnLatency?.(kind, data);
|
|
81
|
+
}
|
|
75
82
|
function getVisibleTextLikeBlockType(block) {
|
|
76
83
|
if (block?.type === "text" && typeof block.text === "string" && block.text.trim().length > 0)
|
|
77
84
|
return "text";
|
|
@@ -517,6 +524,7 @@ export async function handleAgentEvent(host, event) {
|
|
|
517
524
|
}
|
|
518
525
|
host.statusContainer.clear();
|
|
519
526
|
startLoadingAnimation(host);
|
|
527
|
+
markTuiLatency(host, "tui.loader_visible");
|
|
520
528
|
host.ui.requestRender();
|
|
521
529
|
break;
|
|
522
530
|
case "message_start":
|
|
@@ -534,6 +542,10 @@ export async function handleAgentEvent(host, event) {
|
|
|
534
542
|
// External-tool providers can stream multiple assistant turns through
|
|
535
543
|
// one response. Delay component creation until visible assistant text
|
|
536
544
|
// arrives so tool outputs keep chronological ordering.
|
|
545
|
+
markTuiLatency(host, "tui.assistant_message_start", {
|
|
546
|
+
provider: event.message.provider,
|
|
547
|
+
model: event.message.model,
|
|
548
|
+
});
|
|
537
549
|
host.ui.requestRender();
|
|
538
550
|
}
|
|
539
551
|
break;
|
|
@@ -712,6 +724,9 @@ export async function handleAgentEvent(host, event) {
|
|
|
712
724
|
chatTurnFollowsUser(host.chatContainer.children);
|
|
713
725
|
const comp = new AssistantMessageComponent(undefined, host.hideThinkingBlock, host.getMarkdownThemeWithSettings(), timestampFormat, { startIndex: seg.startIndex, endIndex: seg.endIndex }, connectedToUser);
|
|
714
726
|
host.chatContainer.addChild(comp);
|
|
727
|
+
markFirstVisibleAssistantOutput(host, seg.contentType, {
|
|
728
|
+
contentIndex: seg.startIndex,
|
|
729
|
+
});
|
|
715
730
|
renderedSegments.push({
|
|
716
731
|
kind: "text-run",
|
|
717
732
|
startIndex: seg.startIndex,
|
|
@@ -896,6 +911,10 @@ export async function handleAgentEvent(host, event) {
|
|
|
896
911
|
continue;
|
|
897
912
|
}
|
|
898
913
|
host.chatContainer.addChild(comp);
|
|
914
|
+
markFirstVisibleAssistantOutput(host, seg.contentType, {
|
|
915
|
+
contentIndex: seg.startIndex,
|
|
916
|
+
source: "message_end_rebuild",
|
|
917
|
+
});
|
|
899
918
|
renderedSegments.push({
|
|
900
919
|
kind: "text-run",
|
|
901
920
|
startIndex: seg.startIndex,
|
|
@@ -912,6 +931,7 @@ export async function handleAgentEvent(host, event) {
|
|
|
912
931
|
const connectedToUser = chatTurnFollowsUser(host.chatContainer.children);
|
|
913
932
|
host.streamingComponent = new AssistantMessageComponent(undefined, host.hideThinkingBlock, host.getMarkdownThemeWithSettings(), timestampFormat, undefined, connectedToUser);
|
|
914
933
|
host.chatContainer.addChild(host.streamingComponent);
|
|
934
|
+
markFirstVisibleAssistantOutput(host, "message_end_only");
|
|
915
935
|
reconcileChatTurnConnections(host.chatContainer.children);
|
|
916
936
|
}
|
|
917
937
|
if (host.streamingComponent) {
|