@opengsd/gsd-pi 1.1.1-dev.b2556262 → 1.2.0-dev.844675c9

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.
Files changed (211) hide show
  1. package/dist/project-sessions.js +4 -2
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +17 -9
  4. package/dist/resources/extensions/gsd/auto/contracts.js +8 -1
  5. package/dist/resources/extensions/gsd/auto/orchestrator.js +659 -57
  6. package/dist/resources/extensions/gsd/auto-prompts.js +110 -1
  7. package/dist/resources/extensions/gsd/auto-runtime-state.js +3 -0
  8. package/dist/resources/extensions/gsd/auto-tool-tracking.js +5 -0
  9. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +29 -0
  10. package/dist/resources/extensions/gsd/auto-worktree.js +24 -17
  11. package/dist/resources/extensions/gsd/auto.js +62 -464
  12. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +4 -1
  13. package/dist/resources/extensions/gsd/debug-logger.js +10 -0
  14. package/dist/resources/extensions/gsd/doctor-proactive.js +7 -2
  15. package/dist/resources/extensions/gsd/guided-flow.js +2 -2
  16. package/dist/resources/extensions/gsd/markdown-renderer.js +31 -32
  17. package/dist/resources/extensions/gsd/mcp-filter.js +6 -0
  18. package/dist/resources/extensions/gsd/native-git-bridge.js +45 -0
  19. package/dist/resources/extensions/gsd/prompts/discuss.md +6 -7
  20. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
  21. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -5
  22. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
  23. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
  24. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  25. package/dist/resources/extensions/gsd/prompts/research-milestone.md +2 -2
  26. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
  27. package/dist/resources/extensions/gsd/schemas/parsers.js +6 -1
  28. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +21 -1
  29. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +169 -20
  30. package/dist/resources/extensions/gsd/user-input-boundary.js +42 -4
  31. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  32. package/dist/web/standalone/.next/BUILD_ID +1 -1
  33. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  34. package/dist/web/standalone/.next/build-manifest.json +2 -2
  35. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  36. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  37. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  38. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  41. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  43. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  44. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  45. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  46. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  47. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  48. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  49. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  50. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  51. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  52. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  53. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  54. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  55. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  56. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  57. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  58. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  59. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  60. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  61. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  62. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  63. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  64. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  65. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  66. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  67. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  68. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  69. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  70. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  71. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  72. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  73. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  74. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  75. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  76. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  77. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  78. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  79. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  80. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  81. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  82. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  83. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  84. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  85. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  86. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  87. package/dist/web/standalone/.next/server/app/index.html +1 -1
  88. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  91. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  95. package/dist/web/standalone/.next/server/chunks/5047.js +2 -0
  96. package/dist/web/standalone/.next/server/chunks/5124.js +1 -0
  97. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  98. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  100. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  101. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  102. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  103. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  104. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  105. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  106. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  107. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  108. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  109. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  110. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  111. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  112. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  113. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  114. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  115. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  116. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  117. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  118. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  119. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  120. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  121. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  122. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  123. package/package.json +16 -11
  124. package/packages/cloud-mcp-gateway/package.json +2 -2
  125. package/packages/contracts/package.json +1 -1
  126. package/packages/daemon/package.json +4 -4
  127. package/packages/gsd-agent-core/package.json +5 -5
  128. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +1 -1
  129. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  130. package/packages/gsd-agent-modes/package.json +7 -7
  131. package/packages/mcp-server/package.json +3 -3
  132. package/packages/native/package.json +1 -1
  133. package/packages/pi-agent-core/package.json +1 -1
  134. package/packages/pi-ai/dist/models.generated.d.ts +0 -34
  135. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  136. package/packages/pi-ai/dist/models.generated.js +12 -46
  137. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  138. package/packages/pi-ai/package.json +1 -1
  139. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  140. package/packages/pi-coding-agent/dist/core/auth-storage.js +11 -3
  141. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  142. package/packages/pi-coding-agent/package.json +7 -7
  143. package/packages/pi-tui/package.json +2 -2
  144. package/packages/rpc-client/package.json +2 -2
  145. package/pkg/package.json +1 -1
  146. package/scripts/install/deps.js +10 -0
  147. package/scripts/link-workspace-packages.cjs +7 -40
  148. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +18 -8
  149. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +2 -2
  150. package/src/resources/extensions/gsd/auto/contracts.ts +8 -119
  151. package/src/resources/extensions/gsd/auto/orchestrator.ts +794 -58
  152. package/src/resources/extensions/gsd/auto-prompts.ts +114 -1
  153. package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -0
  154. package/src/resources/extensions/gsd/auto-tool-tracking.ts +5 -0
  155. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +33 -0
  156. package/src/resources/extensions/gsd/auto-worktree.ts +24 -16
  157. package/src/resources/extensions/gsd/auto.ts +81 -500
  158. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +4 -0
  159. package/src/resources/extensions/gsd/debug-logger.ts +11 -0
  160. package/src/resources/extensions/gsd/doctor-proactive.ts +8 -2
  161. package/src/resources/extensions/gsd/guided-flow.ts +2 -2
  162. package/src/resources/extensions/gsd/markdown-renderer.ts +38 -19
  163. package/src/resources/extensions/gsd/mcp-filter.ts +7 -0
  164. package/src/resources/extensions/gsd/native-git-bridge.ts +48 -0
  165. package/src/resources/extensions/gsd/prompts/discuss.md +6 -7
  166. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
  167. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -5
  168. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
  169. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
  170. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  171. package/src/resources/extensions/gsd/prompts/research-milestone.md +2 -2
  172. package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
  173. package/src/resources/extensions/gsd/schemas/parsers.ts +6 -1
  174. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +31 -10
  175. package/src/resources/extensions/gsd/tests/artifact-db-drift-memo.test.ts +66 -0
  176. package/src/resources/extensions/gsd/tests/auto-dispatch-baseline-harness.test.ts +53 -0
  177. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +590 -855
  178. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +38 -10
  179. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +15 -0
  180. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +64 -1
  181. package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +157 -0
  182. package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +75 -0
  183. package/src/resources/extensions/gsd/tests/native-merge-regular.test.ts +139 -0
  184. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +127 -0
  185. package/src/resources/extensions/gsd/tests/parse-project-milestone-bridge.test.ts +77 -0
  186. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +4 -2
  187. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +29 -2
  188. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +65 -0
  189. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +19 -5
  190. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +38 -0
  191. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +62 -0
  192. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +24 -0
  193. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -3
  194. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +183 -21
  195. package/src/resources/extensions/gsd/user-input-boundary.ts +37 -5
  196. package/dist/web/standalone/.next/server/chunks/678.js +0 -2
  197. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +0 -21
  198. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +0 -1
  199. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +0 -213
  200. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +0 -1
  201. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts +0 -28
  202. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts.map +0 -1
  203. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js +0 -249
  204. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js.map +0 -1
  205. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts +0 -19
  206. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts.map +0 -1
  207. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js +0 -797
  208. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js.map +0 -1
  209. package/scripts/ensure-workspace-builds.cjs +0 -129
  210. /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → Qbr81pQ-pbQXP4bq2VXLv}/_buildManifest.js +0 -0
  211. /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → Qbr81pQ-pbQXP4bq2VXLv}/_ssgManifest.js +0 -0
