@wrongstack/cli 0.296.2 → 0.296.3

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 (59) hide show
  1. package/dist/boot/dispatch-webui.d.ts +1 -0
  2. package/dist/boot/dispatch-webui.d.ts.map +1 -1
  3. package/dist/boot/tui-session-resume.d.ts.map +1 -1
  4. package/dist/{chunk-IN4GXGYW.js → chunk-BQCAJ7FI.js} +2 -2
  5. package/dist/{chunk-IN4GXGYW.js.map → chunk-BQCAJ7FI.js.map} +2 -2
  6. package/dist/{chunk-X5DQTPXT.js → chunk-OI7GWJDS.js} +1048 -804
  7. package/dist/chunk-OI7GWJDS.js.map +7 -0
  8. package/dist/{cli-main-6AU6E4XZ.js → cli-main-RTY35OPD.js} +196 -54
  9. package/dist/cli-main-RTY35OPD.js.map +7 -0
  10. package/dist/cli-main.d.ts.map +1 -1
  11. package/dist/execute-deps.d.ts +1 -0
  12. package/dist/execute-deps.d.ts.map +1 -1
  13. package/dist/{execution-V26SE52F.js → execution-O7I5DYE6.js} +34 -8
  14. package/dist/execution-O7I5DYE6.js.map +7 -0
  15. package/dist/execution-storage-observability.d.ts.map +1 -1
  16. package/dist/execution.d.ts.map +1 -1
  17. package/dist/fleet/host-subagent-factory.d.ts.map +1 -1
  18. package/dist/{hq-BECGICEZ.js → hq-JUYKUNJX.js} +2 -2
  19. package/dist/hq-server/auth.d.ts +15 -4
  20. package/dist/hq-server/auth.d.ts.map +1 -1
  21. package/dist/hq-server/routes/auth-handlers.d.ts +6 -13
  22. package/dist/hq-server/routes/auth-handlers.d.ts.map +1 -1
  23. package/dist/hq-server/routes.d.ts +6 -4
  24. package/dist/hq-server/routes.d.ts.map +1 -1
  25. package/dist/hq-server/snapshot.d.ts +44 -0
  26. package/dist/hq-server/snapshot.d.ts.map +1 -1
  27. package/dist/hq-server/types.d.ts +22 -4
  28. package/dist/hq-server/types.d.ts.map +1 -1
  29. package/dist/hq-server/utils.d.ts +8 -0
  30. package/dist/hq-server/utils.d.ts.map +1 -1
  31. package/dist/hq-server/ws.d.ts +1 -1
  32. package/dist/hq-server/ws.d.ts.map +1 -1
  33. package/dist/{hq-server-FJOVOERO.js → hq-server-6AQ3BXZA.js} +2 -2
  34. package/dist/hq-server.d.ts +3 -3
  35. package/dist/hq-server.d.ts.map +1 -1
  36. package/dist/{hq-tunnel-YZLRONPV.js → hq-tunnel-RFKGC4HI.js} +8 -5
  37. package/dist/{hq-tunnel-YZLRONPV.js.map → hq-tunnel-RFKGC4HI.js.map} +2 -2
  38. package/dist/hq-tunnel.d.ts +1 -1
  39. package/dist/hq-tunnel.d.ts.map +1 -1
  40. package/dist/index.js +5 -5
  41. package/dist/{sdd-runtime-IKPROVV2.js → sdd-runtime-JG4EEKL6.js} +2 -2
  42. package/dist/services/sdd/task-manager.d.ts.map +1 -1
  43. package/dist/slash-commands/settings.d.ts.map +1 -1
  44. package/dist/{webui-server-G3TISUIY.js → webui-server-ZF5KVGC5.js} +3 -2
  45. package/dist/webui-server-ZF5KVGC5.js.map +7 -0
  46. package/dist/webui-server-options.d.ts +2 -0
  47. package/dist/webui-server-options.d.ts.map +1 -1
  48. package/dist/webui-server.d.ts.map +1 -1
  49. package/dist/wiring/sage.d.ts.map +1 -1
  50. package/dist/wiring/session.d.ts +3 -1
  51. package/dist/wiring/session.d.ts.map +1 -1
  52. package/package.json +22 -22
  53. package/dist/chunk-X5DQTPXT.js.map +0 -7
  54. package/dist/cli-main-6AU6E4XZ.js.map +0 -7
  55. package/dist/execution-V26SE52F.js.map +0 -7
  56. package/dist/webui-server-G3TISUIY.js.map +0 -7
  57. /package/dist/{hq-BECGICEZ.js.map → hq-JUYKUNJX.js.map} +0 -0
  58. /package/dist/{hq-server-FJOVOERO.js.map → hq-server-6AQ3BXZA.js.map} +0 -0
  59. /package/dist/{sdd-runtime-IKPROVV2.js.map → sdd-runtime-JG4EEKL6.js.map} +0 -0
@@ -66,6 +66,7 @@ export interface WebUIDispatchContext {
66
66
  }) => void) | undefined;
67
67
  onModelContextResolved?: ((providerId: string, modelId: string, maxContext: number) => void) | undefined;
68
68
  activateSessionIdentity?: ((sessionId: string, target?: import('../wiring/session-registry.js').SessionIdentityTarget) => Promise<void>) | undefined;
69
+ rebindTodosCheckpoint?: ((sessionId: string, sessionsDir?: string) => void | Promise<void>) | undefined;
69
70
  /** Read-only worker transcript snapshot used for browser refresh replay. */