@@ -1,28 +0,0 @@
1
- export type DensityVariantId = "current" | "compact" | "tight-tools" | "minimal";
2
- export interface DensityVariant {
3
- id: DensityVariantId;
4
- label: string;
5
- tagline: string;
6
- opts: DensityOptions;
7
- }
8
- export interface DensityOptions {
9
- railPaddingX: number;
10
- railPaddingY: number;
11
- openPaddingY: number;
12
- gapBeforeBlock: number;
13
- bottomRule: boolean;
14
- footerMode: "row" | "inline-title" | "none";
15
- stackCollapsedTools: boolean;
16
- }
17
- export declare const DENSITY_VARIANTS: DensityVariant[];
18
- /** Representative slice of a real session — mirrors the screenshot flow. */
19
- export declare function renderSampleTranscript(width: number, variant: DensityVariant): string[];
20
- export declare function renderVariantBanner(variant: DensityVariant, width: number): string[];
21
- export declare function getVariant(id: string): DensityVariant;
22
- export declare function countVisualLines(lines: string[]): number;
23
- export declare function lineStats(lines: string[]): {
24
- total: number;
25
- nonBlank: number;
26
- blank: number;
27
- };
28
- //# sourceMappingURL=transcript-density-prototype.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transcript-density-prototype.d.ts","sourceRoot":"","sources":["../../../../../src/modes/interactive/components/__prototype__/transcript-density-prototype.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;AAEjF,MAAM,WAAW,cAAc;IAC9B,EAAE,EAAE,gBAAgB,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,cAAc,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,KAAK,GAAG,cAAc,GAAG,MAAM,CAAC;IAC5C,mBAAmB,EAAE,OAAO,CAAC;CAC7B;AAED,eAAO,MAAM,gBAAgB,EAAE,cAAc,EAyD5C,CAAC;AA6LF,4EAA4E;AAC5E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,EAAE,CAmEvF;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAIpF;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,CAMrD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAExD;AAMD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAI7F"}
@@ -1,249 +0,0 @@
1
- // PROTOTYPE — throwaway density experiments for chat/tool transcript layout.
2
- // Question: how much vertical space can we remove without hurting scanability?
3
- // Run: npm run prototype:tui-density [-- current|compact|tight-tools|minimal|all]
4
- import { alignRight, padRight, style, truncateToWidth, visibleWidth } from "@gsd/pi-tui";
5
- import { theme } from "@gsd/pi-coding-agent/theme/theme.js";
6
- const USER_LABEL = "YOU";
7
- function headerLabel(text) {
8
- return text.toUpperCase();
9
- }
10
- function styledHeader(text, color = "borderAccent") {
11
- return theme.fg(color, theme.bold(headerLabel(text)));
12
- }
13
- export const DENSITY_VARIANTS = [
14
- {
15
- id: "current",
16
- label: "A · Current",
17
- tagline: "Baseline — paddingY=1, blank gap before blocks, footer row when expanded",
18
- opts: {
19
- railPaddingX: 3,
20
- railPaddingY: 1,
21
- openPaddingY: 0,
22
- gapBeforeBlock: 1,
23
- bottomRule: true,
24
- footerMode: "row",
25
- stackCollapsedTools: false,
26
- },
27
- },
28
- {
29
- id: "compact",
30
- label: "B · Compact",
31
- tagline: "Zero vertical padding, no inter-block gaps, hints on title bar",
32
- opts: {
33
- railPaddingX: 2,
34
- railPaddingY: 0,
35
- openPaddingY: 0,
36
- gapBeforeBlock: 0,
37
- bottomRule: false,
38
- footerMode: "inline-title",
39
- stackCollapsedTools: false,
40
- },
41
- },
42
- {
43
- id: "tight-tools",
44
- label: "C · Tight tools",
45
- tagline: "Comfortable assistant bubble, collapsed tools stack flush",
46
- opts: {
47
- railPaddingX: 3,
48
- railPaddingY: 1,
49
- openPaddingY: 0,
50
- gapBeforeBlock: 0,
51
- bottomRule: true,
52
- footerMode: "none",
53
- stackCollapsedTools: true,
54
- },
55
- },
56
- {
57
- id: "minimal",
58
- label: "D · Minimal",
59
- tagline: "Title rules only — no bottom rules, no footers, no gaps",
60
- opts: {
61
- railPaddingX: 2,
62
- railPaddingY: 0,
63
- openPaddingY: 0,
64
- gapBeforeBlock: 0,
65
- bottomRule: false,
66
- footerMode: "none",
67
- stackCollapsedTools: true,
68
- },
69
- },
70
- ];
71
- function toneColor(tone) {
72
- switch (tone) {
73
- case "running":
74
- return "toolRunning";
75
- case "success":
76
- return "border";
77
- case "error":
78
- return "toolError";
79
- case "warning":
80
- return "warning";
81
- case "muted":
82
- default:
83
- return "toolMuted";
84
- }
85
- }
86
- function trimOuterBlankLines(lines) {
87
- let start = 0;
88
- let end = lines.length;
89
- while (start < end && lines[start].trim().length === 0)
90
- start++;
91
- while (end > start && lines[end - 1].trim().length === 0)
92
- end--;
93
- return lines.slice(start, end);
94
- }
95
- function copyCleanRoundedSurface(lines, width, opts) {
96
- const outerWidth = Math.max(20, width);
97
- const paddingX = Math.max(0, opts.paddingX);
98
- const paddingY = Math.max(0, opts.paddingY);
99
- const title = opts.title;
100
- const right = opts.right ?? "";
101
- const border = (text) => theme.fg(opts.borderColor, text);
102
- const contentWidth = Math.max(1, outerWidth - paddingX);
103
- const titleBudget = right ? Math.max(0, outerWidth - visibleWidth(right) - 9) : Math.max(0, outerWidth - 6);
104
- const clippedTitle = truncateToWidth(title, titleBudget, "");
105
- const clippedRight = right ? truncateToWidth(right, Math.max(0, outerWidth - visibleWidth(clippedTitle) - 9), "") : "";
106
- const fixedWidth = 3 + visibleWidth(clippedTitle) + (clippedRight ? 3 + visibleWidth(clippedRight) : 0) + 1;
107
- const fill = Math.max(1, outerWidth - fixedWidth);
108
- const top = clippedRight
109
- ? border("╭─ ") + clippedTitle + border(` ${"─".repeat(fill)} `) + theme.fg("dim", clippedRight) + border("╮")
110
- : border("╭─ ") + clippedTitle + border(` ${"─".repeat(fill)}╮`);
111
- const bottom = border("╰" + "─".repeat(Math.max(1, outerWidth - 2)) + "╯");
112
- const source = trimOuterBlankLines(lines);
113
- const bodySource = source.length > 0 ? source : [""];
114
- const blank = "";
115
- const body = [
116
- ...Array.from({ length: paddingY }, () => blank),
117
- ...bodySource.map((line) => " ".repeat(paddingX) + truncateToWidth(theme.fg(opts.bodyColor, line.trimEnd()), contentWidth, "")),
118
- ...Array.from({ length: paddingY }, () => blank),
119
- ];
120
- return [top, ...body, bottom].map((line) => padRight(truncateToWidth(line, outerWidth, ""), outerWidth));
121
- }
122
- function renderAssistantRail(lines, width, opts, meta = "gpt-test · 1.2s") {
123
- const surface = copyCleanRoundedSurface(lines.length > 0 ? lines : [""], Math.max(20, width), {
124
- title: styledHeader("GSD", "borderAccent"),
125
- right: meta,
126
- borderColor: "borderAccent",
127
- bodyColor: "assistantMessageText",
128
- paddingX: opts.railPaddingX,
129
- paddingY: opts.railPaddingY,
130
- });
131
- return surface.map((line) => theme.bg("customMessageBg", line));
132
- }
133
- function renderUserRail(lines, width, opts) {
134
- const surface = copyCleanRoundedSurface(lines.length > 0 ? lines : [""], Math.max(20, width), {
135
- title: styledHeader(USER_LABEL, "border"),
136
- borderColor: "border",
137
- bodyColor: "userMessageText",
138
- paddingX: opts.railPaddingX,
139
- paddingY: opts.railPaddingY,
140
- });
141
- return surface.map((line) => theme.bg("userMessageBg", line));
142
- }
143
- function openRuleLine(title, right, width, tone, bottomRule) {
144
- let surface = style()
145
- .border("open")
146
- .borderColor((text) => theme.fg(tone, text))
147
- .title(title);
148
- if (right)
149
- surface = surface.titleRight(right);
150
- if (!bottomRule)
151
- surface = surface.bottomRule(false);
152
- // Collapsed cards use only the titled top rule — same as transcript-design.ts.
153
- return [surface.render([], Math.max(20, width))[0]];
154
- }
155
- function renderOpenCard(bodyLines, width, opts, density) {
156
- const outerWidth = Math.max(20, width);
157
- const tone = toneColor(opts.tone);
158
- const body = [...bodyLines];
159
- let right = opts.right ?? "";
160
- if (density.footerMode === "inline-title" && (opts.footerLeft || opts.footerRight)) {
161
- const hint = [opts.footerLeft, opts.footerRight].filter(Boolean).join(" · ");
162
- right = right ? `${right} · ${theme.fg("dim", hint)}` : theme.fg("dim", hint);
163
- }
164
- else if (density.footerMode === "row" && (opts.footerLeft || opts.footerRight)) {
165
- body.push("");
166
- body.push(alignRight(theme.fg("dim", opts.footerLeft ?? ""), theme.fg("dim", opts.footerRight ?? ""), outerWidth));
167
- }
168
- let surface = style()
169
- .border("open")
170
- .borderColor((text) => theme.fg(tone, text))
171
- .title(styledHeader(opts.title, "borderAccent"));
172
- if (right)
173
- surface = surface.titleRight(theme.fg(tone, right));
174
- if (density.openPaddingY > 0)
175
- surface = surface.paddingY(density.openPaddingY);
176
- if (!density.bottomRule)
177
- surface = surface.bottomRule(false);
178
- return surface.render(body, outerWidth);
179
- }
180
- function renderCollapsedTool(title, target, status, width, tone, density) {
181
- const tc = toneColor(tone);
182
- const titleText = `${styledHeader(title, "borderAccent")} ${theme.fg("text", target)}`;
183
- const right = theme.fg(tone === "success" ? "success" : tc, `${status} · output hidden · ctrl+o expand`);
184
- return openRuleLine(titleText, right, width, tc, density.bottomRule);
185
- }
186
- function renderExpandedTool(title, command, result, status, width, tone, density) {
187
- return renderOpenCard([theme.fg("dim", command), `${theme.fg("success", "✓")} ${result}`], width, {
188
- title,
189
- right: status,
190
- tone,
191
- footerLeft: density.footerMode === "row" ? "output expanded" : undefined,
192
- footerRight: density.footerMode === "row" ? "ctrl+o collapse" : undefined,
193
- }, density);
194
- }
195
- function gapLines(count) {
196
- return count > 0 ? Array.from({ length: count }, () => "") : [];
197
- }
198
- function blockWithGap(lines, gapBefore) {
199
- return [...gapLines(gapBefore), ...lines];
200
- }
201
- /** Representative slice of a real session — mirrors the screenshot flow. */
202
- export function renderSampleTranscript(width, variant) {
203
- const { opts } = variant;
204
- const out = [];
205
- out.push(...renderUserRail(["tighten up the tool cards in the transcript"], width, opts));
206
- out.push(...gapLines(opts.gapBeforeBlock));
207
- out.push(...renderAssistantRail(["I'll kill the background servers and checkpoint the database before saving the assessment summary."], width, opts));
208
- const collapsedTools = [
209
- { title: "Background Shell", target: "bg_shell kill [87ad363a]", status: "success · 340ms" },
210
- { title: "Background Shell", target: "bg_shell kill [87ad363a]", status: "success · 340ms" },
211
- { title: "Background Shell", target: "bg_shell kill [87ad363a]", status: "success · 340ms" },
212
- ];
213
- for (let i = 0; i < collapsedTools.length; i++) {
214
- const tool = collapsedTools[i];
215
- const gap = opts.stackCollapsedTools && i > 0 ? 0 : opts.gapBeforeBlock;
216
- out.push(...blockWithGap(renderCollapsedTool(tool.title, tool.target, tool.status, width, "success", opts), gap));
217
- }
218
- out.push(...blockWithGap(renderExpandedTool("Background Shell", "bg_shell kill [87ad363a]", "Killed 87ad363a python3 -m http.server 3005", "success · 340ms", width, "success", opts), opts.gapBeforeBlock));
219
- out.push(...blockWithGap(renderCollapsedTool("Save Summary", "summary_save ASSESSMENT M002/S02", "success · 120ms", width, "success", opts), opts.gapBeforeBlock));
220
- out.push(...blockWithGap(renderOpenCard([
221
- "WAL checkpoint complete — database is safe to stage with git.",
222
- theme.fg("dim", "Checkpoint at .planning/state/gsd.sqlite-wal"),
223
- ], width, { title: "Checkpoint GSD Database", right: "success · 89ms", tone: "success" }, opts), opts.gapBeforeBlock));
224
- return out;
225
- }
226
- export function renderVariantBanner(variant, width) {
227
- const label = `${variant.label} — ${variant.tagline}`;
228
- const rule = theme.fg("borderAccent", "═".repeat(Math.max(20, width)));
229
- return ["", rule, truncateToWidth(theme.fg("text", label), width, ""), rule, ""];
230
- }
231
- export function getVariant(id) {
232
- const found = DENSITY_VARIANTS.find((v) => v.id === id);
233
- if (!found) {
234
- throw new Error(`Unknown variant "${id}". Choose: ${DENSITY_VARIANTS.map((v) => v.id).join(", ")}`);
235
- }
236
- return found;
237
- }
238
- export function countVisualLines(lines) {
239
- return lines.filter((line) => stripTrailingSpaces(line).length > 0).length;
240
- }
241
- function stripTrailingSpaces(line) {
242
- return line.replace(/\s+$/, "");
243
- }
244
- export function lineStats(lines) {
245
- const total = lines.length;
246
- const nonBlank = countVisualLines(lines);
247
- return { total, nonBlank, blank: total - nonBlank };
248
- }
249
- //# sourceMappingURL=transcript-density-prototype.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transcript-density-prototype.js","sourceRoot":"","sources":["../../../../../src/modes/interactive/components/__prototype__/transcript-density-prototype.ts"],"names":[],"mappings":"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","sourcesContent":["// PROTOTYPE — throwaway density experiments for chat/tool transcript layout.\n// Question: how much vertical space can we remove without hurting scanability?\n// Run: npm run prototype:tui-density [-- current|compact|tight-tools|minimal|all]\n\nimport { alignRight, padRight, style, truncateToWidth, visibleWidth } from \"@gsd/pi-tui\";\nimport { theme, type ThemeColor } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport type { StatusTone } from \"../transcript-design.js\";\n\nconst USER_LABEL = \"YOU\";\n\nfunction headerLabel(text: string): string {\n\treturn text.toUpperCase();\n}\n\nfunction styledHeader(text: string, color: ThemeColor = \"borderAccent\"): string {\n\treturn theme.fg(color, theme.bold(headerLabel(text)));\n}\n\nexport type DensityVariantId = \"current\" | \"compact\" | \"tight-tools\" | \"minimal\";\n\nexport interface DensityVariant {\n\tid: DensityVariantId;\n\tlabel: string;\n\ttagline: string;\n\topts: DensityOptions;\n}\n\nexport interface DensityOptions {\n\trailPaddingX: number;\n\trailPaddingY: number;\n\topenPaddingY: number;\n\tgapBeforeBlock: number;\n\tbottomRule: boolean;\n\tfooterMode: \"row\" | \"inline-title\" | \"none\";\n\tstackCollapsedTools: boolean;\n}\n\nexport const DENSITY_VARIANTS: DensityVariant[] = [\n\t{\n\t\tid: \"current\",\n\t\tlabel: \"A · Current\",\n\t\ttagline: \"Baseline — paddingY=1, blank gap before blocks, footer row when expanded\",\n\t\topts: {\n\t\t\trailPaddingX: 3,\n\t\t\trailPaddingY: 1,\n\t\t\topenPaddingY: 0,\n\t\t\tgapBeforeBlock: 1,\n\t\t\tbottomRule: true,\n\t\t\tfooterMode: \"row\",\n\t\t\tstackCollapsedTools: false,\n\t\t},\n\t},\n\t{\n\t\tid: \"compact\",\n\t\tlabel: \"B · Compact\",\n\t\ttagline: \"Zero vertical padding, no inter-block gaps, hints on title bar\",\n\t\topts: {\n\t\t\trailPaddingX: 2,\n\t\t\trailPaddingY: 0,\n\t\t\topenPaddingY: 0,\n\t\t\tgapBeforeBlock: 0,\n\t\t\tbottomRule: false,\n\t\t\tfooterMode: \"inline-title\",\n\t\t\tstackCollapsedTools: false,\n\t\t},\n\t},\n\t{\n\t\tid: \"tight-tools\",\n\t\tlabel: \"C · Tight tools\",\n\t\ttagline: \"Comfortable assistant bubble, collapsed tools stack flush\",\n\t\topts: {\n\t\t\trailPaddingX: 3,\n\t\t\trailPaddingY: 1,\n\t\t\topenPaddingY: 0,\n\t\t\tgapBeforeBlock: 0,\n\t\t\tbottomRule: true,\n\t\t\tfooterMode: \"none\",\n\t\t\tstackCollapsedTools: true,\n\t\t},\n\t},\n\t{\n\t\tid: \"minimal\",\n\t\tlabel: \"D · Minimal\",\n\t\ttagline: \"Title rules only — no bottom rules, no footers, no gaps\",\n\t\topts: {\n\t\t\trailPaddingX: 2,\n\t\t\trailPaddingY: 0,\n\t\t\topenPaddingY: 0,\n\t\t\tgapBeforeBlock: 0,\n\t\t\tbottomRule: false,\n\t\t\tfooterMode: \"none\",\n\t\t\tstackCollapsedTools: true,\n\t\t},\n\t},\n];\n\nfunction toneColor(tone: StatusTone): ThemeColor {\n\tswitch (tone) {\n\t\tcase \"running\":\n\t\t\treturn \"toolRunning\";\n\t\tcase \"success\":\n\t\t\treturn \"border\";\n\t\tcase \"error\":\n\t\t\treturn \"toolError\";\n\t\tcase \"warning\":\n\t\t\treturn \"warning\";\n\t\tcase \"muted\":\n\t\tdefault:\n\t\t\treturn \"toolMuted\";\n\t}\n}\n\nfunction trimOuterBlankLines(lines: string[]): string[] {\n\tlet start = 0;\n\tlet end = lines.length;\n\twhile (start < end && lines[start].trim().length === 0) start++;\n\twhile (end > start && lines[end - 1].trim().length === 0) end--;\n\treturn lines.slice(start, end);\n}\n\nfunction copyCleanRoundedSurface(\n\tlines: string[],\n\twidth: number,\n\topts: {\n\t\ttitle: string;\n\t\tright?: string;\n\t\tborderColor: ThemeColor;\n\t\tbodyColor: ThemeColor;\n\t\tpaddingX: number;\n\t\tpaddingY: number;\n\t},\n): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst paddingX = Math.max(0, opts.paddingX);\n\tconst paddingY = Math.max(0, opts.paddingY);\n\tconst title = opts.title;\n\tconst right = opts.right ?? \"\";\n\tconst border = (text: string) => theme.fg(opts.borderColor, text);\n\tconst contentWidth = Math.max(1, outerWidth - paddingX);\n\n\tconst titleBudget = right ? Math.max(0, outerWidth - visibleWidth(right) - 9) : Math.max(0, outerWidth - 6);\n\tconst clippedTitle = truncateToWidth(title, titleBudget, \"\");\n\tconst clippedRight = right ? truncateToWidth(right, Math.max(0, outerWidth - visibleWidth(clippedTitle) - 9), \"\") : \"\";\n\tconst fixedWidth = 3 + visibleWidth(clippedTitle) + (clippedRight ? 3 + visibleWidth(clippedRight) : 0) + 1;\n\tconst fill = Math.max(1, outerWidth - fixedWidth);\n\tconst top = clippedRight\n\t\t? border(\"╭─ \") + clippedTitle + border(` ${\"─\".repeat(fill)} `) + theme.fg(\"dim\", clippedRight) + border(\"╮\")\n\t\t: border(\"╭─ \") + clippedTitle + border(` ${\"─\".repeat(fill)}╮`);\n\tconst bottom = border(\"╰\" + \"─\".repeat(Math.max(1, outerWidth - 2)) + \"╯\");\n\n\tconst source = trimOuterBlankLines(lines);\n\tconst bodySource = source.length > 0 ? source : [\"\"];\n\tconst blank = \"\";\n\tconst body = [\n\t\t...Array.from({ length: paddingY }, () => blank),\n\t\t...bodySource.map(\n\t\t\t(line) => \" \".repeat(paddingX) + truncateToWidth(theme.fg(opts.bodyColor, line.trimEnd()), contentWidth, \"\"),\n\t\t),\n\t\t...Array.from({ length: paddingY }, () => blank),\n\t];\n\n\treturn [top, ...body, bottom].map((line) => padRight(truncateToWidth(line, outerWidth, \"\"), outerWidth));\n}\n\nfunction renderAssistantRail(\n\tlines: string[],\n\twidth: number,\n\topts: DensityOptions,\n\tmeta = \"gpt-test · 1.2s\",\n): string[] {\n\tconst surface = copyCleanRoundedSurface(lines.length > 0 ? lines : [\"\"], Math.max(20, width), {\n\t\ttitle: styledHeader(\"GSD\", \"borderAccent\"),\n\t\tright: meta,\n\t\tborderColor: \"borderAccent\",\n\t\tbodyColor: \"assistantMessageText\",\n\t\tpaddingX: opts.railPaddingX,\n\t\tpaddingY: opts.railPaddingY,\n\t});\n\treturn surface.map((line) => theme.bg(\"customMessageBg\", line));\n}\n\nfunction renderUserRail(lines: string[], width: number, opts: DensityOptions): string[] {\n\tconst surface = copyCleanRoundedSurface(lines.length > 0 ? lines : [\"\"], Math.max(20, width), {\n\t\ttitle: styledHeader(USER_LABEL, \"border\"),\n\t\tborderColor: \"border\",\n\t\tbodyColor: \"userMessageText\",\n\t\tpaddingX: opts.railPaddingX,\n\t\tpaddingY: opts.railPaddingY,\n\t});\n\treturn surface.map((line) => theme.bg(\"userMessageBg\", line));\n}\n\nfunction openRuleLine(title: string, right: string, width: number, tone: ThemeColor, bottomRule: boolean): string[] {\n\tlet surface = style()\n\t\t.border(\"open\")\n\t\t.borderColor((text) => theme.fg(tone, text))\n\t\t.title(title);\n\tif (right) surface = surface.titleRight(right);\n\tif (!bottomRule) surface = surface.bottomRule(false);\n\t// Collapsed cards use only the titled top rule — same as transcript-design.ts.\n\treturn [surface.render([], Math.max(20, width))[0]!];\n}\n\nfunction renderOpenCard(\n\tbodyLines: string[],\n\twidth: number,\n\topts: {\n\t\ttitle: string;\n\t\tright?: string;\n\t\ttone: StatusTone;\n\t\tfooterLeft?: string;\n\t\tfooterRight?: string;\n\t},\n\tdensity: DensityOptions,\n): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst tone = toneColor(opts.tone);\n\tconst body = [...bodyLines];\n\n\tlet right = opts.right ?? \"\";\n\tif (density.footerMode === \"inline-title\" && (opts.footerLeft || opts.footerRight)) {\n\t\tconst hint = [opts.footerLeft, opts.footerRight].filter(Boolean).join(\" · \");\n\t\tright = right ? `${right} · ${theme.fg(\"dim\", hint)}` : theme.fg(\"dim\", hint);\n\t} else if (density.footerMode === \"row\" && (opts.footerLeft || opts.footerRight)) {\n\t\tbody.push(\"\");\n\t\tbody.push(alignRight(theme.fg(\"dim\", opts.footerLeft ?? \"\"), theme.fg(\"dim\", opts.footerRight ?? \"\"), outerWidth));\n\t}\n\n\tlet surface = style()\n\t\t.border(\"open\")\n\t\t.borderColor((text) => theme.fg(tone, text))\n\t\t.title(styledHeader(opts.title, \"borderAccent\"));\n\tif (right) surface = surface.titleRight(theme.fg(tone, right));\n\tif (density.openPaddingY > 0) surface = surface.paddingY(density.openPaddingY);\n\tif (!density.bottomRule) surface = surface.bottomRule(false);\n\treturn surface.render(body, outerWidth);\n}\n\nfunction renderCollapsedTool(\n\ttitle: string,\n\ttarget: string,\n\tstatus: string,\n\twidth: number,\n\ttone: StatusTone,\n\tdensity: DensityOptions,\n): string[] {\n\tconst tc = toneColor(tone);\n\tconst titleText = `${styledHeader(title, \"borderAccent\")} ${theme.fg(\"text\", target)}`;\n\tconst right = theme.fg(tone === \"success\" ? \"success\" : tc, `${status} · output hidden · ctrl+o expand`);\n\treturn openRuleLine(titleText, right, width, tc, density.bottomRule);\n}\n\nfunction renderExpandedTool(\n\ttitle: string,\n\tcommand: string,\n\tresult: string,\n\tstatus: string,\n\twidth: number,\n\ttone: StatusTone,\n\tdensity: DensityOptions,\n): string[] {\n\treturn renderOpenCard(\n\t\t[theme.fg(\"dim\", command), `${theme.fg(\"success\", \"✓\")} ${result}`],\n\t\twidth,\n\t\t{\n\t\t\ttitle,\n\t\t\tright: status,\n\t\t\ttone,\n\t\t\tfooterLeft: density.footerMode === \"row\" ? \"output expanded\" : undefined,\n\t\t\tfooterRight: density.footerMode === \"row\" ? \"ctrl+o collapse\" : undefined,\n\t\t},\n\t\tdensity,\n\t);\n}\n\nfunction gapLines(count: number): string[] {\n\treturn count > 0 ? Array.from({ length: count }, () => \"\") : [];\n}\n\nfunction blockWithGap(lines: string[], gapBefore: number): string[] {\n\treturn [...gapLines(gapBefore), ...lines];\n}\n\n/** Representative slice of a real session — mirrors the screenshot flow. */\nexport function renderSampleTranscript(width: number, variant: DensityVariant): string[] {\n\tconst { opts } = variant;\n\tconst out: string[] = [];\n\n\tout.push(...renderUserRail([\"tighten up the tool cards in the transcript\"], width, opts));\n\tout.push(...gapLines(opts.gapBeforeBlock));\n\tout.push(\n\t\t...renderAssistantRail(\n\t\t\t[\"I'll kill the background servers and checkpoint the database before saving the assessment summary.\"],\n\t\t\twidth,\n\t\t\topts,\n\t\t),\n\t);\n\n\tconst collapsedTools = [\n\t\t{ title: \"Background Shell\", target: \"bg_shell kill [87ad363a]\", status: \"success · 340ms\" },\n\t\t{ title: \"Background Shell\", target: \"bg_shell kill [87ad363a]\", status: \"success · 340ms\" },\n\t\t{ title: \"Background Shell\", target: \"bg_shell kill [87ad363a]\", status: \"success · 340ms\" },\n\t];\n\n\tfor (let i = 0; i < collapsedTools.length; i++) {\n\t\tconst tool = collapsedTools[i]!;\n\t\tconst gap = opts.stackCollapsedTools && i > 0 ? 0 : opts.gapBeforeBlock;\n\t\tout.push(\n\t\t\t...blockWithGap(\n\t\t\t\trenderCollapsedTool(tool.title, tool.target, tool.status, width, \"success\", opts),\n\t\t\t\tgap,\n\t\t\t),\n\t\t);\n\t}\n\n\tout.push(\n\t\t...blockWithGap(\n\t\t\trenderExpandedTool(\n\t\t\t\t\"Background Shell\",\n\t\t\t\t\"bg_shell kill [87ad363a]\",\n\t\t\t\t\"Killed 87ad363a python3 -m http.server 3005\",\n\t\t\t\t\"success · 340ms\",\n\t\t\t\twidth,\n\t\t\t\t\"success\",\n\t\t\t\topts,\n\t\t\t),\n\t\t\topts.gapBeforeBlock,\n\t\t),\n\t);\n\tout.push(\n\t\t...blockWithGap(\n\t\t\trenderCollapsedTool(\"Save Summary\", \"summary_save ASSESSMENT M002/S02\", \"success · 120ms\", width, \"success\", opts),\n\t\t\topts.gapBeforeBlock,\n\t\t),\n\t);\n\tout.push(\n\t\t...blockWithGap(\n\t\t\trenderOpenCard(\n\t\t\t\t[\n\t\t\t\t\t\"WAL checkpoint complete — database is safe to stage with git.\",\n\t\t\t\t\ttheme.fg(\"dim\", \"Checkpoint at .planning/state/gsd.sqlite-wal\"),\n\t\t\t\t],\n\t\t\t\twidth,\n\t\t\t\t{ title: \"Checkpoint GSD Database\", right: \"success · 89ms\", tone: \"success\" },\n\t\t\t\topts,\n\t\t\t),\n\t\t\topts.gapBeforeBlock,\n\t\t),\n\t);\n\n\treturn out;\n}\n\nexport function renderVariantBanner(variant: DensityVariant, width: number): string[] {\n\tconst label = `${variant.label} — ${variant.tagline}`;\n\tconst rule = theme.fg(\"borderAccent\", \"═\".repeat(Math.max(20, width)));\n\treturn [\"\", rule, truncateToWidth(theme.fg(\"text\", label), width, \"\"), rule, \"\"];\n}\n\nexport function getVariant(id: string): DensityVariant {\n\tconst found = DENSITY_VARIANTS.find((v) => v.id === id);\n\tif (!found) {\n\t\tthrow new Error(`Unknown variant \"${id}\". Choose: ${DENSITY_VARIANTS.map((v) => v.id).join(\", \")}`);\n\t}\n\treturn found;\n}\n\nexport function countVisualLines(lines: string[]): number {\n\treturn lines.filter((line) => stripTrailingSpaces(line).length > 0).length;\n}\n\nfunction stripTrailingSpaces(line: string): string {\n\treturn line.replace(/\\s+$/, \"\");\n}\n\nexport function lineStats(lines: string[]): { total: number; nonBlank: number; blank: number } {\n\tconst total = lines.length;\n\tconst nonBlank = countVisualLines(lines);\n\treturn { total, nonBlank, blank: total - nonBlank };\n}\n"]}
@@ -1,19 +0,0 @@
1
- import { lineStats } from "./transcript-density-prototype.js";
2
- export { lineStats };
3
- export interface DesignPrototype {
4
- id: string;
5
- label: string;
6
- tagline: string;
7
- inspiration: string;
8
- render: (width: number) => string[];
9
- }
10
- /** Default comparison set — the rethink. */
11
- export declare const RETHINK_PROTOTYPES: DesignPrototype[];
12
- /** Prior exploration variants — npm run prototype:tui-design -- explore */
13
- export declare const LEGACY_PROTOTYPES: DesignPrototype[];
14
- export declare const DESIGN_PROTOTYPES: DesignPrototype[];
15
- export declare function getDesignPrototype(id: string): DesignPrototype;
16
- export declare function resolvePrototypeSet(mode: string): DesignPrototype[];
17
- export declare function renderPrototypeBanner(prototype: DesignPrototype, width: number): string[];
18
- export declare function listPrototypeIds(): string[];
19
- //# sourceMappingURL=transcript-design-prototype.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transcript-design-prototype.d.ts","sourceRoot":"","sources":["../../../../../src/modes/interactive/components/__prototype__/transcript-design-prototype.ts"],"names":[],"mappings":"AAOA,OAAO,EAIN,SAAS,EAET,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,CAAC;AAErB,MAAM,WAAW,eAAe;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;CACpC;AAk8BD,4CAA4C;AAC5C,eAAO,MAAM,kBAAkB,EAAE,eAAe,EAoC/C,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,EAAE,eAAe,EA+E9C,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,eAAe,EAAkD,CAAC;AAElG,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,CAS9D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAInE;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAKzF;AAED,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C"}