70
71
  agentTranscripts?: {
71
72
  getAllSessions(): import('@wrongstack/core/coordination').AgentVirtualSession[];
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-webui.d.ts","sourceRoot":"","sources":["../../src/boot/dispatch-webui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dispatch-webui.d.ts","sourceRoot":"","sources":["../../src/boot/dispatch-webui.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tui-session-resume.d.ts","sourceRoot":"","sources":["../../src/boot/tui-session-resume.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,YAAY,CAAC;IAC3B,sBAAsB,EAClB,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GAClF,SAAS,CAAC;IACd,wFAAwF;IACxF,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,oBAAoB,EACzB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CA0PrC"}
1
+ {"version":3,"file":"tui-session-resume.d.ts","sourceRoot":"","sources":["../../src/boot/tui-session-resume.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,YAAY,CAAC;IAC3B,sBAAsB,EAClB,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GAClF,SAAS,CAAC;IACd,wFAAwF;IACxF,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,oBAAoB,EACzB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CA2PrC"}
@@ -264,7 +264,7 @@ async function trySaveTasksFromAIOutput(aiOutput) {
264
264
  sddState.setTaskStore(store);
265
265
  sddState.setTaskTracker(tracker);
266
266
  sddState.setTaskGraphId(graph.id);
267
- builder.setTaskGraphId(graph.id);
267
+ await builder.setTaskGraphId(graph.id);
268
268
  return true;
269
269
  }
270
270
  function getTaskProgress() {
@@ -422,4 +422,4 @@ export {
422
422
  getTaskGraphId,
423
423
  getTaskTrackerExport
424
424
  };
425
- //# sourceMappingURL=chunk-IN4GXGYW.js.map
425
+ //# sourceMappingURL=chunk-BQCAJ7FI.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/services/sdd/state.ts", "../src/services/sdd/project-context.ts", "../src/services/sdd/spec-detection.ts", "../src/services/sdd/task-manager.ts"],
4
- "sourcesContent": ["import type { Context } from '@wrongstack/core/agent';\nimport {\n type AISpecBuilder,\n type AISpecPhase,\n type DefaultTaskStore,\n SpecVersioning,\n type TaskTracker,\n} from '@wrongstack/sdd';\n\n/** Key used to store SDD session state in ctx.meta for session isolation. */\nexport const SDD_META_KEY = 'sdd.state';\n\n/** Single shared SDD session state for the process lifetime. */\nexport class SDDState {\n private builder: AISpecBuilder | null = null;\n private taskStore: DefaultTaskStore | null = null;\n private taskTracker: TaskTracker | null = null;\n private taskGraphId: string | null = null;\n private sessionStartTime: number = Date.now();\n private phaseStartTime: number = Date.now();\n private versioning: SpecVersioning | null = null;\n\n getBuilder(): AISpecBuilder | null {\n return this.builder;\n }\n setBuilder(b: AISpecBuilder | null) {\n this.builder = b;\n }\n getTaskStore(): DefaultTaskStore | null {\n return this.taskStore;\n }\n setTaskStore(s: DefaultTaskStore | null) {\n this.taskStore = s;\n }\n getTaskTracker(): TaskTracker | null {\n return this.taskTracker;\n }\n setTaskTracker(t: TaskTracker | null) {\n this.taskTracker = t;\n }\n getTaskGraphId(): string | null {\n return this.taskGraphId;\n }\n setTaskGraphId(id: string | null) {\n this.taskGraphId = id;\n }\n getSessionStartTime(): number {\n return this.sessionStartTime;\n }\n setSessionStartTime(t: number) {\n this.sessionStartTime = t;\n }\n setPhaseStartTime(t: number) {\n this.phaseStartTime = t;\n }\n getPhaseStartTime(): number {\n return this.phaseStartTime;\n }\n getSessionElapsed(): number {\n return Date.now() - this.sessionStartTime;\n }\n getPhaseElapsed(): number {\n return Date.now() - this.phaseStartTime;\n }\n getVersioning(): SpecVersioning {\n if (this.versioning === null) this.versioning = new SpecVersioning();\n return this.versioning;\n }\n\n clearTaskState(): void {\n this.taskStore = null;\n this.taskTracker = null;\n this.taskGraphId = null;\n }\n\n getContext(): string | null {\n if (!this.builder) return null;\n const session = this.builder.getSession();\n if (session.phase === 'done') return null;\n return this.builder.getAIPrompt();\n }\n\n getPhase(): AISpecPhase | null {\n return this.builder?.getPhase() ?? null;\n }\n}\n\n/** Process-lifetime singleton \u2014 used when no Context is available (CLI single-session mode). */\nexport const sddState = new SDDState();\n\n/**\n * Get or create the SDD state for the current session.\n * Uses ctx.meta so each concurrent browser/REPL session has isolated state.\n */\nexport function getSessionState(ctx: Context | undefined): SDDState {\n if (!ctx) return sddState;\n let state = ctx.meta[SDD_META_KEY] as SDDState | undefined;\n if (!state) {\n state = new SDDState();\n ctx.meta[SDD_META_KEY] = state;\n }\n return state;\n}\n", "import type { AISpecBuilder, AISpecPhase, SpecIndexEntry, SpecStore } from '@wrongstack/sdd';\n// Shared with the WebUI wizard \u2014 single implementation in @wrongstack/sdd.\nexport { gatherProjectContext } from '@wrongstack/sdd';\nimport { sddState } from './state.js';\n\nexport function getActiveBuilder(): AISpecBuilder | null {\n return sddState.getBuilder();\n}\n\nexport function getActiveSDDContext(): string | null {\n return sddState.getContext();\n}\n\nexport function getActiveSDDPhase(): AISpecPhase | null {\n return sddState.getPhase();\n}\n\nexport async function findSpec(store: SpecStore, idOrTitle: string) {\n if (!idOrTitle) return null;\n const byId = await store.load(idOrTitle);\n if (byId) return byId;\n const all = await store.list();\n const match = all.find(\n (e: SpecIndexEntry) =>\n e.id.startsWith(idOrTitle) || e.title.toLowerCase().includes(idOrTitle.toLowerCase()),\n );\n if (match) return store.load(match.id);\n return null;\n}\n", "import { sddState } from './state.js';\n\n/**\n * Returns true if the text looks like conversational/explanatory output\n * rather than a structured implementation plan.\n */\nexport function isExplanatoryText(text: string): boolean {\n const lower = text.toLowerCase();\n return (\n lower.startsWith(\"i'\") ||\n lower.startsWith('i will') ||\n lower.startsWith('let me') ||\n lower.startsWith(\"here's my\") ||\n lower.startsWith('here is my') ||\n lower.startsWith(\"i'm going to\") ||\n lower.startsWith('first, let me') ||\n lower.startsWith('sure') ||\n lower.startsWith('of course') ||\n lower.startsWith('okay') ||\n lower.startsWith('ok,') ||\n lower.startsWith('sounds good') ||\n lower.startsWith('no problem') ||\n (text.split('\\n').length < 3 && !text.includes('.'))\n );\n}\n\n/**\n * Parse a spec from AI output text and save it to the active session.\n * Returns true if a spec was found and saved.\n */\nexport async function trySaveSpecFromAIOutput(aiOutput: string): Promise<boolean> {\n const builder = sddState.getBuilder();\n if (!builder) return false;\n const spec = builder.tryParseSpecFromOutput(aiOutput);\n if (!spec) return false;\n builder.setSpec(spec);\n return true;\n}\n\n/**\n * Try to save implementation plan from AI output during implementation phase.\n * Returns true if a plan was saved.\n */\nexport function trySaveImplementationPlan(aiOutput: string): boolean {\n const builder = sddState.getBuilder();\n if (!builder) return false;\n const session = builder.getSession();\n if (session.phase !== 'implementation') return false;\n\n const current = session.implementation ?? '';\n\n const jsonMatch = aiOutput.match(/```json\\s*\\[/);\n if (jsonMatch?.index && jsonMatch.index > 0) {\n const plan = aiOutput.substring(0, jsonMatch.index).trim();\n if (plan.length > 50 && plan !== current && !isExplanatoryText(plan)) {\n builder.setImplementation(plan);\n return true;\n }\n }\n\n if (\n aiOutput.length > 100 &&\n !aiOutput.includes('```json') &&\n aiOutput !== current &&\n !isExplanatoryText(aiOutput)\n ) {\n builder.setImplementation(aiOutput.trim());\n return true;\n }\n\n return false;\n}\n\n/**\n * Auto-detect task completion patterns in AI output and mark tasks.\n * Returns the number of tasks marked as completed.\n */\nexport function autoDetectTaskCompletion(aiOutput: string): number {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return 0;\n const pending = tracker.getAllNodes({ status: ['pending', 'in_progress'] });\n if (pending.length === 0) return 0;\n\n let completed = 0;\n const lines = aiOutput.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n const sddDoneMatch = trimmed.match(/\\/sdd\\s+done\\s+(.+)/i);\n if (sddDoneMatch?.[1]) {\n const target = sddDoneMatch[1].trim();\n const num = Number(target);\n if (!Number.isNaN(num) && num >= 1 && num <= pending.length) {\n const node = pending[num - 1];\n if (node && node.status !== 'completed') {\n tracker.updateNodeStatus(node.id, 'completed');\n completed++;\n }\n } else {\n const match = pending.find(\n (n) =>\n n.title.toLowerCase().includes(target.toLowerCase()) ||\n target.toLowerCase().includes(n.title.toLowerCase()),\n );\n if (match && match.status !== 'completed') {\n tracker.updateNodeStatus(match.id, 'completed');\n completed++;\n }\n }\n continue;\n }\n\n const checkmarkMatch = trimmed.match(/^\u2705\\s*(?:Task:\\s*)?(.+)/i);\n if (checkmarkMatch?.[1]) {\n const title = checkmarkMatch[1].trim();\n const match = pending.find(\n (n) =>\n n.title.toLowerCase().includes(title.toLowerCase()) ||\n title.toLowerCase().includes(n.title.toLowerCase()),\n );\n if (match && match.status !== 'completed') {\n tracker.updateNodeStatus(match.id, 'completed');\n completed++;\n }\n continue;\n }\n\n const taskNumMatch = trimmed.match(/Task\\s+(\\d+)\\s*[:]\\s*(?:complete|done|finished)/i);\n if (taskNumMatch?.[1]) {\n const num = Number(taskNumMatch[1]);\n if (num >= 1 && num <= pending.length) {\n const node = pending[num - 1];\n if (node && node.status !== 'completed') {\n tracker.updateNodeStatus(node.id, 'completed');\n completed++;\n }\n }\n continue;\n }\n\n const completedMatch = trimmed.match(/^(?:Completed|Done|Finished)\\s*[:]\\s*(.+)/i);\n if (completedMatch?.[1]) {\n const title = completedMatch[1].trim();\n const match = pending.find(\n (n) =>\n n.title.toLowerCase().includes(title.toLowerCase()) ||\n title.toLowerCase().includes(n.title.toLowerCase()),\n );\n if (match && match.status !== 'completed') {\n tracker.updateNodeStatus(match.id, 'completed');\n completed++;\n }\n }\n }\n\n return completed;\n}\n", "import { expectDefined } from '@wrongstack/core/utils';\nimport type { TaskProgress } from '@wrongstack/core/types';\nimport { DefaultTaskStore, renderProgress, TaskTracker } from '@wrongstack/sdd';\nimport { sddState } from './state.js';\n\nexport type { TaskProgress };\nexport { renderProgress };\n\n/**\n * Format elapsed milliseconds as a human-readable string.\n */\nexport function formatElapsed(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n const remS = s % 60;\n if (m < 60) return remS > 0 ? `${m}m ${remS}s` : `${m}m`;\n const h = Math.floor(m / 60);\n const remM = m % 60;\n return `${h}h ${remM}m`;\n}\n\nfunction addTaskToTracker(tracker: TaskTracker, task: Record<string, unknown>): void {\n tracker.addNode({\n title: String(task.title),\n description: String(task.description ?? ''),\n type: (['feature', 'bugfix', 'refactor', 'docs', 'test', 'chore'].includes(String(task.type))\n ? String(task.type)\n : 'feature') as 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore',\n priority: (['critical', 'high', 'medium', 'low'].includes(String(task.priority))\n ? String(task.priority)\n : 'medium') as 'critical' | 'high' | 'medium' | 'low',\n status: 'pending',\n estimateHours: Number(task.estimateHours) || 2,\n tags: Array.isArray(task.tags) ? task.tags.map(String) : [],\n });\n}\n\nexport async function trySaveTasksFromAIOutput(aiOutput: string): Promise<boolean> {\n const builder = sddState.getBuilder();\n if (!builder) return false;\n const session = builder.getSession();\n if (!session.spec) return false;\n\n const json = builder.extractJSONArray(aiOutput);\n if (!json) return false;\n\n let tasks: Array<Record<string, unknown>>;\n try {\n tasks = JSON.parse(json);\n } catch {\n return false;\n }\n if (!Array.isArray(tasks) || tasks.length === 0) return false;\n\n const validTasks = tasks.filter(\n (t) => t && typeof t === 'object' && typeof t.title === 'string' && t.title.length > 0,\n );\n if (validTasks.length === 0) return false;\n\n const existingTracker = sddState.getTaskTracker();\n if (existingTracker) {\n for (const task of validTasks) addTaskToTracker(existingTracker, task);\n return true;\n }\n\n const store = new DefaultTaskStore();\n const tracker = new TaskTracker({ store });\n const graph = await tracker.createGraph(session.spec.id, session.spec.title);\n for (const task of validTasks) addTaskToTracker(tracker, task);\n sddState.setTaskStore(store);\n sddState.setTaskTracker(tracker);\n sddState.setTaskGraphId(graph.id);\n builder.setTaskGraphId(graph.id);\n return true;\n}\n\nexport function getTaskProgress(): TaskProgress | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n return tracker.getProgress();\n}\n\nexport function getCurrentTask(): {\n id: string;\n title: string;\n description: string;\n priority: string;\n estimateHours: number;\n tags: string[];\n startedAt: number | undefined;\n} | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n const nodes = tracker.getAllNodes({ status: ['in_progress'] });\n if (nodes.length === 0) return null;\n const n = expectDefined(nodes[0]);\n return {\n id: n.id,\n title: n.title,\n description: n.description,\n priority: n.priority,\n estimateHours: n.estimateHours ?? 0,\n tags: n.tags ?? [],\n startedAt: n.startedAt,\n };\n}\n\nexport function advanceToNextTask(): boolean {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return false;\n const pending = tracker.getAllNodes({ status: ['pending'] });\n for (const n of pending) {\n if (tracker.canStart(n.id)) {\n tracker.updateNodeStatus(n.id, 'in_progress');\n return true;\n }\n }\n return false;\n}\n\nexport function getTaskListText(): string | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n const nodes = tracker.getAllNodes();\n if (nodes.length === 0) return null;\n return nodes\n .map((n, i) => {\n const status = n.status === 'completed' ? '\u2705' : n.status === 'in_progress' ? '\uD83D\uDD04' : '\u23F3';\n return `${i + 1}. ${status} [${n.priority}] ${n.title}`;\n })\n .join('\\n');\n}\n\nexport function renderTaskListWithProgress(): string | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n const nodes = tracker.getAllNodes();\n if (nodes.length === 0) return null;\n\n const progress = tracker.getProgress();\n const phase = sddState.getPhase();\n const phaseLabel: Record<string, string> = {\n questioning: '\u2753 Questioning',\n spec_review: '\uD83D\uDCCB Spec Review',\n implementation: '\uD83C\uDFD7\uFE0F Implementation',\n task_review: '\uD83D\uDCDD Task Review',\n executing: '\u26A1 Executing',\n done: '\u2705 Done',\n };\n const lines = [\n `**${phaseLabel[phase ?? ''] ?? phase} \u2014 Task Status**`,\n '',\n renderProgress(progress),\n '',\n ];\n\n const sorted = [...nodes].sort((a, b) => {\n const order: Record<string, number> = {\n in_progress: 0,\n pending: 1,\n review: 2,\n blocked: 3,\n failed: 4,\n completed: 5,\n };\n return (order[a.status] ?? 6) - (order[b.status] ?? 6);\n });\n for (let i = 0; i < sorted.length; i++) {\n const n = expectDefined(sorted[i]);\n const status =\n n.status === 'completed'\n ? '\u2705'\n : n.status === 'in_progress'\n ? '\uD83D\uDD04'\n : n.status === 'failed'\n ? '\u274C'\n : n.status === 'blocked'\n ? '\uD83D\uDEAB'\n : n.status === 'review'\n ? '\uD83D\uDC41'\n : '\u23F3';\n const title = n.title.length > 50 ? n.title.slice(0, 49) + '\u2026' : n.title;\n let elapsed = '';\n if (n.status === 'in_progress' && n.startedAt)\n elapsed = ` \u00B7 ${formatElapsed(Date.now() - n.startedAt)}`;\n lines.push(`${i + 1}. ${status} ${title}${elapsed}`);\n }\n return lines.join('\\n');\n}\n\nexport function getCurrentExecutingContext(): string | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n const nodes = tracker.getAllNodes({ status: ['in_progress'] });\n if (nodes.length === 0) return null;\n const n = expectDefined(nodes[0]);\n const elapsed = n.startedAt ? ` \u00B7 elapsed: ${formatElapsed(Date.now() - n.startedAt)}` : '';\n const progress = tracker.getProgress();\n return [\n `**NOW EXECUTING:** \"${n.title}\"${elapsed}`,\n `Description: ${n.description.split('\\n')[0] ?? '(none)'}`,\n `Priority: ${n.priority} \u00B7 Est: ${n.estimateHours ?? 0}h \u00B7 Tags: ${(n.tags ?? []).join(', ') || 'none'}`,\n `Progress: ${progress.completed}/${progress.total} tasks (${progress.percentComplete}%)`,\n ].join('\\n');\n}\n\n/**\n * Resolve a `/sdd done|skip|fail|review <N|title>` argument to a single task\n * node. Tries a 1-based index into the given (already filtered/sorted) node\n * list first, then a bidirectional case-insensitive title-substring match.\n * Centralizes the matching the four mutation subcommands used to duplicate.\n */\nexport function matchTaskNode<T extends { id: string; title: string }>(\n nodes: T[],\n query: string,\n): T | null {\n const trimmed = query.trim();\n if (!trimmed) return null;\n const num = Number(trimmed);\n if (!Number.isNaN(num) && num >= 1 && num <= nodes.length) {\n return nodes[num - 1] ?? null;\n }\n const q = trimmed.toLowerCase();\n return (\n nodes.find((n) => n.title.toLowerCase().includes(q) || q.includes(n.title.toLowerCase())) ??\n null\n );\n}\n\nexport function markTaskCompleted(taskTitle: string): boolean {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return false;\n const nodes = tracker.getAllNodes({ status: ['pending', 'in_progress'] });\n const match = nodes.find(\n (n) =>\n n.title.toLowerCase().includes(taskTitle.toLowerCase()) ||\n taskTitle.toLowerCase().includes(n.title.toLowerCase()),\n );\n if (!match) return false;\n tracker.updateNodeStatus(match.id, 'completed');\n return true;\n}\n\nexport function getTaskGraphId(): string | null {\n return sddState.getTaskGraphId();\n}\nexport function getTaskTrackerExport(): TaskTracker | null {\n return sddState.getTaskTracker();\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Context } from '@wrongstack/core/agent';\nimport {\n type AISpecBuilder,\n type AISpecPhase,\n type DefaultTaskStore,\n SpecVersioning,\n type TaskTracker,\n} from '@wrongstack/sdd';\n\n/** Key used to store SDD session state in ctx.meta for session isolation. */\nexport const SDD_META_KEY = 'sdd.state';\n\n/** Single shared SDD session state for the process lifetime. */\nexport class SDDState {\n private builder: AISpecBuilder | null = null;\n private taskStore: DefaultTaskStore | null = null;\n private taskTracker: TaskTracker | null = null;\n private taskGraphId: string | null = null;\n private sessionStartTime: number = Date.now();\n private phaseStartTime: number = Date.now();\n private versioning: SpecVersioning | null = null;\n\n getBuilder(): AISpecBuilder | null {\n return this.builder;\n }\n setBuilder(b: AISpecBuilder | null) {\n this.builder = b;\n }\n getTaskStore(): DefaultTaskStore | null {\n return this.taskStore;\n }\n setTaskStore(s: DefaultTaskStore | null) {\n this.taskStore = s;\n }\n getTaskTracker(): TaskTracker | null {\n return this.taskTracker;\n }\n setTaskTracker(t: TaskTracker | null) {\n this.taskTracker = t;\n }\n getTaskGraphId(): string | null {\n return this.taskGraphId;\n }\n setTaskGraphId(id: string | null) {\n this.taskGraphId = id;\n }\n getSessionStartTime(): number {\n return this.sessionStartTime;\n }\n setSessionStartTime(t: number) {\n this.sessionStartTime = t;\n }\n setPhaseStartTime(t: number) {\n this.phaseStartTime = t;\n }\n getPhaseStartTime(): number {\n return this.phaseStartTime;\n }\n getSessionElapsed(): number {\n return Date.now() - this.sessionStartTime;\n }\n getPhaseElapsed(): number {\n return Date.now() - this.phaseStartTime;\n }\n getVersioning(): SpecVersioning {\n if (this.versioning === null) this.versioning = new SpecVersioning();\n return this.versioning;\n }\n\n clearTaskState(): void {\n this.taskStore = null;\n this.taskTracker = null;\n this.taskGraphId = null;\n }\n\n getContext(): string | null {\n if (!this.builder) return null;\n const session = this.builder.getSession();\n if (session.phase === 'done') return null;\n return this.builder.getAIPrompt();\n }\n\n getPhase(): AISpecPhase | null {\n return this.builder?.getPhase() ?? null;\n }\n}\n\n/** Process-lifetime singleton \u2014 used when no Context is available (CLI single-session mode). */\nexport const sddState = new SDDState();\n\n/**\n * Get or create the SDD state for the current session.\n * Uses ctx.meta so each concurrent browser/REPL session has isolated state.\n */\nexport function getSessionState(ctx: Context | undefined): SDDState {\n if (!ctx) return sddState;\n let state = ctx.meta[SDD_META_KEY] as SDDState | undefined;\n if (!state) {\n state = new SDDState();\n ctx.meta[SDD_META_KEY] = state;\n }\n return state;\n}\n", "import type { AISpecBuilder, AISpecPhase, SpecIndexEntry, SpecStore } from '@wrongstack/sdd';\n// Shared with the WebUI wizard \u2014 single implementation in @wrongstack/sdd.\nexport { gatherProjectContext } from '@wrongstack/sdd';\nimport { sddState } from './state.js';\n\nexport function getActiveBuilder(): AISpecBuilder | null {\n return sddState.getBuilder();\n}\n\nexport function getActiveSDDContext(): string | null {\n return sddState.getContext();\n}\n\nexport function getActiveSDDPhase(): AISpecPhase | null {\n return sddState.getPhase();\n}\n\nexport async function findSpec(store: SpecStore, idOrTitle: string) {\n if (!idOrTitle) return null;\n const byId = await store.load(idOrTitle);\n if (byId) return byId;\n const all = await store.list();\n const match = all.find(\n (e: SpecIndexEntry) =>\n e.id.startsWith(idOrTitle) || e.title.toLowerCase().includes(idOrTitle.toLowerCase()),\n );\n if (match) return store.load(match.id);\n return null;\n}\n", "import { sddState } from './state.js';\n\n/**\n * Returns true if the text looks like conversational/explanatory output\n * rather than a structured implementation plan.\n */\nexport function isExplanatoryText(text: string): boolean {\n const lower = text.toLowerCase();\n return (\n lower.startsWith(\"i'\") ||\n lower.startsWith('i will') ||\n lower.startsWith('let me') ||\n lower.startsWith(\"here's my\") ||\n lower.startsWith('here is my') ||\n lower.startsWith(\"i'm going to\") ||\n lower.startsWith('first, let me') ||\n lower.startsWith('sure') ||\n lower.startsWith('of course') ||\n lower.startsWith('okay') ||\n lower.startsWith('ok,') ||\n lower.startsWith('sounds good') ||\n lower.startsWith('no problem') ||\n (text.split('\\n').length < 3 && !text.includes('.'))\n );\n}\n\n/**\n * Parse a spec from AI output text and save it to the active session.\n * Returns true if a spec was found and saved.\n */\nexport async function trySaveSpecFromAIOutput(aiOutput: string): Promise<boolean> {\n const builder = sddState.getBuilder();\n if (!builder) return false;\n const spec = builder.tryParseSpecFromOutput(aiOutput);\n if (!spec) return false;\n builder.setSpec(spec);\n return true;\n}\n\n/**\n * Try to save implementation plan from AI output during implementation phase.\n * Returns true if a plan was saved.\n */\nexport function trySaveImplementationPlan(aiOutput: string): boolean {\n const builder = sddState.getBuilder();\n if (!builder) return false;\n const session = builder.getSession();\n if (session.phase !== 'implementation') return false;\n\n const current = session.implementation ?? '';\n\n const jsonMatch = aiOutput.match(/```json\\s*\\[/);\n if (jsonMatch?.index && jsonMatch.index > 0) {\n const plan = aiOutput.substring(0, jsonMatch.index).trim();\n if (plan.length > 50 && plan !== current && !isExplanatoryText(plan)) {\n builder.setImplementation(plan);\n return true;\n }\n }\n\n if (\n aiOutput.length > 100 &&\n !aiOutput.includes('```json') &&\n aiOutput !== current &&\n !isExplanatoryText(aiOutput)\n ) {\n builder.setImplementation(aiOutput.trim());\n return true;\n }\n\n return false;\n}\n\n/**\n * Auto-detect task completion patterns in AI output and mark tasks.\n * Returns the number of tasks marked as completed.\n */\nexport function autoDetectTaskCompletion(aiOutput: string): number {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return 0;\n const pending = tracker.getAllNodes({ status: ['pending', 'in_progress'] });\n if (pending.length === 0) return 0;\n\n let completed = 0;\n const lines = aiOutput.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n const sddDoneMatch = trimmed.match(/\\/sdd\\s+done\\s+(.+)/i);\n if (sddDoneMatch?.[1]) {\n const target = sddDoneMatch[1].trim();\n const num = Number(target);\n if (!Number.isNaN(num) && num >= 1 && num <= pending.length) {\n const node = pending[num - 1];\n if (node && node.status !== 'completed') {\n tracker.updateNodeStatus(node.id, 'completed');\n completed++;\n }\n } else {\n const match = pending.find(\n (n) =>\n n.title.toLowerCase().includes(target.toLowerCase()) ||\n target.toLowerCase().includes(n.title.toLowerCase()),\n );\n if (match && match.status !== 'completed') {\n tracker.updateNodeStatus(match.id, 'completed');\n completed++;\n }\n }\n continue;\n }\n\n const checkmarkMatch = trimmed.match(/^\u2705\\s*(?:Task:\\s*)?(.+)/i);\n if (checkmarkMatch?.[1]) {\n const title = checkmarkMatch[1].trim();\n const match = pending.find(\n (n) =>\n n.title.toLowerCase().includes(title.toLowerCase()) ||\n title.toLowerCase().includes(n.title.toLowerCase()),\n );\n if (match && match.status !== 'completed') {\n tracker.updateNodeStatus(match.id, 'completed');\n completed++;\n }\n continue;\n }\n\n const taskNumMatch = trimmed.match(/Task\\s+(\\d+)\\s*[:]\\s*(?:complete|done|finished)/i);\n if (taskNumMatch?.[1]) {\n const num = Number(taskNumMatch[1]);\n if (num >= 1 && num <= pending.length) {\n const node = pending[num - 1];\n if (node && node.status !== 'completed') {\n tracker.updateNodeStatus(node.id, 'completed');\n completed++;\n }\n }\n continue;\n }\n\n const completedMatch = trimmed.match(/^(?:Completed|Done|Finished)\\s*[:]\\s*(.+)/i);\n if (completedMatch?.[1]) {\n const title = completedMatch[1].trim();\n const match = pending.find(\n (n) =>\n n.title.toLowerCase().includes(title.toLowerCase()) ||\n title.toLowerCase().includes(n.title.toLowerCase()),\n );\n if (match && match.status !== 'completed') {\n tracker.updateNodeStatus(match.id, 'completed');\n completed++;\n }\n }\n }\n\n return completed;\n}\n", "import { expectDefined } from '@wrongstack/core/utils';\nimport type { TaskProgress } from '@wrongstack/core/types';\nimport { DefaultTaskStore, renderProgress, TaskTracker } from '@wrongstack/sdd';\nimport { sddState } from './state.js';\n\nexport type { TaskProgress };\nexport { renderProgress };\n\n/**\n * Format elapsed milliseconds as a human-readable string.\n */\nexport function formatElapsed(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n const remS = s % 60;\n if (m < 60) return remS > 0 ? `${m}m ${remS}s` : `${m}m`;\n const h = Math.floor(m / 60);\n const remM = m % 60;\n return `${h}h ${remM}m`;\n}\n\nfunction addTaskToTracker(tracker: TaskTracker, task: Record<string, unknown>): void {\n tracker.addNode({\n title: String(task.title),\n description: String(task.description ?? ''),\n type: (['feature', 'bugfix', 'refactor', 'docs', 'test', 'chore'].includes(String(task.type))\n ? String(task.type)\n : 'feature') as 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore',\n priority: (['critical', 'high', 'medium', 'low'].includes(String(task.priority))\n ? String(task.priority)\n : 'medium') as 'critical' | 'high' | 'medium' | 'low',\n status: 'pending',\n estimateHours: Number(task.estimateHours) || 2,\n tags: Array.isArray(task.tags) ? task.tags.map(String) : [],\n });\n}\n\nexport async function trySaveTasksFromAIOutput(aiOutput: string): Promise<boolean> {\n const builder = sddState.getBuilder();\n if (!builder) return false;\n const session = builder.getSession();\n if (!session.spec) return false;\n\n const json = builder.extractJSONArray(aiOutput);\n if (!json) return false;\n\n let tasks: Array<Record<string, unknown>>;\n try {\n tasks = JSON.parse(json);\n } catch {\n return false;\n }\n if (!Array.isArray(tasks) || tasks.length === 0) return false;\n\n const validTasks = tasks.filter(\n (t) => t && typeof t === 'object' && typeof t.title === 'string' && t.title.length > 0,\n );\n if (validTasks.length === 0) return false;\n\n const existingTracker = sddState.getTaskTracker();\n if (existingTracker) {\n for (const task of validTasks) addTaskToTracker(existingTracker, task);\n return true;\n }\n\n const store = new DefaultTaskStore();\n const tracker = new TaskTracker({ store });\n const graph = await tracker.createGraph(session.spec.id, session.spec.title);\n for (const task of validTasks) addTaskToTracker(tracker, task);\n sddState.setTaskStore(store);\n sddState.setTaskTracker(tracker);\n sddState.setTaskGraphId(graph.id);\n // Fire-and-forget save is unsafe here \u2014 `setTaskGraphId` is awaited precisely\n // because the next mutation or caller's own `await saveSession()` must not\n // race a stale fire-and-forget rename that silently reverts the persisted\n // taskGraphId. The awaited save ensures the persisted snapshot matches\n // sddState.setTaskGraphId before this function returns.\n await builder.setTaskGraphId(graph.id);\n return true;\n}\n\nexport function getTaskProgress(): TaskProgress | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n return tracker.getProgress();\n}\n\nexport function getCurrentTask(): {\n id: string;\n title: string;\n description: string;\n priority: string;\n estimateHours: number;\n tags: string[];\n startedAt: number | undefined;\n} | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n const nodes = tracker.getAllNodes({ status: ['in_progress'] });\n if (nodes.length === 0) return null;\n const n = expectDefined(nodes[0]);\n return {\n id: n.id,\n title: n.title,\n description: n.description,\n priority: n.priority,\n estimateHours: n.estimateHours ?? 0,\n tags: n.tags ?? [],\n startedAt: n.startedAt,\n };\n}\n\nexport function advanceToNextTask(): boolean {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return false;\n const pending = tracker.getAllNodes({ status: ['pending'] });\n for (const n of pending) {\n if (tracker.canStart(n.id)) {\n tracker.updateNodeStatus(n.id, 'in_progress');\n return true;\n }\n }\n return false;\n}\n\nexport function getTaskListText(): string | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n const nodes = tracker.getAllNodes();\n if (nodes.length === 0) return null;\n return nodes\n .map((n, i) => {\n const status = n.status === 'completed' ? '\u2705' : n.status === 'in_progress' ? '\uD83D\uDD04' : '\u23F3';\n return `${i + 1}. ${status} [${n.priority}] ${n.title}`;\n })\n .join('\\n');\n}\n\nexport function renderTaskListWithProgress(): string | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n const nodes = tracker.getAllNodes();\n if (nodes.length === 0) return null;\n\n const progress = tracker.getProgress();\n const phase = sddState.getPhase();\n const phaseLabel: Record<string, string> = {\n questioning: '\u2753 Questioning',\n spec_review: '\uD83D\uDCCB Spec Review',\n implementation: '\uD83C\uDFD7\uFE0F Implementation',\n task_review: '\uD83D\uDCDD Task Review',\n executing: '\u26A1 Executing',\n done: '\u2705 Done',\n };\n const lines = [\n `**${phaseLabel[phase ?? ''] ?? phase} \u2014 Task Status**`,\n '',\n renderProgress(progress),\n '',\n ];\n\n const sorted = [...nodes].sort((a, b) => {\n const order: Record<string, number> = {\n in_progress: 0,\n pending: 1,\n review: 2,\n blocked: 3,\n failed: 4,\n completed: 5,\n };\n return (order[a.status] ?? 6) - (order[b.status] ?? 6);\n });\n for (let i = 0; i < sorted.length; i++) {\n const n = expectDefined(sorted[i]);\n const status =\n n.status === 'completed'\n ? '\u2705'\n : n.status === 'in_progress'\n ? '\uD83D\uDD04'\n : n.status === 'failed'\n ? '\u274C'\n : n.status === 'blocked'\n ? '\uD83D\uDEAB'\n : n.status === 'review'\n ? '\uD83D\uDC41'\n : '\u23F3';\n const title = n.title.length > 50 ? n.title.slice(0, 49) + '\u2026' : n.title;\n let elapsed = '';\n if (n.status === 'in_progress' && n.startedAt)\n elapsed = ` \u00B7 ${formatElapsed(Date.now() - n.startedAt)}`;\n lines.push(`${i + 1}. ${status} ${title}${elapsed}`);\n }\n return lines.join('\\n');\n}\n\nexport function getCurrentExecutingContext(): string | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n const nodes = tracker.getAllNodes({ status: ['in_progress'] });\n if (nodes.length === 0) return null;\n const n = expectDefined(nodes[0]);\n const elapsed = n.startedAt ? ` \u00B7 elapsed: ${formatElapsed(Date.now() - n.startedAt)}` : '';\n const progress = tracker.getProgress();\n return [\n `**NOW EXECUTING:** \"${n.title}\"${elapsed}`,\n `Description: ${n.description.split('\\n')[0] ?? '(none)'}`,\n `Priority: ${n.priority} \u00B7 Est: ${n.estimateHours ?? 0}h \u00B7 Tags: ${(n.tags ?? []).join(', ') || 'none'}`,\n `Progress: ${progress.completed}/${progress.total} tasks (${progress.percentComplete}%)`,\n ].join('\\n');\n}\n\n/**\n * Resolve a `/sdd done|skip|fail|review <N|title>` argument to a single task\n * node. Tries a 1-based index into the given (already filtered/sorted) node\n * list first, then a bidirectional case-insensitive title-substring match.\n * Centralizes the matching the four mutation subcommands used to duplicate.\n */\nexport function matchTaskNode<T extends { id: string; title: string }>(\n nodes: T[],\n query: string,\n): T | null {\n const trimmed = query.trim();\n if (!trimmed) return null;\n const num = Number(trimmed);\n if (!Number.isNaN(num) && num >= 1 && num <= nodes.length) {\n return nodes[num - 1] ?? null;\n }\n const q = trimmed.toLowerCase();\n return (\n nodes.find((n) => n.title.toLowerCase().includes(q) || q.includes(n.title.toLowerCase())) ??\n null\n );\n}\n\nexport function markTaskCompleted(taskTitle: string): boolean {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return false;\n const nodes = tracker.getAllNodes({ status: ['pending', 'in_progress'] });\n const match = nodes.find(\n (n) =>\n n.title.toLowerCase().includes(taskTitle.toLowerCase()) ||\n taskTitle.toLowerCase().includes(n.title.toLowerCase()),\n );\n if (!match) return false;\n tracker.updateNodeStatus(match.id, 'completed');\n return true;\n}\n\nexport function getTaskGraphId(): string | null {\n return sddState.getTaskGraphId();\n}\nexport function getTaskTrackerExport(): TaskTracker | null {\n return sddState.getTaskTracker();\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }