kanban 0.1.30 → 0.1.32

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 (102) hide show
  1. package/dist/cli.js +45 -8
  2. package/dist/cli.js.map +1 -1
  3. package/dist/cline-sdk/cline-event-adapter.d.ts.map +1 -1
  4. package/dist/cline-sdk/cline-event-adapter.js +4 -1
  5. package/dist/cline-sdk/cline-event-adapter.js.map +1 -1
  6. package/dist/cline-sdk/cline-message-repository.d.ts +2 -0
  7. package/dist/cline-sdk/cline-message-repository.d.ts.map +1 -1
  8. package/dist/cline-sdk/cline-message-repository.js +46 -12
  9. package/dist/cline-sdk/cline-message-repository.js.map +1 -1
  10. package/dist/cline-sdk/cline-session-runtime.d.ts +6 -3
  11. package/dist/cline-sdk/cline-session-runtime.d.ts.map +1 -1
  12. package/dist/cline-sdk/cline-session-runtime.js +32 -1
  13. package/dist/cline-sdk/cline-session-runtime.js.map +1 -1
  14. package/dist/cline-sdk/cline-session-state.d.ts +4 -3
  15. package/dist/cline-sdk/cline-session-state.d.ts.map +1 -1
  16. package/dist/cline-sdk/cline-session-state.js +5 -3
  17. package/dist/cline-sdk/cline-session-state.js.map +1 -1
  18. package/dist/cline-sdk/cline-task-session-service.d.ts +6 -3
  19. package/dist/cline-sdk/cline-task-session-service.d.ts.map +1 -1
  20. package/dist/cline-sdk/cline-task-session-service.js +51 -10
  21. package/dist/cline-sdk/cline-task-session-service.js.map +1 -1
  22. package/dist/commands/hooks.d.ts +1 -0
  23. package/dist/commands/hooks.d.ts.map +1 -1
  24. package/dist/commands/hooks.js +19 -10
  25. package/dist/commands/hooks.js.map +1 -1
  26. package/dist/commands/task.d.ts.map +1 -1
  27. package/dist/commands/task.js +176 -142
  28. package/dist/commands/task.js.map +1 -1
  29. package/dist/core/api-contract.d.ts +109 -0
  30. package/dist/core/api-contract.d.ts.map +1 -1
  31. package/dist/core/api-contract.js +15 -0
  32. package/dist/core/api-contract.js.map +1 -1
  33. package/dist/core/api-validation.d.ts.map +1 -1
  34. package/dist/core/api-validation.js +5 -2
  35. package/dist/core/api-validation.js.map +1 -1
  36. package/dist/core/task-board-mutations.d.ts +3 -1
  37. package/dist/core/task-board-mutations.d.ts.map +1 -1
  38. package/dist/core/task-board-mutations.js +6 -0
  39. package/dist/core/task-board-mutations.js.map +1 -1
  40. package/dist/fs/locked-file-system.d.ts.map +1 -1
  41. package/dist/fs/locked-file-system.js +14 -14
  42. package/dist/fs/locked-file-system.js.map +1 -1
  43. package/dist/prompts/append-system-prompt.d.ts +2 -0
  44. package/dist/prompts/append-system-prompt.d.ts.map +1 -1
  45. package/dist/prompts/append-system-prompt.js +16 -4
  46. package/dist/prompts/append-system-prompt.js.map +1 -1
  47. package/dist/state/workspace-state.d.ts +14 -1
  48. package/dist/state/workspace-state.d.ts.map +1 -1
  49. package/dist/state/workspace-state.js +42 -0
  50. package/dist/state/workspace-state.js.map +1 -1
  51. package/dist/terminal/claude-workspace-trust.d.ts.map +1 -1
  52. package/dist/terminal/claude-workspace-trust.js +2 -4
  53. package/dist/terminal/claude-workspace-trust.js.map +1 -1
  54. package/dist/trpc/app-router.d.ts +53 -1
  55. package/dist/trpc/app-router.d.ts.map +1 -1
  56. package/dist/trpc/app-router.js +6 -1
  57. package/dist/trpc/app-router.js.map +1 -1
  58. package/dist/trpc/projects-api.d.ts.map +1 -1
  59. package/dist/trpc/projects-api.js +27 -5
  60. package/dist/trpc/projects-api.js.map +1 -1
  61. package/dist/trpc/runtime-api.d.ts.map +1 -1
  62. package/dist/trpc/runtime-api.js +27 -17
  63. package/dist/trpc/runtime-api.js.map +1 -1
  64. package/dist/trpc/workspace-api.d.ts.map +1 -1
  65. package/dist/trpc/workspace-api.js +7 -0
  66. package/dist/trpc/workspace-api.js.map +1 -1
  67. package/dist/web-ui/assets/index-BMX-aVkC.js +39201 -0
  68. package/dist/web-ui/assets/{index-din0a8sT.css → index-DfDz587V.css} +55 -0
  69. package/dist/web-ui/index.html +2 -2
  70. package/dist/workspace/get-workspace-changes.d.ts.map +1 -1
  71. package/dist/workspace/get-workspace-changes.js +16 -40
  72. package/dist/workspace/get-workspace-changes.js.map +1 -1
  73. package/dist/workspace/git-history.d.ts.map +1 -1
  74. package/dist/workspace/git-history.js +1 -27
  75. package/dist/workspace/git-history.js.map +1 -1
  76. package/dist/workspace/git-sync.d.ts.map +1 -1
  77. package/dist/workspace/git-sync.js +12 -49
  78. package/dist/workspace/git-sync.js.map +1 -1
  79. package/dist/workspace/git-utils.d.ts +27 -0
  80. package/dist/workspace/git-utils.d.ts.map +1 -0
  81. package/dist/workspace/git-utils.js +74 -0
  82. package/dist/workspace/git-utils.js.map +1 -0
  83. package/dist/workspace/initialize-repo.d.ts +8 -0
  84. package/dist/workspace/initialize-repo.d.ts.map +1 -0
  85. package/dist/workspace/initialize-repo.js +38 -0
  86. package/dist/workspace/initialize-repo.js.map +1 -0
  87. package/dist/workspace/task-worktree-path.d.ts +2 -1
  88. package/dist/workspace/task-worktree-path.d.ts.map +1 -1
  89. package/dist/workspace/task-worktree-path.js +2 -1
  90. package/dist/workspace/task-worktree-path.js.map +1 -1
  91. package/dist/workspace/task-worktree-turbopack.d.ts +8 -0
  92. package/dist/workspace/task-worktree-turbopack.d.ts.map +1 -0
  93. package/dist/workspace/task-worktree-turbopack.js +180 -0
  94. package/dist/workspace/task-worktree-turbopack.js.map +1 -0
  95. package/dist/workspace/task-worktree.d.ts.map +1 -1
  96. package/dist/workspace/task-worktree.js +129 -146
  97. package/dist/workspace/task-worktree.js.map +1 -1
  98. package/dist/workspace/turn-checkpoints.d.ts.map +1 -1
  99. package/dist/workspace/turn-checkpoints.js +4 -14
  100. package/dist/workspace/turn-checkpoints.js.map +1 -1
  101. package/package.json +1 -1
  102. package/dist/web-ui/assets/index-CxOZ__bY.js +0 -33624
package/dist/cli.js CHANGED
@@ -27,6 +27,42 @@ function parseCliPortValue(rawValue) {
27
27
  throw new Error(`Invalid port value: ${rawValue}. Expected an integer from 1-65535 or "auto".`);
28
28
  }
29
29
  }
30
+ /**
31
+ * Decide whether this CLI invocation should auto-open a browser tab.
32
+ *
33
+ * This uses a positive allowlist for app-launch shapes like `kanban`,
34
+ * `kanban --agent codex`, and `kanban --port 3484`. Any subcommand or
35
+ * unexpected argument is treated as a command-style invocation instead.
36
+ */
37
+ function shouldAutoOpenBrowserTabForInvocation(argv) {
38
+ const launchFlags = new Set(["--open", "--no-open", "--skip-shutdown-cleanup"]);
39
+ const launchOptionsWithValues = new Set(["--host", "--port", "--agent"]);
40
+ for (let index = 0; index < argv.length; index += 1) {
41
+ const arg = argv[index];
42
+ if (!arg) {
43
+ continue;
44
+ }
45
+ if (!arg.startsWith("-")) {
46
+ return false;
47
+ }
48
+ if (launchFlags.has(arg)) {
49
+ continue;
50
+ }
51
+ const optionName = arg.split("=", 1)[0] ?? arg;
52
+ if (!launchOptionsWithValues.has(optionName)) {
53
+ return false;
54
+ }
55
+ if (arg.includes("=")) {
56
+ continue;
57
+ }
58
+ const optionValue = argv[index + 1];
59
+ if (!optionValue) {
60
+ return false;
61
+ }
62
+ index += 1;
63
+ }
64
+ return true;
65
+ }
30
66
  async function isPortAvailable(port) {
31
67
  return await new Promise((resolve) => {
32
68
  const probe = createNetServer();
@@ -111,7 +147,7 @@ async function canReachKanbanServer(workspaceId) {
111
147
  return false;
112
148
  }
113
149
  }
114
- async function tryOpenExistingServer(noOpen) {
150
+ async function tryOpenExistingServer(options) {
115
151
  let workspaceId = null;
116
152
  if (hasGitRepository(process.cwd())) {
117
153
  const { loadWorkspaceContext } = await import("./state/workspace-state.js");
@@ -126,7 +162,7 @@ async function tryOpenExistingServer(noOpen) {
126
162
  ? buildKanbanRuntimeUrl(`/${encodeURIComponent(workspaceId)}`)
127
163
  : getKanbanRuntimeOrigin();
128
164
  console.log(`Kanban already running at ${getKanbanRuntimeOrigin()}`);
129
- if (!noOpen) {
165
+ if (!options.noOpen && options.shouldAutoOpenBrowser) {
130
166
  try {
131
167
  const { openInBrowser } = await import("./server/browser.js");
132
168
  openInBrowser(projectUrl, {
@@ -292,7 +328,7 @@ async function startServerWithAutoPortRetry(options) {
292
328
  }
293
329
  }
294
330
  }
295
- async function runMainCommand(options) {
331
+ async function runMainCommand(options, shouldAutoOpenBrowser) {
296
332
  if (options.host) {
297
333
  setKanbanRuntimeHost(options.host);
298
334
  console.log(`Binding to host ${options.host}.`);
@@ -315,13 +351,13 @@ async function runMainCommand(options) {
315
351
  catch (error) {
316
352
  if (options.port?.mode !== "auto" &&
317
353
  isAddressInUseError(error) &&
318
- (await tryOpenExistingServer(options.noOpen))) {
354
+ (await tryOpenExistingServer({ noOpen: options.noOpen, shouldAutoOpenBrowser }))) {
319
355
  return;
320
356
  }
321
357
  throw error;
322
358
  }
323
359
  console.log(`Kanban running at ${runtime.url}`);
324
- if (!options.noOpen) {
360
+ if (!options.noOpen && shouldAutoOpenBrowser) {
325
361
  try {
326
362
  openInBrowser(runtime.url, {
327
363
  warn: (message) => {
@@ -371,7 +407,8 @@ async function runMainCommand(options) {
371
407
  await shutdown(signal ?? null);
372
408
  });
373
409
  }
374
- function createProgram() {
410
+ function createProgram(invocationArgs) {
411
+ const shouldAutoOpenBrowser = shouldAutoOpenBrowserTabForInvocation(invocationArgs);
375
412
  const program = new Command();
376
413
  program
377
414
  .name("kanban")
@@ -399,13 +436,13 @@ function createProgram() {
399
436
  port: options.port ?? null,
400
437
  noOpen: options.open === false,
401
438
  skipShutdownCleanup: options.skipShutdownCleanup === true,
402
- });
439
+ }, shouldAutoOpenBrowser);
403
440
  });
404
441
  return program;
405
442
  }
406
443
  async function run() {
407
444
  const argv = process.argv.slice(2);
408
- const program = createProgram();
445
+ const program = createProgram(argv);
409
446
  await program.parseAsync(argv, { from: "user" });
410
447
  }
411
448
  run().catch((error) => {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,YAAY,IAAI,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEhE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAExF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EACN,qBAAqB,EACrB,2BAA2B,EAC3B,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAW7E,MAAM,cAAc,GAAG,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAE/F,SAAS,iBAAiB,CAAC,QAAgB;IAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjD,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,CAAC;QACJ,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,+CAA+C,CAAC,CAAC;IACjG,CAAC;AACF,CAAC;AASD,KAAK,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,MAAM,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;QAC7C,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,EAAE,EAAE,GAAG,EAAE;YAC/C,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;gBAChB,OAAO,CAAC,IAAI,CAAC,CAAC;YACf,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,SAAiB;IACxD,KAAK,IAAI,SAAS,GAAG,SAAS,EAAE,SAAS,IAAI,KAAK,EAAE,SAAS,IAAI,CAAC,EAAE,CAAC;QACpE,IAAI,MAAM,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,OAAO,SAAS,CAAC;QAClB,CAAC;IACF,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,UAA8B;IACnE,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACjC,oBAAoB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvC,OAAO,UAAU,CAAC,KAAK,CAAC;IACzB,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,2BAA2B,CAAC,CAAC;IAC7E,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC/B,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;AACF,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACrC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAAE;QACvE,GAAG,EAAE,IAAI;QACT,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;QACnC,GAAG,EAAE,mBAAmB,EAAE;KAC1B,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC;AAC/D,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IAC1C,OAAO,CACN,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACd,KAA+B,CAAC,IAAI,KAAK,YAAY,CACtD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,WAA0B;IAC7D,IAAI,CAAC;QACJ,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,uBAAuB,CAAC,GAAG,WAAW,CAAC;QAChD,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,EAAE;YAC9E,MAAM,EAAE,KAAK;YACb,OAAO;YACP,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAGhD,CAAC;QACT,OAAO,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,MAAe;IACnD,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;QACrC,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1D,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACnC,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACxD,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACd,CAAC;IACD,MAAM,UAAU,GAAG,WAAW;QAC7B,CAAC,CAAC,qBAAqB,CAAC,IAAI,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9D,CAAC,CAAC,sBAAsB,EAAE,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,6BAA6B,sBAAsB,EAAE,EAAE,CAAC,CAAC;IACrE,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,IAAI,CAAC;YACJ,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;YAC9D,aAAa,CAAC,UAAU,EAAE;gBACzB,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;oBACjB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvB,CAAC;aACD,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,yCAAyC,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;IACF,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC;AACb,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,OAAe,EAAE,GAAW;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC;IAEnC,OAAO,MAAM,IAAI,OAAO,CAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACvE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE;YAC5B,GAAG;YACH,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SACjC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAC;YACpE,OAAO;QACR,CAAC;QAED,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,KAAa,EAAU,EAAE;YAC/D,MAAM,IAAI,GAAG,OAAO,GAAG,KAAK,CAAC;YAC7B,IAAI,IAAI,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;gBACrC,OAAO,IAAI,CAAC;YACb,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACxC,CAAC,CAAC;QAEF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;YAClD,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;YAClD,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,MAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC/B,0BAA0B,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC,EAAE,MAAM,CAAC,CAAC;QAEX,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,QAAQ,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,cAAc,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjF,OAAO,CAAC;gBACP,QAAQ;gBACR,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;gBACrB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;gBACrB,cAAc;gBACd,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aAClC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW;IAKzB;;;;;;;;;;MAUE;IACF,MAAM,CACL,EAAE,uBAAuB,EAAE,EAC3B,EAAE,iCAAiC,EAAE,EACrC,EAAE,mBAAmB,EAAE,EACvB,EAAE,qBAAqB,EAAE,EACzB,EAAE,8BAA8B,EAAE,EAClC,EAAE,qBAAqB,EAAE,EACzB,EAAE,uCAAuC,EAAE,uBAAuB,EAAE,EACpE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACrB,MAAM,CAAC,4BAA4B,CAAC;QACpC,MAAM,CAAC,8BAA8B,CAAC;QACtC,MAAM,CAAC,4BAA4B,CAAC;QACpC,MAAM,CAAC,+BAA+B,CAAC;QACvC,MAAM,CAAC,mBAAmB,CAAC;QAC3B,MAAM,CAAC,kCAAkC,CAAC;QAC1C,MAAM,CAAC,gCAAgC,CAAC;KACxC,CAAC,CAAC;IACH,IAAI,eAA4C,CAAC;IACjD,MAAM,iBAAiB,GAAG,MAAM,uBAAuB,CAAC;QACvD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,uBAAuB;QACvB,iBAAiB;QACjB,gBAAgB;QAChB,eAAe;QACf,sBAAsB,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE;YAChD,eAAe,EAAE,oBAAoB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC;KACD,CAAC,CAAC;IACH,eAAe,GAAG,qBAAqB,CAAC;QACvC,iBAAiB;KACjB,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,eAAe,CAAC;IACnC,KAAK,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,iBAAiB,CAAC,qBAAqB,EAAE,EAAE,CAAC;QAC1F,UAAU,CAAC,oBAAoB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,uBAAuB,GAAG,CAC/B,WAAmB,EACnB,OAEC,EACkF,EAAE;QACrF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,WAAW,EAAE;YAChE,oBAAoB,EAAE,OAAO,EAAE,oBAAoB;SACnD,CAAC,CAAC;QACH,UAAU,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC;QAC/C,iBAAiB;QACjB,eAAe,EAAE,UAAU;QAC3B,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;YACjB,OAAO,CAAC,IAAI,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,iCAAiC,EAAE,iBAAiB,CAAC,iCAAiC;QACtF,8BAA8B;QAC9B,UAAU,EAAE,gBAAgB;QAC5B,uBAAuB;QACvB,qBAAqB;QACrB,gBAAgB;QAChB,gBAAgB,EAAE,uBAAuB;QACzC,uCAAuC;QACvC,iCAAiC;KACjC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;QACxB,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,OAA0C,EAAE,EAAE;QACrE,MAAM,qBAAqB,CAAC;YAC3B,iBAAiB;YACjB,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;gBACjB,OAAO,CAAC,IAAI,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;YACrC,CAAC;YACD,kBAAkB,EAAE,KAAK;YACzB,kBAAkB,EAAE,OAAO,EAAE,kBAAkB,IAAI,KAAK;SACxD,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACN,GAAG,EAAE,aAAa,CAAC,GAAG;QACtB,KAAK;QACL,QAAQ;KACR,CAAC;AACH,CAAC;AAED,KAAK,UAAU,4BAA4B,CAAC,OAAmB;IAC9D,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;QACnC,OAAO,MAAM,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED,OAAO,IAAI,EAAE,CAAC;QACb,IAAI,CAAC;YACJ,OAAO,MAAM,WAAW,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjC,MAAM,KAAK,CAAC;YACb,CAAC;YACD,MAAM,WAAW,GAAG,oBAAoB,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;YAClE,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,gBAAgB,WAAW,4CAA4C,SAAS,GAAG,CAAC,CAAC;QACnG,CAAC;IACF,CAAC;AACF,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,OAAmB;IAChD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,mBAAmB,EAAE,8BAA8B,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtG,MAAM,CAAC,qBAAqB,CAAC;QAC7B,MAAM,CAAC,yBAAyB,CAAC;KACjC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,sBAAsB,YAAY,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,mBAAmB,CAAC;QACnB,cAAc,EAAE,cAAc;KAC9B,CAAC,CAAC;IAEH,IAAI,OAAgD,CAAC;IACrD,IAAI,CAAC;QACJ,OAAO,GAAG,MAAM,4BAA4B,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IACC,OAAO,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM;YAC7B,mBAAmB,CAAC,KAAK,CAAC;YAC1B,CAAC,MAAM,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAC5C,CAAC;YACF,OAAO;QACR,CAAC;QACD,MAAM,KAAK,CAAC;IACb,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACrB,IAAI,CAAC;YACJ,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC1B,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;oBACjB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvB,CAAC;aACD,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,yCAAyC,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;IACF,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAErC,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,MAAM,QAAQ,GAAG,KAAK,EAAE,MAA6B,EAAE,EAAE;QACxD,IAAI,cAAc,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,OAAO;QACR,CAAC;QACD,cAAc,GAAG,IAAI,CAAC;QACtB,8BAA8B,EAAE,CAAC;QACjC,IAAI,CAAC;YACJ,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;YACnE,CAAC;YACD,MAAM,OAAO,CAAC,QAAQ,CAAC;gBACtB,kBAAkB,EAAE,OAAO,CAAC,mBAAmB;aAC/C,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACF,CAAC,CAAC;IAEF,cAAc,CACb;QACC,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,CAAC,mBAAmB,EAAE,oBAAoB,EAAE,YAAY,CAAC;QAC/D,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;YACtB,OAAO,CAAC,KAAK,CAAC,uCAAuC,OAAO,MAAM,CAAC,CAAC;QACrE,CAAC;QACD,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE;YAC1B,OAAO,CAAC,KAAK,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;QAC1D,CAAC;KACD,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACpB,MAAM,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;IAChC,CAAC,CACD,CAAC;AACH,CAAC;AAED,SAAS,aAAa;IACrB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO;SACL,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,8CAA8C,CAAC;SAC3D,OAAO,CAAC,cAAc,EAAE,eAAe,EAAE,2BAA2B,CAAC;SACrE,MAAM,CAAC,aAAa,EAAE,qDAAqD,CAAC;SAC5E,MAAM,CAAC,sBAAsB,EAAE,iCAAiC,EAAE,iBAAiB,CAAC;SACpF,MAAM,CAAC,WAAW,EAAE,oCAAoC,CAAC;SACzD,MAAM,CAAC,yBAAyB,EAAE,qEAAqE,CAAC;SACxG,kBAAkB,EAAE;SACpB,WAAW,CAAC,OAAO,EAAE,kBAAkB,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAErE,OAAO,CAAC,SAAS,CAChB,IAAI,MAAM,CAAC,cAAc,EAAE,yCAAyC,CAAC;SACnE,QAAQ,EAAE,CACZ,CAAC;IAEF,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE9B,OAAO;SACL,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,GAAG,EAAE;QACZ,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEJ,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAA2B,EAAE,EAAE;QACpD,MAAM,cAAc,CAAC;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;YAC1B,MAAM,EAAE,OAAO,CAAC,IAAI,KAAK,KAAK;YAC9B,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,KAAK,IAAI;SACzD,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,GAAG;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,KAAK,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\n\nimport { spawn, spawnSync } from \"node:child_process\";\nimport { stat } from \"node:fs/promises\";\nimport { createServer as createNetServer } from \"node:net\";\nimport closeWithGrace from \"close-with-grace\";\nimport { Command, Option } from \"commander\";\nimport packageJson from \"../package.json\" with { type: \"json\" };\n\nimport { registerHooksCommand } from \"./commands/hooks.js\";\nimport { registerTaskCommand } from \"./commands/task.js\";\nimport { loadGlobalRuntimeConfig, loadRuntimeConfig } from \"./config/runtime-config.js\";\nimport type { RuntimeCommandRunResponse } from \"./core/api-contract.js\";\nimport { createGitProcessEnv } from \"./core/git-process-env.js\";\nimport {\n\tbuildKanbanRuntimeUrl,\n\tDEFAULT_KANBAN_RUNTIME_PORT,\n\tgetKanbanRuntimeHost,\n\tgetKanbanRuntimeOrigin,\n\tgetKanbanRuntimePort,\n\tparseRuntimePort,\n\tsetKanbanRuntimeHost,\n\tsetKanbanRuntimePort,\n} from \"./core/runtime-endpoint.js\";\nimport { terminateProcessForTimeout } from \"./server/process-termination.js\";\nimport type { RuntimeStateHub } from \"./server/runtime-state-hub.js\";\nimport type { TerminalSessionManager } from \"./terminal/session-manager.js\";\n\ninterface CliOptions {\n\tnoOpen: boolean;\n\tskipShutdownCleanup: boolean;\n\thost: string | null;\n\tport: { mode: \"fixed\"; value: number } | { mode: \"auto\" } | null;\n}\n\nconst KANBAN_VERSION = typeof packageJson.version === \"string\" ? packageJson.version : \"0.1.0\";\n\nfunction parseCliPortValue(rawValue: string): { mode: \"fixed\"; value: number } | { mode: \"auto\" } {\n\tconst normalized = rawValue.trim().toLowerCase();\n\tif (!normalized) {\n\t\tthrow new Error(\"Missing value for --port.\");\n\t}\n\tif (normalized === \"auto\") {\n\t\treturn { mode: \"auto\" };\n\t}\n\ttry {\n\t\treturn { mode: \"fixed\", value: parseRuntimePort(normalized) };\n\t} catch {\n\t\tthrow new Error(`Invalid port value: ${rawValue}. Expected an integer from 1-65535 or \"auto\".`);\n\t}\n}\n\ninterface RootCommandOptions {\n\thost?: string;\n\tport?: { mode: \"fixed\"; value: number } | { mode: \"auto\" };\n\topen?: boolean;\n\tskipShutdownCleanup?: boolean;\n}\n\nasync function isPortAvailable(port: number): Promise<boolean> {\n\treturn await new Promise<boolean>((resolve) => {\n\t\tconst probe = createNetServer();\n\t\tprobe.once(\"error\", () => {\n\t\t\tresolve(false);\n\t\t});\n\t\tprobe.listen(port, getKanbanRuntimeHost(), () => {\n\t\t\tprobe.close(() => {\n\t\t\t\tresolve(true);\n\t\t\t});\n\t\t});\n\t});\n}\n\nasync function findAvailableRuntimePort(startPort: number): Promise<number> {\n\tfor (let candidate = startPort; candidate <= 65535; candidate += 1) {\n\t\tif (await isPortAvailable(candidate)) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\tthrow new Error(\"No available runtime port found.\");\n}\n\nasync function applyRuntimePortOption(portOption: CliOptions[\"port\"]): Promise<number | null> {\n\tif (!portOption) {\n\t\treturn null;\n\t}\n\tif (portOption.mode === \"fixed\") {\n\t\tsetKanbanRuntimePort(portOption.value);\n\t\treturn portOption.value;\n\t}\n\tconst autoPort = await findAvailableRuntimePort(DEFAULT_KANBAN_RUNTIME_PORT);\n\tsetKanbanRuntimePort(autoPort);\n\treturn autoPort;\n}\n\nasync function assertPathIsDirectory(path: string): Promise<void> {\n\tconst info = await stat(path);\n\tif (!info.isDirectory()) {\n\t\tthrow new Error(`Project path is not a directory: ${path}`);\n\t}\n}\n\nasync function pathIsDirectory(path: string): Promise<boolean> {\n\ttry {\n\t\tconst info = await stat(path);\n\t\treturn info.isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction hasGitRepository(path: string): boolean {\n\tconst result = spawnSync(\"git\", [\"rev-parse\", \"--is-inside-work-tree\"], {\n\t\tcwd: path,\n\t\tencoding: \"utf8\",\n\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\tenv: createGitProcessEnv(),\n\t});\n\treturn result.status === 0 && result.stdout.trim() === \"true\";\n}\n\nfunction isAddressInUseError(error: unknown): error is NodeJS.ErrnoException {\n\treturn (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"code\" in error &&\n\t\t(error as NodeJS.ErrnoException).code === \"EADDRINUSE\"\n\t);\n}\n\nasync function canReachKanbanServer(workspaceId: string | null): Promise<boolean> {\n\ttry {\n\t\tconst headers: Record<string, string> = {};\n\t\tif (workspaceId) {\n\t\t\theaders[\"x-kanban-workspace-id\"] = workspaceId;\n\t\t}\n\t\tconst response = await fetch(buildKanbanRuntimeUrl(\"/api/trpc/projects.list\"), {\n\t\t\tmethod: \"GET\",\n\t\t\theaders,\n\t\t\tsignal: AbortSignal.timeout(1_500),\n\t\t});\n\t\tif (response.status === 404) {\n\t\t\treturn false;\n\t\t}\n\t\tconst payload = (await response.json().catch(() => null)) as {\n\t\t\tresult?: { data?: unknown };\n\t\t\terror?: unknown;\n\t\t} | null;\n\t\treturn Boolean(payload && (payload.result || payload.error));\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function tryOpenExistingServer(noOpen: boolean): Promise<boolean> {\n\tlet workspaceId: string | null = null;\n\tif (hasGitRepository(process.cwd())) {\n\t\tconst { loadWorkspaceContext } = await import(\"./state/workspace-state.js\");\n\t\tconst context = await loadWorkspaceContext(process.cwd());\n\t\tworkspaceId = context.workspaceId;\n\t}\n\tconst running = await canReachKanbanServer(workspaceId);\n\tif (!running) {\n\t\treturn false;\n\t}\n\tconst projectUrl = workspaceId\n\t\t? buildKanbanRuntimeUrl(`/${encodeURIComponent(workspaceId)}`)\n\t\t: getKanbanRuntimeOrigin();\n\tconsole.log(`Kanban already running at ${getKanbanRuntimeOrigin()}`);\n\tif (!noOpen) {\n\t\ttry {\n\t\t\tconst { openInBrowser } = await import(\"./server/browser.js\");\n\t\t\topenInBrowser(projectUrl, {\n\t\t\t\twarn: (message) => {\n\t\t\t\t\tconsole.warn(message);\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.warn(`Could not open browser automatically: ${message}`);\n\t\t}\n\t}\n\tconsole.log(`Project URL: ${projectUrl}`);\n\treturn true;\n}\n\nasync function runScopedCommand(command: string, cwd: string): Promise<RuntimeCommandRunResponse> {\n\tconst startedAt = Date.now();\n\tconst outputLimitBytes = 64 * 1024;\n\n\treturn await new Promise<RuntimeCommandRunResponse>((resolve, reject) => {\n\t\tconst child = spawn(command, {\n\t\t\tcwd,\n\t\t\tshell: true,\n\t\t\tenv: process.env,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tif (!child.stdout || !child.stderr) {\n\t\t\treject(new Error(\"Shortcut process did not expose stdout/stderr.\"));\n\t\t\treturn;\n\t\t}\n\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\n\t\tconst appendOutput = (current: string, chunk: string): string => {\n\t\t\tconst next = current + chunk;\n\t\t\tif (next.length <= outputLimitBytes) {\n\t\t\t\treturn next;\n\t\t\t}\n\t\t\treturn next.slice(0, outputLimitBytes);\n\t\t};\n\n\t\tchild.stdout.on(\"data\", (chunk: Buffer | string) => {\n\t\t\tstdout = appendOutput(stdout, String(chunk));\n\t\t});\n\n\t\tchild.stderr.on(\"data\", (chunk: Buffer | string) => {\n\t\t\tstderr = appendOutput(stderr, String(chunk));\n\t\t});\n\n\t\tchild.on(\"error\", (error) => {\n\t\t\treject(error);\n\t\t});\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tterminateProcessForTimeout(child);\n\t\t}, 60_000);\n\n\t\tchild.on(\"close\", (code) => {\n\t\t\tclearTimeout(timeout);\n\t\t\tconst exitCode = typeof code === \"number\" ? code : 1;\n\t\t\tconst combinedOutput = [stdout.trim(), stderr.trim()].filter(Boolean).join(\"\\n\");\n\t\t\tresolve({\n\t\t\t\texitCode,\n\t\t\t\tstdout: stdout.trim(),\n\t\t\t\tstderr: stderr.trim(),\n\t\t\t\tcombinedOutput,\n\t\t\t\tdurationMs: Date.now() - startedAt,\n\t\t\t});\n\t\t});\n\t});\n}\n\nasync function startServer(): Promise<{\n\turl: string;\n\tclose: () => Promise<void>;\n\tshutdown: (options?: { skipSessionCleanup?: boolean }) => Promise<void>;\n}> {\n\t/*\n\t\tServer-only modules are loaded lazily because task-oriented subcommands like\n\t\t`kanban task create` and `kanban hooks ingest` do not need the runtime server.\n\n\t\tA regression in 25ba59f showed that eagerly importing the runtime stack here\n\t\tcould leave the source CLI process alive after the command had already printed\n\t\tits JSON result. The issue first appeared after the native Cline SDK runtime\n\t\twas added to the server import graph. We have not yet isolated the deepest\n\t\thandle creator inside that graph, so we keep command-style subcommands on the\n\t\tlightweight path and only load the server stack when we actually start Kanban.\n\t*/\n\tconst [\n\t\t{ resolveProjectInputPath },\n\t\t{ pickDirectoryPathFromSystemDialog },\n\t\t{ createRuntimeServer },\n\t\t{ createRuntimeStateHub },\n\t\t{ resolveInteractiveShellCommand },\n\t\t{ shutdownRuntimeServer },\n\t\t{ collectProjectWorktreeTaskIdsForRemoval, createWorkspaceRegistry },\n\t] = await Promise.all([\n\t\timport(\"./projects/project-path.js\"),\n\t\timport(\"./server/directory-picker.js\"),\n\t\timport(\"./server/runtime-server.js\"),\n\t\timport(\"./server/runtime-state-hub.js\"),\n\t\timport(\"./server/shell.js\"),\n\t\timport(\"./server/shutdown-coordinator.js\"),\n\t\timport(\"./server/workspace-registry.js\"),\n\t]);\n\tlet runtimeStateHub: RuntimeStateHub | undefined;\n\tconst workspaceRegistry = await createWorkspaceRegistry({\n\t\tcwd: process.cwd(),\n\t\tloadGlobalRuntimeConfig,\n\t\tloadRuntimeConfig,\n\t\thasGitRepository,\n\t\tpathIsDirectory,\n\t\tonTerminalManagerReady: (workspaceId, manager) => {\n\t\t\truntimeStateHub?.trackTerminalManager(workspaceId, manager);\n\t\t},\n\t});\n\truntimeStateHub = createRuntimeStateHub({\n\t\tworkspaceRegistry,\n\t});\n\tconst runtimeHub = runtimeStateHub;\n\tfor (const { workspaceId, terminalManager } of workspaceRegistry.listManagedWorkspaces()) {\n\t\truntimeHub.trackTerminalManager(workspaceId, terminalManager);\n\t}\n\n\tconst disposeTrackedWorkspace = (\n\t\tworkspaceId: string,\n\t\toptions?: {\n\t\t\tstopTerminalSessions?: boolean;\n\t\t},\n\t): { terminalManager: TerminalSessionManager | null; workspacePath: string | null } => {\n\t\tconst disposed = workspaceRegistry.disposeWorkspace(workspaceId, {\n\t\t\tstopTerminalSessions: options?.stopTerminalSessions,\n\t\t});\n\t\truntimeHub.disposeWorkspace(workspaceId);\n\t\treturn disposed;\n\t};\n\n\tconst runtimeServer = await createRuntimeServer({\n\t\tworkspaceRegistry,\n\t\truntimeStateHub: runtimeHub,\n\t\twarn: (message) => {\n\t\t\tconsole.warn(`[kanban] ${message}`);\n\t\t},\n\t\tensureTerminalManagerForWorkspace: workspaceRegistry.ensureTerminalManagerForWorkspace,\n\t\tresolveInteractiveShellCommand,\n\t\trunCommand: runScopedCommand,\n\t\tresolveProjectInputPath,\n\t\tassertPathIsDirectory,\n\t\thasGitRepository,\n\t\tdisposeWorkspace: disposeTrackedWorkspace,\n\t\tcollectProjectWorktreeTaskIdsForRemoval,\n\t\tpickDirectoryPathFromSystemDialog,\n\t});\n\n\tconst close = async () => {\n\t\tawait runtimeServer.close();\n\t};\n\n\tconst shutdown = async (options?: { skipSessionCleanup?: boolean }) => {\n\t\tawait shutdownRuntimeServer({\n\t\t\tworkspaceRegistry,\n\t\t\twarn: (message) => {\n\t\t\t\tconsole.warn(`[kanban] ${message}`);\n\t\t\t},\n\t\t\tcloseRuntimeServer: close,\n\t\t\tskipSessionCleanup: options?.skipSessionCleanup ?? false,\n\t\t});\n\t};\n\n\treturn {\n\t\turl: runtimeServer.url,\n\t\tclose,\n\t\tshutdown,\n\t};\n}\n\nasync function startServerWithAutoPortRetry(options: CliOptions): Promise<Awaited<ReturnType<typeof startServer>>> {\n\tif (options.port?.mode !== \"auto\") {\n\t\treturn await startServer();\n\t}\n\n\twhile (true) {\n\t\ttry {\n\t\t\treturn await startServer();\n\t\t} catch (error) {\n\t\t\tif (!isAddressInUseError(error)) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst currentPort = getKanbanRuntimePort();\n\t\t\tconst retryPort = await findAvailableRuntimePort(currentPort + 1);\n\t\t\tsetKanbanRuntimePort(retryPort);\n\t\t\tconsole.warn(`Runtime port ${currentPort} became busy during startup, retrying on ${retryPort}.`);\n\t\t}\n\t}\n}\n\nasync function runMainCommand(options: CliOptions): Promise<void> {\n\tif (options.host) {\n\t\tsetKanbanRuntimeHost(options.host);\n\t\tconsole.log(`Binding to host ${options.host}.`);\n\t}\n\n\tconst [{ openInBrowser }, { autoUpdateOnStartup, runPendingAutoUpdateOnShutdown }] = await Promise.all([\n\t\timport(\"./server/browser.js\"),\n\t\timport(\"./update/auto-update.js\"),\n\t]);\n\n\tconst selectedPort = await applyRuntimePortOption(options.port);\n\tif (selectedPort !== null) {\n\t\tconsole.log(`Using runtime port ${selectedPort}.`);\n\t}\n\n\tautoUpdateOnStartup({\n\t\tcurrentVersion: KANBAN_VERSION,\n\t});\n\n\tlet runtime: Awaited<ReturnType<typeof startServer>>;\n\ttry {\n\t\truntime = await startServerWithAutoPortRetry(options);\n\t} catch (error) {\n\t\tif (\n\t\t\toptions.port?.mode !== \"auto\" &&\n\t\t\tisAddressInUseError(error) &&\n\t\t\t(await tryOpenExistingServer(options.noOpen))\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthrow error;\n\t}\n\tconsole.log(`Kanban running at ${runtime.url}`);\n\tif (!options.noOpen) {\n\t\ttry {\n\t\t\topenInBrowser(runtime.url, {\n\t\t\t\twarn: (message) => {\n\t\t\t\t\tconsole.warn(message);\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.warn(`Could not open browser automatically: ${message}`);\n\t\t}\n\t}\n\tconsole.log(\"Press Ctrl+C to stop.\");\n\n\tlet isShuttingDown = false;\n\tconst shutdown = async (signal: NodeJS.Signals | null) => {\n\t\tif (isShuttingDown) {\n\t\t\tprocess.exit(130);\n\t\t\treturn;\n\t\t}\n\t\tisShuttingDown = true;\n\t\trunPendingAutoUpdateOnShutdown();\n\t\ttry {\n\t\t\tif (options.skipShutdownCleanup) {\n\t\t\t\tconsole.warn(\"Skipping shutdown task cleanup for this instance.\");\n\t\t\t}\n\t\t\tawait runtime.shutdown({\n\t\t\t\tskipSessionCleanup: options.skipShutdownCleanup,\n\t\t\t});\n\t\t\tprocess.exit(signal ? 130 : 0);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.error(`Shutdown failed: ${message}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t};\n\n\tcloseWithGrace(\n\t\t{\n\t\t\tdelay: 10000,\n\t\t\tskip: [\"uncaughtException\", \"unhandledRejection\", \"beforeExit\"],\n\t\t\tonTimeout: (delayMs) => {\n\t\t\t\tconsole.error(`Forced exit after shutdown timeout (${delayMs}ms).`);\n\t\t\t},\n\t\t\tonSecondSignal: (signal) => {\n\t\t\t\tconsole.error(`Forced exit on second signal: ${signal}`);\n\t\t\t},\n\t\t},\n\t\tasync ({ signal }) => {\n\t\t\tawait shutdown(signal ?? null);\n\t\t},\n\t);\n}\n\nfunction createProgram(): Command {\n\tconst program = new Command();\n\tprogram\n\t\t.name(\"kanban\")\n\t\t.description(\"Local orchestration board for coding agents.\")\n\t\t.version(KANBAN_VERSION, \"-v, --version\", \"Output the version number\")\n\t\t.option(\"--host <ip>\", \"Host IP to bind the server to (default: 127.0.0.1).\")\n\t\t.option(\"--port <number|auto>\", \"Runtime port (1-65535) or auto.\", parseCliPortValue)\n\t\t.option(\"--no-open\", \"Do not open browser automatically.\")\n\t\t.option(\"--skip-shutdown-cleanup\", \"Do not move sessions to trash or delete task worktrees on shutdown.\")\n\t\t.showHelpAfterError()\n\t\t.addHelpText(\"after\", `\\nRuntime URL: ${getKanbanRuntimeOrigin()}`);\n\n\tprogram.addOption(\n\t\tnew Option(\"--agent <id>\", \"Deprecated compatibility flag. Ignored.\")\n\t\t\t.hideHelp(),\n\t);\n\n\tregisterTaskCommand(program);\n\tregisterHooksCommand(program);\n\n\tprogram\n\t\t.command(\"mcp\")\n\t\t.description(\"Deprecated compatibility command.\")\n\t\t.action(() => {\n\t\t\tconsole.warn(\"Deprecated. Please uninstall Kanban MCP.\");\n\t\t});\n\n\tprogram.action(async (options: RootCommandOptions) => {\n\t\tawait runMainCommand({\n\t\t\thost: options.host ?? null,\n\t\t\tport: options.port ?? null,\n\t\t\tnoOpen: options.open === false,\n\t\t\tskipShutdownCleanup: options.skipShutdownCleanup === true,\n\t\t});\n\t});\n\n\treturn program;\n}\n\nasync function run(): Promise<void> {\n\tconst argv = process.argv.slice(2);\n\tconst program = createProgram();\n\tawait program.parseAsync(argv, { from: \"user\" });\n}\n\nrun().catch((error) => {\n\tconst message = error instanceof Error ? error.message : String(error);\n\tconsole.error(`Failed to start Kanban: ${message}`);\n\tprocess.exit(1);\n});\n"]}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\nimport { spawn, spawnSync } from \"node:child_process\";\nimport { stat } from \"node:fs/promises\";\nimport { createServer as createNetServer } from \"node:net\";\nimport closeWithGrace from \"close-with-grace\";\nimport { Command, Option } from \"commander\";\nimport packageJson from \"../package.json\" with { type: \"json\" };\n\nimport { registerHooksCommand } from \"./commands/hooks.js\";\nimport { registerTaskCommand } from \"./commands/task.js\";\nimport { loadGlobalRuntimeConfig, loadRuntimeConfig } from \"./config/runtime-config.js\";\nimport type { RuntimeCommandRunResponse } from \"./core/api-contract.js\";\nimport { createGitProcessEnv } from \"./core/git-process-env.js\";\nimport {\n\tbuildKanbanRuntimeUrl,\n\tDEFAULT_KANBAN_RUNTIME_PORT,\n\tgetKanbanRuntimeHost,\n\tgetKanbanRuntimeOrigin,\n\tgetKanbanRuntimePort,\n\tparseRuntimePort,\n\tsetKanbanRuntimeHost,\n\tsetKanbanRuntimePort,\n} from \"./core/runtime-endpoint.js\";\nimport { terminateProcessForTimeout } from \"./server/process-termination.js\";\nimport type { RuntimeStateHub } from \"./server/runtime-state-hub.js\";\nimport type { TerminalSessionManager } from \"./terminal/session-manager.js\";\n\ninterface CliOptions {\n\tnoOpen: boolean;\n\tskipShutdownCleanup: boolean;\n\thost: string | null;\n\tport: { mode: \"fixed\"; value: number } | { mode: \"auto\" } | null;\n}\n\nconst KANBAN_VERSION = typeof packageJson.version === \"string\" ? packageJson.version : \"0.1.0\";\n\nfunction parseCliPortValue(rawValue: string): { mode: \"fixed\"; value: number } | { mode: \"auto\" } {\n\tconst normalized = rawValue.trim().toLowerCase();\n\tif (!normalized) {\n\t\tthrow new Error(\"Missing value for --port.\");\n\t}\n\tif (normalized === \"auto\") {\n\t\treturn { mode: \"auto\" };\n\t}\n\ttry {\n\t\treturn { mode: \"fixed\", value: parseRuntimePort(normalized) };\n\t} catch {\n\t\tthrow new Error(`Invalid port value: ${rawValue}. Expected an integer from 1-65535 or \"auto\".`);\n\t}\n}\n\ninterface RootCommandOptions {\n\thost?: string;\n\tport?: { mode: \"fixed\"; value: number } | { mode: \"auto\" };\n\topen?: boolean;\n\tskipShutdownCleanup?: boolean;\n}\n\n/**\n * Decide whether this CLI invocation should auto-open a browser tab.\n *\n * This uses a positive allowlist for app-launch shapes like `kanban`,\n * `kanban --agent codex`, and `kanban --port 3484`. Any subcommand or\n * unexpected argument is treated as a command-style invocation instead.\n */\nfunction shouldAutoOpenBrowserTabForInvocation(argv: string[]): boolean {\n\tconst launchFlags = new Set([\"--open\", \"--no-open\", \"--skip-shutdown-cleanup\"]);\n\tconst launchOptionsWithValues = new Set([\"--host\", \"--port\", \"--agent\"]);\n\n\tfor (let index = 0; index < argv.length; index += 1) {\n\t\tconst arg = argv[index];\n\t\tif (!arg) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!arg.startsWith(\"-\")) {\n\t\t\treturn false;\n\t\t}\n\t\tif (launchFlags.has(arg)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst optionName = arg.split(\"=\", 1)[0] ?? arg;\n\t\tif (!launchOptionsWithValues.has(optionName)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (arg.includes(\"=\")) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst optionValue = argv[index + 1];\n\t\tif (!optionValue) {\n\t\t\treturn false;\n\t\t}\n\t\tindex += 1;\n\t}\n\n\treturn true;\n}\n\nasync function isPortAvailable(port: number): Promise<boolean> {\n\treturn await new Promise<boolean>((resolve) => {\n\t\tconst probe = createNetServer();\n\t\tprobe.once(\"error\", () => {\n\t\t\tresolve(false);\n\t\t});\n\t\tprobe.listen(port, getKanbanRuntimeHost(), () => {\n\t\t\tprobe.close(() => {\n\t\t\t\tresolve(true);\n\t\t\t});\n\t\t});\n\t});\n}\n\nasync function findAvailableRuntimePort(startPort: number): Promise<number> {\n\tfor (let candidate = startPort; candidate <= 65535; candidate += 1) {\n\t\tif (await isPortAvailable(candidate)) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\tthrow new Error(\"No available runtime port found.\");\n}\n\nasync function applyRuntimePortOption(portOption: CliOptions[\"port\"]): Promise<number | null> {\n\tif (!portOption) {\n\t\treturn null;\n\t}\n\tif (portOption.mode === \"fixed\") {\n\t\tsetKanbanRuntimePort(portOption.value);\n\t\treturn portOption.value;\n\t}\n\tconst autoPort = await findAvailableRuntimePort(DEFAULT_KANBAN_RUNTIME_PORT);\n\tsetKanbanRuntimePort(autoPort);\n\treturn autoPort;\n}\n\nasync function assertPathIsDirectory(path: string): Promise<void> {\n\tconst info = await stat(path);\n\tif (!info.isDirectory()) {\n\t\tthrow new Error(`Project path is not a directory: ${path}`);\n\t}\n}\n\nasync function pathIsDirectory(path: string): Promise<boolean> {\n\ttry {\n\t\tconst info = await stat(path);\n\t\treturn info.isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction hasGitRepository(path: string): boolean {\n\tconst result = spawnSync(\"git\", [\"rev-parse\", \"--is-inside-work-tree\"], {\n\t\tcwd: path,\n\t\tencoding: \"utf8\",\n\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\tenv: createGitProcessEnv(),\n\t});\n\treturn result.status === 0 && result.stdout.trim() === \"true\";\n}\n\nfunction isAddressInUseError(error: unknown): error is NodeJS.ErrnoException {\n\treturn (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"code\" in error &&\n\t\t(error as NodeJS.ErrnoException).code === \"EADDRINUSE\"\n\t);\n}\n\nasync function canReachKanbanServer(workspaceId: string | null): Promise<boolean> {\n\ttry {\n\t\tconst headers: Record<string, string> = {};\n\t\tif (workspaceId) {\n\t\t\theaders[\"x-kanban-workspace-id\"] = workspaceId;\n\t\t}\n\t\tconst response = await fetch(buildKanbanRuntimeUrl(\"/api/trpc/projects.list\"), {\n\t\t\tmethod: \"GET\",\n\t\t\theaders,\n\t\t\tsignal: AbortSignal.timeout(1_500),\n\t\t});\n\t\tif (response.status === 404) {\n\t\t\treturn false;\n\t\t}\n\t\tconst payload = (await response.json().catch(() => null)) as {\n\t\t\tresult?: { data?: unknown };\n\t\t\terror?: unknown;\n\t\t} | null;\n\t\treturn Boolean(payload && (payload.result || payload.error));\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function tryOpenExistingServer(options: { noOpen: boolean; shouldAutoOpenBrowser: boolean }): Promise<boolean> {\n\tlet workspaceId: string | null = null;\n\tif (hasGitRepository(process.cwd())) {\n\t\tconst { loadWorkspaceContext } = await import(\"./state/workspace-state.js\");\n\t\tconst context = await loadWorkspaceContext(process.cwd());\n\t\tworkspaceId = context.workspaceId;\n\t}\n\tconst running = await canReachKanbanServer(workspaceId);\n\tif (!running) {\n\t\treturn false;\n\t}\n\tconst projectUrl = workspaceId\n\t\t? buildKanbanRuntimeUrl(`/${encodeURIComponent(workspaceId)}`)\n\t\t: getKanbanRuntimeOrigin();\n\tconsole.log(`Kanban already running at ${getKanbanRuntimeOrigin()}`);\n\tif (!options.noOpen && options.shouldAutoOpenBrowser) {\n\t\ttry {\n\t\t\tconst { openInBrowser } = await import(\"./server/browser.js\");\n\t\t\topenInBrowser(projectUrl, {\n\t\t\t\twarn: (message) => {\n\t\t\t\t\tconsole.warn(message);\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.warn(`Could not open browser automatically: ${message}`);\n\t\t}\n\t}\n\tconsole.log(`Project URL: ${projectUrl}`);\n\treturn true;\n}\n\nasync function runScopedCommand(command: string, cwd: string): Promise<RuntimeCommandRunResponse> {\n\tconst startedAt = Date.now();\n\tconst outputLimitBytes = 64 * 1024;\n\n\treturn await new Promise<RuntimeCommandRunResponse>((resolve, reject) => {\n\t\tconst child = spawn(command, {\n\t\t\tcwd,\n\t\t\tshell: true,\n\t\t\tenv: process.env,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tif (!child.stdout || !child.stderr) {\n\t\t\treject(new Error(\"Shortcut process did not expose stdout/stderr.\"));\n\t\t\treturn;\n\t\t}\n\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\n\t\tconst appendOutput = (current: string, chunk: string): string => {\n\t\t\tconst next = current + chunk;\n\t\t\tif (next.length <= outputLimitBytes) {\n\t\t\t\treturn next;\n\t\t\t}\n\t\t\treturn next.slice(0, outputLimitBytes);\n\t\t};\n\n\t\tchild.stdout.on(\"data\", (chunk: Buffer | string) => {\n\t\t\tstdout = appendOutput(stdout, String(chunk));\n\t\t});\n\n\t\tchild.stderr.on(\"data\", (chunk: Buffer | string) => {\n\t\t\tstderr = appendOutput(stderr, String(chunk));\n\t\t});\n\n\t\tchild.on(\"error\", (error) => {\n\t\t\treject(error);\n\t\t});\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tterminateProcessForTimeout(child);\n\t\t}, 60_000);\n\n\t\tchild.on(\"close\", (code) => {\n\t\t\tclearTimeout(timeout);\n\t\t\tconst exitCode = typeof code === \"number\" ? code : 1;\n\t\t\tconst combinedOutput = [stdout.trim(), stderr.trim()].filter(Boolean).join(\"\\n\");\n\t\t\tresolve({\n\t\t\t\texitCode,\n\t\t\t\tstdout: stdout.trim(),\n\t\t\t\tstderr: stderr.trim(),\n\t\t\t\tcombinedOutput,\n\t\t\t\tdurationMs: Date.now() - startedAt,\n\t\t\t});\n\t\t});\n\t});\n}\n\nasync function startServer(): Promise<{\n\turl: string;\n\tclose: () => Promise<void>;\n\tshutdown: (options?: { skipSessionCleanup?: boolean }) => Promise<void>;\n}> {\n\t/*\n\t\tServer-only modules are loaded lazily because task-oriented subcommands like\n\t\t`kanban task create` and `kanban hooks ingest` do not need the runtime server.\n\n\t\tA regression in 25ba59f showed that eagerly importing the runtime stack here\n\t\tcould leave the source CLI process alive after the command had already printed\n\t\tits JSON result. The issue first appeared after the native Cline SDK runtime\n\t\twas added to the server import graph. We have not yet isolated the deepest\n\t\thandle creator inside that graph, so we keep command-style subcommands on the\n\t\tlightweight path and only load the server stack when we actually start Kanban.\n\t*/\n\tconst [\n\t\t{ resolveProjectInputPath },\n\t\t{ pickDirectoryPathFromSystemDialog },\n\t\t{ createRuntimeServer },\n\t\t{ createRuntimeStateHub },\n\t\t{ resolveInteractiveShellCommand },\n\t\t{ shutdownRuntimeServer },\n\t\t{ collectProjectWorktreeTaskIdsForRemoval, createWorkspaceRegistry },\n\t] = await Promise.all([\n\t\timport(\"./projects/project-path.js\"),\n\t\timport(\"./server/directory-picker.js\"),\n\t\timport(\"./server/runtime-server.js\"),\n\t\timport(\"./server/runtime-state-hub.js\"),\n\t\timport(\"./server/shell.js\"),\n\t\timport(\"./server/shutdown-coordinator.js\"),\n\t\timport(\"./server/workspace-registry.js\"),\n\t]);\n\tlet runtimeStateHub: RuntimeStateHub | undefined;\n\tconst workspaceRegistry = await createWorkspaceRegistry({\n\t\tcwd: process.cwd(),\n\t\tloadGlobalRuntimeConfig,\n\t\tloadRuntimeConfig,\n\t\thasGitRepository,\n\t\tpathIsDirectory,\n\t\tonTerminalManagerReady: (workspaceId, manager) => {\n\t\t\truntimeStateHub?.trackTerminalManager(workspaceId, manager);\n\t\t},\n\t});\n\truntimeStateHub = createRuntimeStateHub({\n\t\tworkspaceRegistry,\n\t});\n\tconst runtimeHub = runtimeStateHub;\n\tfor (const { workspaceId, terminalManager } of workspaceRegistry.listManagedWorkspaces()) {\n\t\truntimeHub.trackTerminalManager(workspaceId, terminalManager);\n\t}\n\n\tconst disposeTrackedWorkspace = (\n\t\tworkspaceId: string,\n\t\toptions?: {\n\t\t\tstopTerminalSessions?: boolean;\n\t\t},\n\t): { terminalManager: TerminalSessionManager | null; workspacePath: string | null } => {\n\t\tconst disposed = workspaceRegistry.disposeWorkspace(workspaceId, {\n\t\t\tstopTerminalSessions: options?.stopTerminalSessions,\n\t\t});\n\t\truntimeHub.disposeWorkspace(workspaceId);\n\t\treturn disposed;\n\t};\n\n\tconst runtimeServer = await createRuntimeServer({\n\t\tworkspaceRegistry,\n\t\truntimeStateHub: runtimeHub,\n\t\twarn: (message) => {\n\t\t\tconsole.warn(`[kanban] ${message}`);\n\t\t},\n\t\tensureTerminalManagerForWorkspace: workspaceRegistry.ensureTerminalManagerForWorkspace,\n\t\tresolveInteractiveShellCommand,\n\t\trunCommand: runScopedCommand,\n\t\tresolveProjectInputPath,\n\t\tassertPathIsDirectory,\n\t\thasGitRepository,\n\t\tdisposeWorkspace: disposeTrackedWorkspace,\n\t\tcollectProjectWorktreeTaskIdsForRemoval,\n\t\tpickDirectoryPathFromSystemDialog,\n\t});\n\n\tconst close = async () => {\n\t\tawait runtimeServer.close();\n\t};\n\n\tconst shutdown = async (options?: { skipSessionCleanup?: boolean }) => {\n\t\tawait shutdownRuntimeServer({\n\t\t\tworkspaceRegistry,\n\t\t\twarn: (message) => {\n\t\t\t\tconsole.warn(`[kanban] ${message}`);\n\t\t\t},\n\t\t\tcloseRuntimeServer: close,\n\t\t\tskipSessionCleanup: options?.skipSessionCleanup ?? false,\n\t\t});\n\t};\n\n\treturn {\n\t\turl: runtimeServer.url,\n\t\tclose,\n\t\tshutdown,\n\t};\n}\n\nasync function startServerWithAutoPortRetry(options: CliOptions): Promise<Awaited<ReturnType<typeof startServer>>> {\n\tif (options.port?.mode !== \"auto\") {\n\t\treturn await startServer();\n\t}\n\n\twhile (true) {\n\t\ttry {\n\t\t\treturn await startServer();\n\t\t} catch (error) {\n\t\t\tif (!isAddressInUseError(error)) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst currentPort = getKanbanRuntimePort();\n\t\t\tconst retryPort = await findAvailableRuntimePort(currentPort + 1);\n\t\t\tsetKanbanRuntimePort(retryPort);\n\t\t\tconsole.warn(`Runtime port ${currentPort} became busy during startup, retrying on ${retryPort}.`);\n\t\t}\n\t}\n}\n\nasync function runMainCommand(options: CliOptions, shouldAutoOpenBrowser: boolean): Promise<void> {\n\tif (options.host) {\n\t\tsetKanbanRuntimeHost(options.host);\n\t\tconsole.log(`Binding to host ${options.host}.`);\n\t}\n\n\tconst [{ openInBrowser }, { autoUpdateOnStartup, runPendingAutoUpdateOnShutdown }] = await Promise.all([\n\t\timport(\"./server/browser.js\"),\n\t\timport(\"./update/auto-update.js\"),\n\t]);\n\n\tconst selectedPort = await applyRuntimePortOption(options.port);\n\tif (selectedPort !== null) {\n\t\tconsole.log(`Using runtime port ${selectedPort}.`);\n\t}\n\n\tautoUpdateOnStartup({\n\t\tcurrentVersion: KANBAN_VERSION,\n\t});\n\n\tlet runtime: Awaited<ReturnType<typeof startServer>>;\n\ttry {\n\t\truntime = await startServerWithAutoPortRetry(options);\n\t} catch (error) {\n\t\tif (\n\t\t\toptions.port?.mode !== \"auto\" &&\n\t\t\tisAddressInUseError(error) &&\n\t\t\t(await tryOpenExistingServer({ noOpen: options.noOpen, shouldAutoOpenBrowser }))\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthrow error;\n\t}\n\tconsole.log(`Kanban running at ${runtime.url}`);\n\tif (!options.noOpen && shouldAutoOpenBrowser) {\n\t\ttry {\n\t\t\topenInBrowser(runtime.url, {\n\t\t\t\twarn: (message) => {\n\t\t\t\t\tconsole.warn(message);\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.warn(`Could not open browser automatically: ${message}`);\n\t\t}\n\t}\n\tconsole.log(\"Press Ctrl+C to stop.\");\n\n\tlet isShuttingDown = false;\n\tconst shutdown = async (signal: NodeJS.Signals | null) => {\n\t\tif (isShuttingDown) {\n\t\t\tprocess.exit(130);\n\t\t\treturn;\n\t\t}\n\t\tisShuttingDown = true;\n\t\trunPendingAutoUpdateOnShutdown();\n\t\ttry {\n\t\t\tif (options.skipShutdownCleanup) {\n\t\t\t\tconsole.warn(\"Skipping shutdown task cleanup for this instance.\");\n\t\t\t}\n\t\t\tawait runtime.shutdown({\n\t\t\t\tskipSessionCleanup: options.skipShutdownCleanup,\n\t\t\t});\n\t\t\tprocess.exit(signal ? 130 : 0);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconsole.error(`Shutdown failed: ${message}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t};\n\n\tcloseWithGrace(\n\t\t{\n\t\t\tdelay: 10000,\n\t\t\tskip: [\"uncaughtException\", \"unhandledRejection\", \"beforeExit\"],\n\t\t\tonTimeout: (delayMs) => {\n\t\t\t\tconsole.error(`Forced exit after shutdown timeout (${delayMs}ms).`);\n\t\t\t},\n\t\t\tonSecondSignal: (signal) => {\n\t\t\t\tconsole.error(`Forced exit on second signal: ${signal}`);\n\t\t\t},\n\t\t},\n\t\tasync ({ signal }) => {\n\t\t\tawait shutdown(signal ?? null);\n\t\t},\n\t);\n}\n\nfunction createProgram(invocationArgs: string[]): Command {\n\tconst shouldAutoOpenBrowser = shouldAutoOpenBrowserTabForInvocation(invocationArgs);\n\tconst program = new Command();\n\tprogram\n\t\t.name(\"kanban\")\n\t\t.description(\"Local orchestration board for coding agents.\")\n\t\t.version(KANBAN_VERSION, \"-v, --version\", \"Output the version number\")\n\t\t.option(\"--host <ip>\", \"Host IP to bind the server to (default: 127.0.0.1).\")\n\t\t.option(\"--port <number|auto>\", \"Runtime port (1-65535) or auto.\", parseCliPortValue)\n\t\t.option(\"--no-open\", \"Do not open browser automatically.\")\n\t\t.option(\"--skip-shutdown-cleanup\", \"Do not move sessions to trash or delete task worktrees on shutdown.\")\n\t\t.showHelpAfterError()\n\t\t.addHelpText(\"after\", `\\nRuntime URL: ${getKanbanRuntimeOrigin()}`);\n\n\tprogram.addOption(\n\t\tnew Option(\"--agent <id>\", \"Deprecated compatibility flag. Ignored.\")\n\t\t\t.hideHelp(),\n\t);\n\n\tregisterTaskCommand(program);\n\tregisterHooksCommand(program);\n\n\tprogram\n\t\t.command(\"mcp\")\n\t\t.description(\"Deprecated compatibility command.\")\n\t\t.action(() => {\n\t\t\tconsole.warn(\"Deprecated. Please uninstall Kanban MCP.\");\n\t\t});\n\n\tprogram.action(async (options: RootCommandOptions) => {\n\t\tawait runMainCommand({\n\t\t\thost: options.host ?? null,\n\t\t\tport: options.port ?? null,\n\t\t\tnoOpen: options.open === false,\n\t\t\tskipShutdownCleanup: options.skipShutdownCleanup === true,\n\t\t}, shouldAutoOpenBrowser);\n\t});\n\n\treturn program;\n}\n\nasync function run(): Promise<void> {\n\tconst argv = process.argv.slice(2);\n\tconst program = createProgram(argv);\n\tawait program.parseAsync(argv, { from: \"user\" });\n}\n\nrun().catch((error) => {\n\tconst message = error instanceof Error ? error.message : String(error);\n\tconsole.error(`Failed to start Kanban: ${message}`);\n\tprocess.exit(1);\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"cline-event-adapter.d.ts","sourceRoot":"","sources":["../../src/cline-sdk/cline-event-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAGzE,OAAO,EAGN,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAc1B,MAAM,0BAA0B,CAAC;AAalC,MAAM,WAAW,2BAA2B;IAC3C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,qBAAqB,CAAC;IAC7B,wBAAwB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,WAAW,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC1D,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACjE;AAgHD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAOnE;AAGD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,IAAI,CA2U/E"}
1
+ {"version":3,"file":"cline-event-adapter.d.ts","sourceRoot":"","sources":["../../src/cline-sdk/cline-event-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAGzE,OAAO,EAGN,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAc1B,MAAM,0BAA0B,CAAC;AAalC,MAAM,WAAW,2BAA2B;IAC3C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,qBAAqB,CAAC;IAC7B,wBAAwB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,WAAW,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC1D,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACjE;AAgHD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAOnE;AAGD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,IAAI,CA+U/E"}
@@ -416,7 +416,10 @@ export function applyClineSessionEvent(input) {
416
416
  clearActiveTurnState(entry);
417
417
  }
418
418
  emitSummary(input, {
419
- state: statusEvent.payload.status === "running" ? "running" : entry.summary.state,
419
+ state: statusEvent.payload.status === "running" &&
420
+ !(entry.summary.state === "awaiting_review" && canReturnToRunning(entry.summary.reviewReason))
421
+ ? "running"
422
+ : entry.summary.state,
420
423
  lastOutputAt: now(),
421
424
  });
422
425
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cline-event-adapter.js","sourceRoot":"","sources":["../../src/cline-sdk/cline-event-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["// Translates raw SDK session events into Kanban summary and message mutations.\n// Keep protocol-specific parsing here so the runtime and repository can stay\n// focused on lifecycle, storage, and task-facing orchestration.\nimport type { RuntimeTaskSessionSummary } from \"../core/api-contract.js\";\nimport { formatClineToolCallLabel, getClineToolCallDisplay } from \"./cline-tool-call-display.js\";\nimport type { ClineSdkAgentEvent, ClineSdkSessionEvent } from \"./sdk-runtime-boundary.js\";\nimport {\n\tappendAssistantChunk,\n\tappendReasoningChunk,\n\ttype ClineTaskMessage,\n\ttype ClineTaskSessionEntry,\n\tcanReturnToRunning,\n\tclearActiveTurnState,\n\tcreateAssistantMessage,\n\tcreateMessage,\n\tcreateReasoningMessage,\n\tfinishToolCallMessage,\n\tisClineUserAttentionTool,\n\tlatestAssistantMessageMatches,\n\tnow,\n\tsetOrCreateAssistantMessage,\n\tsetOrCreateReasoningMessage,\n\tstartToolCallMessage,\n\tupdateSummary,\n} from \"./cline-session-state.js\";\n\nfunction toPreviewText(value: string | null | undefined, maxLength = 160): string | null {\n\tif (typeof value !== \"string\") {\n\t\treturn null;\n\t}\n\tconst normalized = value.replace(/\\s+/g, \" \").trim();\n\tif (!normalized) {\n\t\treturn null;\n\t}\n\treturn normalized.length > maxLength ? `${normalized.slice(0, maxLength - 1).trimEnd()}…` : normalized;\n}\n\nexport interface ApplyClineSessionEventInput {\n\tevent: unknown;\n\ttaskId: string;\n\tentry: ClineTaskSessionEntry;\n\tpendingTurnCancelTaskIds: Set<string>;\n\temitSummary: (summary: RuntimeTaskSessionSummary) => void;\n\temitMessage: (taskId: string, message: ClineTaskMessage) => void;\n}\n\ntype ClineSdkChunkEvent = Extract<ClineSdkSessionEvent, { type: \"chunk\" }>;\ntype ClineSdkHookEvent = Extract<ClineSdkSessionEvent, { type: \"hook\" }>;\ntype ClineSdkEndedEvent = Extract<ClineSdkSessionEvent, { type: \"ended\" }>;\ntype ClineSdkStatusEvent = Extract<ClineSdkSessionEvent, { type: \"status\" }>;\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n\treturn value && typeof value === \"object\" ? (value as Record<string, unknown>) : null;\n}\n\nfunction readAgentEvent(event: unknown): ClineSdkAgentEvent | null {\n\tconst record = asRecord(event);\n\tif (!record || record.type !== \"agent_event\") {\n\t\treturn null;\n\t}\n\tconst payload = asRecord(record.payload);\n\tif (!payload) {\n\t\treturn null;\n\t}\n\tconst agentEvent = asRecord(payload.event);\n\tif (!agentEvent || typeof agentEvent.type !== \"string\") {\n\t\treturn null;\n\t}\n\treturn agentEvent as unknown as ClineSdkAgentEvent;\n}\n\nfunction readChunkEvent(event: unknown): ClineSdkChunkEvent | null {\n\tconst record = asRecord(event);\n\tif (!record || record.type !== \"chunk\") {\n\t\treturn null;\n\t}\n\tconst payload = asRecord(record.payload);\n\tif (!payload || typeof payload.sessionId !== \"string\" || typeof payload.chunk !== \"string\") {\n\t\treturn null;\n\t}\n\tif (payload.stream !== \"stdout\" && payload.stream !== \"stderr\" && payload.stream !== \"agent\") {\n\t\treturn null;\n\t}\n\treturn { type: \"chunk\", payload: payload as ClineSdkChunkEvent[\"payload\"] };\n}\n\nfunction readHookEvent(event: unknown): ClineSdkHookEvent | null {\n\tconst record = asRecord(event);\n\tif (!record || record.type !== \"hook\") {\n\t\treturn null;\n\t}\n\tconst payload = asRecord(record.payload);\n\tif (!payload || typeof payload.sessionId !== \"string\") {\n\t\treturn null;\n\t}\n\treturn { type: \"hook\", payload: payload as ClineSdkHookEvent[\"payload\"] };\n}\n\nfunction readEndedEvent(event: unknown): ClineSdkEndedEvent | null {\n\tconst record = asRecord(event);\n\tif (!record || record.type !== \"ended\") {\n\t\treturn null;\n\t}\n\tconst payload = asRecord(record.payload);\n\tif (!payload || typeof payload.sessionId !== \"string\" || typeof payload.reason !== \"string\") {\n\t\treturn null;\n\t}\n\treturn { type: \"ended\", payload: payload as ClineSdkEndedEvent[\"payload\"] };\n}\n\nfunction readStatusEvent(event: unknown): ClineSdkStatusEvent | null {\n\tconst record = asRecord(event);\n\tif (!record || record.type !== \"status\") {\n\t\treturn null;\n\t}\n\tconst payload = asRecord(record.payload);\n\tif (!payload || typeof payload.sessionId !== \"string\" || typeof payload.status !== \"string\") {\n\t\treturn null;\n\t}\n\treturn { type: \"status\", payload: payload as ClineSdkStatusEvent[\"payload\"] };\n}\n\nfunction getRetainedClineToolActivity(entry: ClineTaskSessionEntry): {\n\ttoolName: string | null;\n\ttoolInputSummary: string | null;\n} {\n\tconst latestHookActivity = entry.summary.latestHookActivity;\n\tif (!latestHookActivity || latestHookActivity.source !== \"cline-sdk\" || !latestHookActivity.toolName) {\n\t\treturn {\n\t\t\ttoolName: null,\n\t\t\ttoolInputSummary: null,\n\t\t};\n\t}\n\n\treturn {\n\t\ttoolName: latestHookActivity.toolName,\n\t\ttoolInputSummary: latestHookActivity.toolInputSummary ?? null,\n\t};\n}\n\nfunction extractAgentErrorMessage(error: unknown): string | null {\n\tif (typeof error === \"string\") {\n\t\tconst normalized = error.trim();\n\t\treturn normalized.length > 0 ? normalized : null;\n\t}\n\tif (error instanceof Error) {\n\t\tconst normalized = error.message.trim();\n\t\treturn normalized.length > 0 ? normalized : null;\n\t}\n\tif (error && typeof error === \"object\" && \"message\" in error && typeof error.message === \"string\") {\n\t\tconst normalized = error.message.trim();\n\t\treturn normalized.length > 0 ? normalized : null;\n\t}\n\treturn null;\n}\n\nexport function extractClineSessionId(event: unknown): string | null {\n\tconst record = asRecord(event);\n\tif (!record) {\n\t\treturn null;\n\t}\n\tconst payload = asRecord(record.payload);\n\treturn payload && typeof payload.sessionId === \"string\" ? payload.sessionId : null;\n}\n\n// Translate raw SDK events into Kanban summary and chat mutations so the session service can stay focused on host ownership.\nexport function applyClineSessionEvent(input: ApplyClineSessionEventInput): void {\n\tconst { entry, event, taskId } = input;\n\tconst agentEvent = readAgentEvent(event);\n\tconst chunkEvent = readChunkEvent(event);\n\tconst hookEvent = readHookEvent(event);\n\tconst endedEvent = readEndedEvent(event);\n\tconst statusEvent = readStatusEvent(event);\n\n\tif (agentEvent?.type === \"error\") {\n\t\tconst errorMessage =\n\t\t\t\"error\" in agentEvent ? extractAgentErrorMessage(agentEvent.error) : null;\n\t\tconst recoverable = typeof agentEvent.recoverable === \"boolean\" ? agentEvent.recoverable : false;\n\t\tconst retainedToolActivity = getRetainedClineToolActivity(entry);\n\t\tif (!recoverable) {\n\t\t\tclearActiveTurnState(entry);\n\t\t}\n\t\tif (recoverable && errorMessage) {\n\t\t\tconst retryMsg = createMessage(taskId, \"system\", `Retrying: ${errorMessage}`);\n\t\t\tentry.messages.push(retryMsg);\n\t\t\tinput.emitMessage(taskId, retryMsg);\n\t\t}\n\t\temitSummary(input, {\n\t\t\t...(recoverable\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\tstate: \"failed\",\n\t\t\t\t\t\treviewReason: \"error\",\n\t\t\t\t\t}),\n\t\t\tlastOutputAt: now(),\n\t\t\tlastHookAt: now(),\n\t\t\tlatestHookActivity: {\n\t\t\t\tactivityText: recoverable\n\t\t\t\t\t? `Retrying after error: ${errorMessage ?? \"Unknown agent error\"}`\n\t\t\t\t\t: `Agent error: ${errorMessage ?? \"Unknown agent error\"}`,\n\t\t\t\ttoolName: retainedToolActivity.toolName,\n\t\t\t\ttoolInputSummary: retainedToolActivity.toolInputSummary,\n\t\t\t\tfinalMessage: recoverable ? null : (errorMessage ?? \"Unknown agent error\"),\n\t\t\t\thookEventName: \"agent_error\",\n\t\t\t\tnotificationType: null,\n\t\t\t\tsource: \"cline-sdk\",\n\t\t\t},\n\t\t});\n\t\treturn;\n\t}\n\n\tif (agentEvent?.type === \"content_start\" && agentEvent.contentType === \"text\") {\n\t\tconst accumulated = typeof agentEvent.accumulated === \"string\" ? agentEvent.accumulated : null;\n\t\tconst text = typeof agentEvent.text === \"string\" ? agentEvent.text : null;\n\t\tif (typeof accumulated === \"string\") {\n\t\t\tconst message =\n\t\t\t\tsetOrCreateAssistantMessage(entry, taskId, accumulated) ??\n\t\t\t\tcreateAssistantMessage(entry, taskId, accumulated);\n\t\t\tinput.emitMessage(taskId, message);\n\t\t} else if (typeof text === \"string\" && text.length > 0) {\n\t\t\tinput.emitMessage(taskId, appendAssistantChunk(entry, taskId, text));\n\t\t}\n\t\tconst previewText = toPreviewText(accumulated ?? text);\n\t\tconst retainedToolActivity = getRetainedClineToolActivity(entry);\n\t\temitSummary(input, {\n\t\t\tstate: \"running\",\n\t\t\tlastOutputAt: now(),\n\t\t\tlastHookAt: now(),\n\t\t\tlatestHookActivity: {\n\t\t\t\tactivityText: previewText ?? \"Agent active\",\n\t\t\t\ttoolName: retainedToolActivity.toolName,\n\t\t\t\ttoolInputSummary: retainedToolActivity.toolInputSummary,\n\t\t\t\tfinalMessage: previewText,\n\t\t\t\thookEventName: \"assistant_delta\",\n\t\t\t\tnotificationType: null,\n\t\t\t\tsource: \"cline-sdk\",\n\t\t\t},\n\t\t});\n\t\treturn;\n\t}\n\n\tif (agentEvent?.type === \"notice\") {\n\t\tconst message = typeof agentEvent.message === \"string\" ? agentEvent.message.trim() : \"\";\n\t\tif (message) {\n\t\t\tconst displayRole = typeof agentEvent.displayRole === \"string\" ? agentEvent.displayRole : \"system\";\n\t\t\tconst reason = typeof agentEvent.reason === \"string\" ? agentEvent.reason : null;\n\t\t\tconst noticeType = typeof agentEvent.noticeType === \"string\" ? agentEvent.noticeType : null;\n\t\t\tconst normalizedRole = displayRole === \"status\" ? \"status\" : \"system\";\n\t\t\tconst noticeMessage = createMessage(taskId, normalizedRole, message);\n\t\t\tnoticeMessage.meta = {\n\t\t\t\thookEventName: \"agent_notice\",\n\t\t\t\tmessageKind: noticeType,\n\t\t\t\tdisplayRole,\n\t\t\t\treason,\n\t\t\t};\n\t\t\tentry.messages.push(noticeMessage);\n\t\t\tinput.emitMessage(taskId, noticeMessage);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (agentEvent?.type === \"done\") {\n\t\tconst finalText = typeof agentEvent.text === \"string\" ? agentEvent.text.trim() : \"\";\n\t\tif (finalText) {\n\t\t\tconst message = setOrCreateAssistantMessage(entry, taskId, finalText);\n\t\t\tif (message) {\n\t\t\t\tinput.emitMessage(taskId, message);\n\t\t\t} else if (!latestAssistantMessageMatches(entry, finalText)) {\n\t\t\t\tconst assistantMessage = createMessage(taskId, \"assistant\", finalText);\n\t\t\t\tentry.messages.push(assistantMessage);\n\t\t\t\tinput.emitMessage(taskId, assistantMessage);\n\t\t\t}\n\t\t}\n\n\t\tconst doneReason = typeof agentEvent.reason === \"string\" ? agentEvent.reason : \"completed\";\n\t\tif (doneReason === \"aborted\" && input.pendingTurnCancelTaskIds.has(taskId)) {\n\t\t\temitTurnCanceled(input);\n\t\t\treturn;\n\t\t}\n\n\t\tconst summaryPatch: Partial<RuntimeTaskSessionSummary> = {\n\t\t\tlastOutputAt: now(),\n\t\t\tlastHookAt: now(),\n\t\t\tlatestHookActivity: {\n\t\t\t\tactivityText: finalText ? `Final: ${finalText}` : \"Waiting for review\",\n\t\t\t\ttoolName: null,\n\t\t\t\ttoolInputSummary: null,\n\t\t\t\tfinalMessage: finalText || null,\n\t\t\t\thookEventName: \"agent_end\",\n\t\t\t\tnotificationType: null,\n\t\t\t\tsource: \"cline-sdk\",\n\t\t\t},\n\t\t};\n\t\tif (doneReason === \"aborted\") {\n\t\t\tsummaryPatch.state = \"interrupted\";\n\t\t\tsummaryPatch.reviewReason = \"interrupted\";\n\t\t} else if (doneReason === \"error\") {\n\t\t\tsummaryPatch.state = \"awaiting_review\";\n\t\t\tsummaryPatch.reviewReason = \"error\";\n\t\t} else {\n\t\t\tsummaryPatch.state = \"awaiting_review\";\n\t\t\tsummaryPatch.reviewReason = \"hook\";\n\t\t}\n\n\t\tclearActiveTurnState(entry);\n\t\temitSummary(input, summaryPatch);\n\t\treturn;\n\t}\n\n\tif (agentEvent?.type === \"content_start\" && agentEvent.contentType === \"reasoning\") {\n\t\tconst reasoning = typeof agentEvent.reasoning === \"string\" ? agentEvent.reasoning : null;\n\t\tif (reasoning && reasoning.length > 0) {\n\t\t\tinput.emitMessage(taskId, appendReasoningChunk(entry, taskId, reasoning));\n\t\t\temitSummary(input, {\n\t\t\t\tstate: \"running\",\n\t\t\t\tlastOutputAt: now(),\n\t\t\t});\n\t\t}\n\t\treturn;\n\t}\n\n\tif (agentEvent?.type === \"content_end\" && agentEvent.contentType === \"reasoning\") {\n\t\tconst reasoning = typeof agentEvent.reasoning === \"string\" ? agentEvent.reasoning : null;\n\t\tif (reasoning) {\n\t\t\tconst message =\n\t\t\t\tsetOrCreateReasoningMessage(entry, taskId, reasoning) ?? createReasoningMessage(entry, taskId, reasoning);\n\t\t\tinput.emitMessage(taskId, message);\n\t\t}\n\t\tentry.activeReasoningMessageId = null;\n\t\temitSummary(input, {\n\t\t\tlastOutputAt: now(),\n\t\t});\n\t\treturn;\n\t}\n\n\tif (agentEvent?.type === \"content_start\" && agentEvent.contentType === \"tool\") {\n\t\tconst toolName = typeof agentEvent.toolName === \"string\" ? agentEvent.toolName : null;\n\t\tconst toolCallId = typeof agentEvent.toolCallId === \"string\" ? agentEvent.toolCallId : null;\n\t\tconst toolInput = agentEvent.input;\n\t\tconst toolDisplay = getClineToolCallDisplay(toolName, toolInput);\n\t\tconst isUserAttentionTool = isClineUserAttentionTool(toolName);\n\t\tinput.emitMessage(\n\t\t\ttaskId,\n\t\t\tstartToolCallMessage(entry, taskId, {\n\t\t\t\ttoolName,\n\t\t\t\ttoolCallId,\n\t\t\t\tinput: toolInput,\n\t\t\t}),\n\t\t);\n\t\tconst summaryPatch: Partial<RuntimeTaskSessionSummary> = {\n\t\t\tlastOutputAt: now(),\n\t\t\tlastHookAt: now(),\n\t\t\tlatestHookActivity: {\n\t\t\t\tactivityText: `Using ${formatClineToolCallLabel(toolDisplay.toolName, toolDisplay.inputSummary)}`,\n\t\t\t\ttoolName: toolDisplay.toolName,\n\t\t\t\ttoolInputSummary: toolDisplay.inputSummary,\n\t\t\t\tfinalMessage: null,\n\t\t\t\thookEventName: \"tool_call\",\n\t\t\t\tnotificationType: isUserAttentionTool ? \"user_attention\" : null,\n\t\t\t\tsource: \"cline-sdk\",\n\t\t\t},\n\t\t};\n\t\tif (isUserAttentionTool && entry.summary.state === \"running\") {\n\t\t\tsummaryPatch.state = \"awaiting_review\";\n\t\t\tsummaryPatch.reviewReason = \"hook\";\n\t\t} else if (!isUserAttentionTool && canReturnToRunning(entry.summary.reviewReason)) {\n\t\t\tsummaryPatch.state = \"running\";\n\t\t\tsummaryPatch.reviewReason = null;\n\t\t}\n\t\temitSummary(input, summaryPatch);\n\t\treturn;\n\t}\n\n\tif (agentEvent?.type === \"content_end\" && agentEvent.contentType === \"tool\") {\n\t\tconst toolName = typeof agentEvent.toolName === \"string\" ? agentEvent.toolName : null;\n\t\tconst toolCallId = typeof agentEvent.toolCallId === \"string\" ? agentEvent.toolCallId : null;\n\t\tconst toolOutput = agentEvent.output;\n\t\tconst toolError = typeof agentEvent.error === \"string\" ? agentEvent.error : null;\n\t\tconst durationMs = typeof agentEvent.durationMs === \"number\" ? agentEvent.durationMs : null;\n\t\tconst toolInput = toolCallId ? entry.toolInputByToolCallId.get(toolCallId) : undefined;\n\t\tconst toolDisplay = getClineToolCallDisplay(toolName, toolInput);\n\t\tconst isUserAttentionTool = isClineUserAttentionTool(toolName);\n\t\tinput.emitMessage(\n\t\t\ttaskId,\n\t\t\tfinishToolCallMessage(entry, taskId, {\n\t\t\t\ttoolName,\n\t\t\t\ttoolCallId,\n\t\t\t\toutput: toolOutput,\n\t\t\t\terror: toolError,\n\t\t\t\tdurationMs,\n\t\t\t}),\n\t\t);\n\t\tconst summaryPatch: Partial<RuntimeTaskSessionSummary> = {\n\t\t\tlastOutputAt: now(),\n\t\t\tlastHookAt: now(),\n\t\t\tlatestHookActivity: {\n\t\t\t\tactivityText: `${toolError ? \"Failed\" : \"Completed\"} ${formatClineToolCallLabel(toolDisplay.toolName, toolDisplay.inputSummary)}`,\n\t\t\t\ttoolName: toolDisplay.toolName,\n\t\t\t\ttoolInputSummary: toolDisplay.inputSummary,\n\t\t\t\tfinalMessage: null,\n\t\t\t\thookEventName: \"tool_result\",\n\t\t\t\tnotificationType: null,\n\t\t\t\tsource: \"cline-sdk\",\n\t\t\t},\n\t\t};\n\t\tif (isUserAttentionTool && canReturnToRunning(entry.summary.reviewReason)) {\n\t\t\tsummaryPatch.state = \"running\";\n\t\t\tsummaryPatch.reviewReason = null;\n\t\t}\n\t\temitSummary(input, summaryPatch);\n\t\treturn;\n\t}\n\n\tif (agentEvent?.type === \"content_end\" && agentEvent.contentType === \"text\") {\n\t\tconst text = typeof agentEvent.text === \"string\" ? agentEvent.text : null;\n\t\tif (text) {\n\t\t\tconst message =\n\t\t\t\tsetOrCreateAssistantMessage(entry, taskId, text) ?? createAssistantMessage(entry, taskId, text);\n\t\t\tinput.emitMessage(taskId, message);\n\t\t}\n\t\tentry.activeAssistantMessageId = null;\n\t\temitSummary(input, {\n\t\t\tlastOutputAt: now(),\n\t\t});\n\t\treturn;\n\t}\n\n\tif (chunkEvent?.payload.stream === \"agent\") {\n\t\tconst chunk = chunkEvent.payload.chunk;\n\t\tif (chunk.length === 0 || isLikelySerializedAgentEventChunk(chunk)) {\n\t\t\treturn;\n\t\t}\n\t\tinput.emitMessage(taskId, appendAssistantChunk(entry, taskId, chunk));\n\t\tconst previewText = toPreviewText(chunk);\n\t\tconst retainedToolActivity = getRetainedClineToolActivity(entry);\n\t\temitSummary(input, {\n\t\t\tstate: \"running\",\n\t\t\tlastOutputAt: now(),\n\t\t\tlastHookAt: now(),\n\t\t\tlatestHookActivity: {\n\t\t\t\tactivityText: previewText ?? \"Agent active\",\n\t\t\t\ttoolName: retainedToolActivity.toolName,\n\t\t\t\ttoolInputSummary: retainedToolActivity.toolInputSummary,\n\t\t\t\tfinalMessage: previewText,\n\t\t\t\thookEventName: \"assistant_delta\",\n\t\t\t\tnotificationType: null,\n\t\t\t\tsource: \"cline-sdk\",\n\t\t\t},\n\t\t});\n\t\treturn;\n\t}\n\n\tif (hookEvent) {\n\t\tconst hookEventName =\n\t\t\ttypeof hookEvent.payload.hookEventName === \"string\" ? hookEvent.payload.hookEventName : null;\n\t\tconst toolName = typeof hookEvent.payload.toolName === \"string\" ? hookEvent.payload.toolName : null;\n\t\tconst activityText = hookEventName && toolName ? `${hookEventName}: ${toolName}` : hookEventName;\n\t\temitSummary(input, {\n\t\t\tlastHookAt: now(),\n\t\t\tlatestHookActivity: {\n\t\t\t\tactivityText,\n\t\t\t\ttoolName,\n\t\t\t\ttoolInputSummary: null,\n\t\t\t\tfinalMessage: null,\n\t\t\t\thookEventName,\n\t\t\t\tnotificationType: null,\n\t\t\t\tsource: \"cline-sdk\",\n\t\t\t},\n\t\t});\n\t\treturn;\n\t}\n\n\tif (endedEvent) {\n\t\tconst interrupted =\n\t\t\tendedEvent.payload.reason.includes(\"abort\") || endedEvent.payload.reason.includes(\"interrupt\");\n\t\tif (interrupted && input.pendingTurnCancelTaskIds.has(taskId)) {\n\t\t\temitTurnCanceled(input);\n\t\t\treturn;\n\t\t}\n\t\tclearActiveTurnState(entry);\n\t\temitSummary(input, {\n\t\t\tstate: interrupted ? \"interrupted\" : \"awaiting_review\",\n\t\t\treviewReason: interrupted ? \"interrupted\" : \"exit\",\n\t\t\tlastOutputAt: now(),\n\t\t});\n\t\treturn;\n\t}\n\n\tif (statusEvent) {\n\t\tif (statusEvent.payload.status !== \"running\") {\n\t\t\tclearActiveTurnState(entry);\n\t\t}\n\t\temitSummary(input, {\n\t\t\tstate: statusEvent.payload.status === \"running\" ? \"running\" : entry.summary.state,\n\t\t\tlastOutputAt: now(),\n\t\t});\n\t}\n}\n\nfunction emitSummary(input: ApplyClineSessionEventInput, patch: Partial<RuntimeTaskSessionSummary>): void {\n\tinput.emitSummary(updateSummary(input.entry, patch));\n}\n\nfunction emitTurnCanceled(input: ApplyClineSessionEventInput): void {\n\tinput.pendingTurnCancelTaskIds.delete(input.taskId);\n\tclearActiveTurnState(input.entry);\n\temitSummary(input, {\n\t\tstate: \"idle\",\n\t\treviewReason: null,\n\t\tlastOutputAt: now(),\n\t\tlastHookAt: now(),\n\t\tlatestHookActivity: {\n\t\t\tactivityText: \"Turn canceled\",\n\t\t\ttoolName: null,\n\t\t\ttoolInputSummary: null,\n\t\t\tfinalMessage: null,\n\t\t\thookEventName: \"turn_canceled\",\n\t\t\tnotificationType: null,\n\t\t\tsource: \"cline-sdk\",\n\t\t},\n\t});\n}\n\nfunction isLikelySerializedAgentEventChunk(chunk: string): boolean {\n\tconst trimmed = chunk.trim();\n\tif (!trimmed) {\n\t\treturn false;\n\t}\n\tif (!(trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\"))) {\n\t\treturn false;\n\t}\n\ttry {\n\t\tconst parsed = JSON.parse(trimmed);\n\t\treturn Boolean(parsed && typeof parsed === \"object\" && \"type\" in parsed);\n\t} catch {\n\t\treturn false;\n\t}\n}\n"]}
1
+ {"version":3,"file":"cline-event-adapter.js","sourceRoot":"","sources":["../../src/cline-sdk/cline-event-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["// Translates raw SDK session events into Kanban summary and message mutations.\n// Keep protocol-specific parsing here so the runtime and repository can stay\n// focused on lifecycle, storage, and task-facing orchestration.\nimport type { RuntimeTaskSessionSummary } from \"../core/api-contract.js\";\nimport { formatClineToolCallLabel, getClineToolCallDisplay } from \"./cline-tool-call-display.js\";\nimport type { ClineSdkAgentEvent, ClineSdkSessionEvent } from \"./sdk-runtime-boundary.js\";\nimport {\n\tappendAssistantChunk,\n\tappendReasoningChunk,\n\ttype ClineTaskMessage,\n\ttype ClineTaskSessionEntry,\n\tcanReturnToRunning,\n\tclearActiveTurnState,\n\tcreateAssistantMessage,\n\tcreateMessage,\n\tcreateReasoningMessage,\n\tfinishToolCallMessage,\n\tisClineUserAttentionTool,\n\tlatestAssistantMessageMatches,\n\tnow,\n\tsetOrCreateAssistantMessage,\n\tsetOrCreateReasoningMessage,\n\tstartToolCallMessage,\n\tupdateSummary,\n} from \"./cline-session-state.js\";\n\nfunction toPreviewText(value: string | null | undefined, maxLength = 160): string | null {\n\tif (typeof value !== \"string\") {\n\t\treturn null;\n\t}\n\tconst normalized = value.replace(/\\s+/g, \" \").trim();\n\tif (!normalized) {\n\t\treturn null;\n\t}\n\treturn normalized.length > maxLength ? `${normalized.slice(0, maxLength - 1).trimEnd()}…` : normalized;\n}\n\nexport interface ApplyClineSessionEventInput {\n\tevent: unknown;\n\ttaskId: string;\n\tentry: ClineTaskSessionEntry;\n\tpendingTurnCancelTaskIds: Set<string>;\n\temitSummary: (summary: RuntimeTaskSessionSummary) => void;\n\temitMessage: (taskId: string, message: ClineTaskMessage) => void;\n}\n\ntype ClineSdkChunkEvent = Extract<ClineSdkSessionEvent, { type: \"chunk\" }>;\ntype ClineSdkHookEvent = Extract<ClineSdkSessionEvent, { type: \"hook\" }>;\ntype ClineSdkEndedEvent = Extract<ClineSdkSessionEvent, { type: \"ended\" }>;\ntype ClineSdkStatusEvent = Extract<ClineSdkSessionEvent, { type: \"status\" }>;\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n\treturn value && typeof value === \"object\" ? (value as Record<string, unknown>) : null;\n}\n\nfunction readAgentEvent(event: unknown): ClineSdkAgentEvent | null {\n\tconst record = asRecord(event);\n\tif (!record || record.type !== \"agent_event\") {\n\t\treturn null;\n\t}\n\tconst payload = asRecord(record.payload);\n\tif (!payload) {\n\t\treturn null;\n\t}\n\tconst agentEvent = asRecord(payload.event);\n\tif (!agentEvent || typeof agentEvent.type !== \"string\") {\n\t\treturn null;\n\t}\n\treturn agentEvent as unknown as ClineSdkAgentEvent;\n}\n\nfunction readChunkEvent(event: unknown): ClineSdkChunkEvent | null {\n\tconst record = asRecord(event);\n\tif (!record || record.type !== \"chunk\") {\n\t\treturn null;\n\t}\n\tconst payload = asRecord(record.payload);\n\tif (!payload || typeof payload.sessionId !== \"string\" || typeof payload.chunk !== \"string\") {\n\t\treturn null;\n\t}\n\tif (payload.stream !== \"stdout\" && payload.stream !== \"stderr\" && payload.stream !== \"agent\") {\n\t\treturn null;\n\t}\n\treturn { type: \"chunk\", payload: payload as ClineSdkChunkEvent[\"payload\"] };\n}\n\nfunction readHookEvent(event: unknown): ClineSdkHookEvent | null {\n\tconst record = asRecord(event);\n\tif (!record || record.type !== \"hook\") {\n\t\treturn null;\n\t}\n\tconst payload = asRecord(record.payload);\n\tif (!payload || typeof payload.sessionId !== \"string\") {\n\t\treturn null;\n\t}\n\treturn { type: \"hook\", payload: payload as ClineSdkHookEvent[\"payload\"] };\n}\n\nfunction readEndedEvent(event: unknown): ClineSdkEndedEvent | null {\n\tconst record = asRecord(event);\n\tif (!record || record.type !== \"ended\") {\n\t\treturn null;\n\t}\n\tconst payload = asRecord(record.payload);\n\tif (!payload || typeof payload.sessionId !== \"string\" || typeof payload.reason !== \"string\") {\n\t\treturn null;\n\t}\n\treturn { type: \"ended\", payload: payload as ClineSdkEndedEvent[\"payload\"] };\n}\n\nfunction readStatusEvent(event: unknown): ClineSdkStatusEvent | null {\n\tconst record = asRecord(event);\n\tif (!record || record.type !== \"status\") {\n\t\treturn null;\n\t}\n\tconst payload = asRecord(record.payload);\n\tif (!payload || typeof payload.sessionId !== \"string\" || typeof payload.status !== \"string\") {\n\t\treturn null;\n\t}\n\treturn { type: \"status\", payload: payload as ClineSdkStatusEvent[\"payload\"] };\n}\n\nfunction getRetainedClineToolActivity(entry: ClineTaskSessionEntry): {\n\ttoolName: string | null;\n\ttoolInputSummary: string | null;\n} {\n\tconst latestHookActivity = entry.summary.latestHookActivity;\n\tif (!latestHookActivity || latestHookActivity.source !== \"cline-sdk\" || !latestHookActivity.toolName) {\n\t\treturn {\n\t\t\ttoolName: null,\n\t\t\ttoolInputSummary: null,\n\t\t};\n\t}\n\n\treturn {\n\t\ttoolName: latestHookActivity.toolName,\n\t\ttoolInputSummary: latestHookActivity.toolInputSummary ?? null,\n\t};\n}\n\nfunction extractAgentErrorMessage(error: unknown): string | null {\n\tif (typeof error === \"string\") {\n\t\tconst normalized = error.trim();\n\t\treturn normalized.length > 0 ? normalized : null;\n\t}\n\tif (error instanceof Error) {\n\t\tconst normalized = error.message.trim();\n\t\treturn normalized.length > 0 ? normalized : null;\n\t}\n\tif (error && typeof error === \"object\" && \"message\" in error && typeof error.message === \"string\") {\n\t\tconst normalized = error.message.trim();\n\t\treturn normalized.length > 0 ? normalized : null;\n\t}\n\treturn null;\n}\n\nexport function extractClineSessionId(event: unknown): string | null {\n\tconst record = asRecord(event);\n\tif (!record) {\n\t\treturn null;\n\t}\n\tconst payload = asRecord(record.payload);\n\treturn payload && typeof payload.sessionId === \"string\" ? payload.sessionId : null;\n}\n\n// Translate raw SDK events into Kanban summary and chat mutations so the session service can stay focused on host ownership.\nexport function applyClineSessionEvent(input: ApplyClineSessionEventInput): void {\n\tconst { entry, event, taskId } = input;\n\tconst agentEvent = readAgentEvent(event);\n\tconst chunkEvent = readChunkEvent(event);\n\tconst hookEvent = readHookEvent(event);\n\tconst endedEvent = readEndedEvent(event);\n\tconst statusEvent = readStatusEvent(event);\n\n\tif (agentEvent?.type === \"error\") {\n\t\tconst errorMessage =\n\t\t\t\"error\" in agentEvent ? extractAgentErrorMessage(agentEvent.error) : null;\n\t\tconst recoverable = typeof agentEvent.recoverable === \"boolean\" ? agentEvent.recoverable : false;\n\t\tconst retainedToolActivity = getRetainedClineToolActivity(entry);\n\t\tif (!recoverable) {\n\t\t\tclearActiveTurnState(entry);\n\t\t}\n\t\tif (recoverable && errorMessage) {\n\t\t\tconst retryMsg = createMessage(taskId, \"system\", `Retrying: ${errorMessage}`);\n\t\t\tentry.messages.push(retryMsg);\n\t\t\tinput.emitMessage(taskId, retryMsg);\n\t\t}\n\t\temitSummary(input, {\n\t\t\t...(recoverable\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\tstate: \"failed\",\n\t\t\t\t\t\treviewReason: \"error\",\n\t\t\t\t\t}),\n\t\t\tlastOutputAt: now(),\n\t\t\tlastHookAt: now(),\n\t\t\tlatestHookActivity: {\n\t\t\t\tactivityText: recoverable\n\t\t\t\t\t? `Retrying after error: ${errorMessage ?? \"Unknown agent error\"}`\n\t\t\t\t\t: `Agent error: ${errorMessage ?? \"Unknown agent error\"}`,\n\t\t\t\ttoolName: retainedToolActivity.toolName,\n\t\t\t\ttoolInputSummary: retainedToolActivity.toolInputSummary,\n\t\t\t\tfinalMessage: recoverable ? null : (errorMessage ?? \"Unknown agent error\"),\n\t\t\t\thookEventName: \"agent_error\",\n\t\t\t\tnotificationType: null,\n\t\t\t\tsource: \"cline-sdk\",\n\t\t\t},\n\t\t});\n\t\treturn;\n\t}\n\n\tif (agentEvent?.type === \"content_start\" && agentEvent.contentType === \"text\") {\n\t\tconst accumulated = typeof agentEvent.accumulated === \"string\" ? agentEvent.accumulated : null;\n\t\tconst text = typeof agentEvent.text === \"string\" ? agentEvent.text : null;\n\t\tif (typeof accumulated === \"string\") {\n\t\t\tconst message =\n\t\t\t\tsetOrCreateAssistantMessage(entry, taskId, accumulated) ??\n\t\t\t\tcreateAssistantMessage(entry, taskId, accumulated);\n\t\t\tinput.emitMessage(taskId, message);\n\t\t} else if (typeof text === \"string\" && text.length > 0) {\n\t\t\tinput.emitMessage(taskId, appendAssistantChunk(entry, taskId, text));\n\t\t}\n\t\tconst previewText = toPreviewText(accumulated ?? text);\n\t\tconst retainedToolActivity = getRetainedClineToolActivity(entry);\n\t\temitSummary(input, {\n\t\t\tstate: \"running\",\n\t\t\tlastOutputAt: now(),\n\t\t\tlastHookAt: now(),\n\t\t\tlatestHookActivity: {\n\t\t\t\tactivityText: previewText ?? \"Agent active\",\n\t\t\t\ttoolName: retainedToolActivity.toolName,\n\t\t\t\ttoolInputSummary: retainedToolActivity.toolInputSummary,\n\t\t\t\tfinalMessage: previewText,\n\t\t\t\thookEventName: \"assistant_delta\",\n\t\t\t\tnotificationType: null,\n\t\t\t\tsource: \"cline-sdk\",\n\t\t\t},\n\t\t});\n\t\treturn;\n\t}\n\n\tif (agentEvent?.type === \"notice\") {\n\t\tconst message = typeof agentEvent.message === \"string\" ? agentEvent.message.trim() : \"\";\n\t\tif (message) {\n\t\t\tconst displayRole = typeof agentEvent.displayRole === \"string\" ? agentEvent.displayRole : \"system\";\n\t\t\tconst reason = typeof agentEvent.reason === \"string\" ? agentEvent.reason : null;\n\t\t\tconst noticeType = typeof agentEvent.noticeType === \"string\" ? agentEvent.noticeType : null;\n\t\t\tconst normalizedRole = displayRole === \"status\" ? \"status\" : \"system\";\n\t\t\tconst noticeMessage = createMessage(taskId, normalizedRole, message);\n\t\t\tnoticeMessage.meta = {\n\t\t\t\thookEventName: \"agent_notice\",\n\t\t\t\tmessageKind: noticeType,\n\t\t\t\tdisplayRole,\n\t\t\t\treason,\n\t\t\t};\n\t\t\tentry.messages.push(noticeMessage);\n\t\t\tinput.emitMessage(taskId, noticeMessage);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (agentEvent?.type === \"done\") {\n\t\tconst finalText = typeof agentEvent.text === \"string\" ? agentEvent.text.trim() : \"\";\n\t\tif (finalText) {\n\t\t\tconst message = setOrCreateAssistantMessage(entry, taskId, finalText);\n\t\t\tif (message) {\n\t\t\t\tinput.emitMessage(taskId, message);\n\t\t\t} else if (!latestAssistantMessageMatches(entry, finalText)) {\n\t\t\t\tconst assistantMessage = createMessage(taskId, \"assistant\", finalText);\n\t\t\t\tentry.messages.push(assistantMessage);\n\t\t\t\tinput.emitMessage(taskId, assistantMessage);\n\t\t\t}\n\t\t}\n\n\t\tconst doneReason = typeof agentEvent.reason === \"string\" ? agentEvent.reason : \"completed\";\n\t\tif (doneReason === \"aborted\" && input.pendingTurnCancelTaskIds.has(taskId)) {\n\t\t\temitTurnCanceled(input);\n\t\t\treturn;\n\t\t}\n\n\t\tconst summaryPatch: Partial<RuntimeTaskSessionSummary> = {\n\t\t\tlastOutputAt: now(),\n\t\t\tlastHookAt: now(),\n\t\t\tlatestHookActivity: {\n\t\t\t\tactivityText: finalText ? `Final: ${finalText}` : \"Waiting for review\",\n\t\t\t\ttoolName: null,\n\t\t\t\ttoolInputSummary: null,\n\t\t\t\tfinalMessage: finalText || null,\n\t\t\t\thookEventName: \"agent_end\",\n\t\t\t\tnotificationType: null,\n\t\t\t\tsource: \"cline-sdk\",\n\t\t\t},\n\t\t};\n\t\tif (doneReason === \"aborted\") {\n\t\t\tsummaryPatch.state = \"interrupted\";\n\t\t\tsummaryPatch.reviewReason = \"interrupted\";\n\t\t} else if (doneReason === \"error\") {\n\t\t\tsummaryPatch.state = \"awaiting_review\";\n\t\t\tsummaryPatch.reviewReason = \"error\";\n\t\t} else {\n\t\t\tsummaryPatch.state = \"awaiting_review\";\n\t\t\tsummaryPatch.reviewReason = \"hook\";\n\t\t}\n\n\t\tclearActiveTurnState(entry);\n\t\temitSummary(input, summaryPatch);\n\t\treturn;\n\t}\n\n\tif (agentEvent?.type === \"content_start\" && agentEvent.contentType === \"reasoning\") {\n\t\tconst reasoning = typeof agentEvent.reasoning === \"string\" ? agentEvent.reasoning : null;\n\t\tif (reasoning && reasoning.length > 0) {\n\t\t\tinput.emitMessage(taskId, appendReasoningChunk(entry, taskId, reasoning));\n\t\t\temitSummary(input, {\n\t\t\t\tstate: \"running\",\n\t\t\t\tlastOutputAt: now(),\n\t\t\t});\n\t\t}\n\t\treturn;\n\t}\n\n\tif (agentEvent?.type === \"content_end\" && agentEvent.contentType === \"reasoning\") {\n\t\tconst reasoning = typeof agentEvent.reasoning === \"string\" ? agentEvent.reasoning : null;\n\t\tif (reasoning) {\n\t\t\tconst message =\n\t\t\t\tsetOrCreateReasoningMessage(entry, taskId, reasoning) ?? createReasoningMessage(entry, taskId, reasoning);\n\t\t\tinput.emitMessage(taskId, message);\n\t\t}\n\t\tentry.activeReasoningMessageId = null;\n\t\temitSummary(input, {\n\t\t\tlastOutputAt: now(),\n\t\t});\n\t\treturn;\n\t}\n\n\tif (agentEvent?.type === \"content_start\" && agentEvent.contentType === \"tool\") {\n\t\tconst toolName = typeof agentEvent.toolName === \"string\" ? agentEvent.toolName : null;\n\t\tconst toolCallId = typeof agentEvent.toolCallId === \"string\" ? agentEvent.toolCallId : null;\n\t\tconst toolInput = agentEvent.input;\n\t\tconst toolDisplay = getClineToolCallDisplay(toolName, toolInput);\n\t\tconst isUserAttentionTool = isClineUserAttentionTool(toolName);\n\t\tinput.emitMessage(\n\t\t\ttaskId,\n\t\t\tstartToolCallMessage(entry, taskId, {\n\t\t\t\ttoolName,\n\t\t\t\ttoolCallId,\n\t\t\t\tinput: toolInput,\n\t\t\t}),\n\t\t);\n\t\tconst summaryPatch: Partial<RuntimeTaskSessionSummary> = {\n\t\t\tlastOutputAt: now(),\n\t\t\tlastHookAt: now(),\n\t\t\tlatestHookActivity: {\n\t\t\t\tactivityText: `Using ${formatClineToolCallLabel(toolDisplay.toolName, toolDisplay.inputSummary)}`,\n\t\t\t\ttoolName: toolDisplay.toolName,\n\t\t\t\ttoolInputSummary: toolDisplay.inputSummary,\n\t\t\t\tfinalMessage: null,\n\t\t\t\thookEventName: \"tool_call\",\n\t\t\t\tnotificationType: isUserAttentionTool ? \"user_attention\" : null,\n\t\t\t\tsource: \"cline-sdk\",\n\t\t\t},\n\t\t};\n\t\tif (isUserAttentionTool && entry.summary.state === \"running\") {\n\t\t\tsummaryPatch.state = \"awaiting_review\";\n\t\t\tsummaryPatch.reviewReason = \"hook\";\n\t\t} else if (!isUserAttentionTool && canReturnToRunning(entry.summary.reviewReason)) {\n\t\t\tsummaryPatch.state = \"running\";\n\t\t\tsummaryPatch.reviewReason = null;\n\t\t}\n\t\temitSummary(input, summaryPatch);\n\t\treturn;\n\t}\n\n\tif (agentEvent?.type === \"content_end\" && agentEvent.contentType === \"tool\") {\n\t\tconst toolName = typeof agentEvent.toolName === \"string\" ? agentEvent.toolName : null;\n\t\tconst toolCallId = typeof agentEvent.toolCallId === \"string\" ? agentEvent.toolCallId : null;\n\t\tconst toolOutput = agentEvent.output;\n\t\tconst toolError = typeof agentEvent.error === \"string\" ? agentEvent.error : null;\n\t\tconst durationMs = typeof agentEvent.durationMs === \"number\" ? agentEvent.durationMs : null;\n\t\tconst toolInput = toolCallId ? entry.toolInputByToolCallId.get(toolCallId) : undefined;\n\t\tconst toolDisplay = getClineToolCallDisplay(toolName, toolInput);\n\t\tconst isUserAttentionTool = isClineUserAttentionTool(toolName);\n\t\tinput.emitMessage(\n\t\t\ttaskId,\n\t\t\tfinishToolCallMessage(entry, taskId, {\n\t\t\t\ttoolName,\n\t\t\t\ttoolCallId,\n\t\t\t\toutput: toolOutput,\n\t\t\t\terror: toolError,\n\t\t\t\tdurationMs,\n\t\t\t}),\n\t\t);\n\t\tconst summaryPatch: Partial<RuntimeTaskSessionSummary> = {\n\t\t\tlastOutputAt: now(),\n\t\t\tlastHookAt: now(),\n\t\t\tlatestHookActivity: {\n\t\t\t\tactivityText: `${toolError ? \"Failed\" : \"Completed\"} ${formatClineToolCallLabel(toolDisplay.toolName, toolDisplay.inputSummary)}`,\n\t\t\t\ttoolName: toolDisplay.toolName,\n\t\t\t\ttoolInputSummary: toolDisplay.inputSummary,\n\t\t\t\tfinalMessage: null,\n\t\t\t\thookEventName: \"tool_result\",\n\t\t\t\tnotificationType: null,\n\t\t\t\tsource: \"cline-sdk\",\n\t\t\t},\n\t\t};\n\t\tif (isUserAttentionTool && canReturnToRunning(entry.summary.reviewReason)) {\n\t\t\tsummaryPatch.state = \"running\";\n\t\t\tsummaryPatch.reviewReason = null;\n\t\t}\n\t\temitSummary(input, summaryPatch);\n\t\treturn;\n\t}\n\n\tif (agentEvent?.type === \"content_end\" && agentEvent.contentType === \"text\") {\n\t\tconst text = typeof agentEvent.text === \"string\" ? agentEvent.text : null;\n\t\tif (text) {\n\t\t\tconst message =\n\t\t\t\tsetOrCreateAssistantMessage(entry, taskId, text) ?? createAssistantMessage(entry, taskId, text);\n\t\t\tinput.emitMessage(taskId, message);\n\t\t}\n\t\tentry.activeAssistantMessageId = null;\n\t\temitSummary(input, {\n\t\t\tlastOutputAt: now(),\n\t\t});\n\t\treturn;\n\t}\n\n\tif (chunkEvent?.payload.stream === \"agent\") {\n\t\tconst chunk = chunkEvent.payload.chunk;\n\t\tif (chunk.length === 0 || isLikelySerializedAgentEventChunk(chunk)) {\n\t\t\treturn;\n\t\t}\n\t\tinput.emitMessage(taskId, appendAssistantChunk(entry, taskId, chunk));\n\t\tconst previewText = toPreviewText(chunk);\n\t\tconst retainedToolActivity = getRetainedClineToolActivity(entry);\n\t\temitSummary(input, {\n\t\t\tstate: \"running\",\n\t\t\tlastOutputAt: now(),\n\t\t\tlastHookAt: now(),\n\t\t\tlatestHookActivity: {\n\t\t\t\tactivityText: previewText ?? \"Agent active\",\n\t\t\t\ttoolName: retainedToolActivity.toolName,\n\t\t\t\ttoolInputSummary: retainedToolActivity.toolInputSummary,\n\t\t\t\tfinalMessage: previewText,\n\t\t\t\thookEventName: \"assistant_delta\",\n\t\t\t\tnotificationType: null,\n\t\t\t\tsource: \"cline-sdk\",\n\t\t\t},\n\t\t});\n\t\treturn;\n\t}\n\n\tif (hookEvent) {\n\t\tconst hookEventName =\n\t\t\ttypeof hookEvent.payload.hookEventName === \"string\" ? hookEvent.payload.hookEventName : null;\n\t\tconst toolName = typeof hookEvent.payload.toolName === \"string\" ? hookEvent.payload.toolName : null;\n\t\tconst activityText = hookEventName && toolName ? `${hookEventName}: ${toolName}` : hookEventName;\n\t\temitSummary(input, {\n\t\t\tlastHookAt: now(),\n\t\t\tlatestHookActivity: {\n\t\t\t\tactivityText,\n\t\t\t\ttoolName,\n\t\t\t\ttoolInputSummary: null,\n\t\t\t\tfinalMessage: null,\n\t\t\t\thookEventName,\n\t\t\t\tnotificationType: null,\n\t\t\t\tsource: \"cline-sdk\",\n\t\t\t},\n\t\t});\n\t\treturn;\n\t}\n\n\tif (endedEvent) {\n\t\tconst interrupted =\n\t\t\tendedEvent.payload.reason.includes(\"abort\") || endedEvent.payload.reason.includes(\"interrupt\");\n\t\tif (interrupted && input.pendingTurnCancelTaskIds.has(taskId)) {\n\t\t\temitTurnCanceled(input);\n\t\t\treturn;\n\t\t}\n\t\tclearActiveTurnState(entry);\n\t\temitSummary(input, {\n\t\t\tstate: interrupted ? \"interrupted\" : \"awaiting_review\",\n\t\t\treviewReason: interrupted ? \"interrupted\" : \"exit\",\n\t\t\tlastOutputAt: now(),\n\t\t});\n\t\treturn;\n\t}\n\n\tif (statusEvent) {\n\t\tif (statusEvent.payload.status !== \"running\") {\n\t\t\tclearActiveTurnState(entry);\n\t\t}\n\t\temitSummary(input, {\n\t\t\tstate:\n\t\t\t\tstatusEvent.payload.status === \"running\" &&\n\t\t\t\t!(entry.summary.state === \"awaiting_review\" && canReturnToRunning(entry.summary.reviewReason))\n\t\t\t\t\t? \"running\"\n\t\t\t\t\t: entry.summary.state,\n\t\t\tlastOutputAt: now(),\n\t\t});\n\t}\n}\n\nfunction emitSummary(input: ApplyClineSessionEventInput, patch: Partial<RuntimeTaskSessionSummary>): void {\n\tinput.emitSummary(updateSummary(input.entry, patch));\n}\n\nfunction emitTurnCanceled(input: ApplyClineSessionEventInput): void {\n\tinput.pendingTurnCancelTaskIds.delete(input.taskId);\n\tclearActiveTurnState(input.entry);\n\temitSummary(input, {\n\t\tstate: \"idle\",\n\t\treviewReason: null,\n\t\tlastOutputAt: now(),\n\t\tlastHookAt: now(),\n\t\tlatestHookActivity: {\n\t\t\tactivityText: \"Turn canceled\",\n\t\t\ttoolName: null,\n\t\t\ttoolInputSummary: null,\n\t\t\tfinalMessage: null,\n\t\t\thookEventName: \"turn_canceled\",\n\t\t\tnotificationType: null,\n\t\t\tsource: \"cline-sdk\",\n\t\t},\n\t});\n}\n\nfunction isLikelySerializedAgentEventChunk(chunk: string): boolean {\n\tconst trimmed = chunk.trim();\n\tif (!trimmed) {\n\t\treturn false;\n\t}\n\tif (!(trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\"))) {\n\t\treturn false;\n\t}\n\ttry {\n\t\tconst parsed = JSON.parse(trimmed);\n\t\treturn Boolean(parsed && typeof parsed === \"object\" && \"type\" in parsed);\n\t} catch {\n\t\treturn false;\n\t}\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import type { RuntimeTaskSessionSummary, RuntimeTaskTurnCheckpoint } from "../core/api-contract.js";
2
2
  import type { ClinePersistedTaskSessionSnapshot } from "./cline-session-runtime.js";
3
+ import type { ClineSdkPersistedMessage } from "./sdk-runtime-boundary.js";
3
4
  import { type ClineTaskMessage, type ClineTaskSessionEntry } from "./cline-session-state.js";
4
5
  export interface ClineMessageRepository {
5
6
  onSummary(listener: (summary: RuntimeTaskSessionSummary) => void): () => void;
@@ -34,4 +35,5 @@ export declare class InMemoryClineMessageRepository implements ClineMessageRepos
34
35
  dispose(): void;
35
36
  }
36
37
  export declare function createInMemoryClineMessageRepository(): ClineMessageRepository;
38
+ export declare function createTaskEntryFromPersistedSession(taskId: string, messages: ClineSdkPersistedMessage[], summaryPatch?: Partial<RuntimeTaskSessionSummary>): ClineTaskSessionEntry;
37
39
  //# sourceMappingURL=cline-message-repository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cline-message-repository.d.ts","sourceRoot":"","sources":["../../src/cline-sdk/cline-message-repository.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpG,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,4BAA4B,CAAC;AAEpF,OAAO,EAQN,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAE1B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,sBAAsB;IACtC,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC9E,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACrF,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACjE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAAC;IAC3D,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,yBAAyB,GAAG,IAAI,CAAC;IAC7D,aAAa,IAAI,yBAAyB,EAAE,CAAC;IAC7C,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAAC;IACjD,mBAAmB,CAClB,MAAM,EAAE,MAAM,EACd,oBAAoB,EAAE,MAAM,OAAO,CAAC,iCAAiC,GAAG,IAAI,CAAC,GAC3E,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC/B,WAAW,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACtD,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC7D,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,yBAAyB,GAAG,yBAAyB,GAAG,IAAI,CAAC;IAC7G,OAAO,IAAI,IAAI,CAAC;CAChB;AAGD,qBAAa,8BAA+B,YAAW,sBAAsB;IAC5E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4C;IACpE,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAyC;IAClF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA2D;IAC5F,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkE;IAEnG,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,IAAI,GAAG,MAAM,IAAI;IAO7E,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;IAOpF,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,IAAI;IAKhE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI;IAI1D,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,yBAAyB,GAAG,IAAI;IAK5D,aAAa,IAAI,yBAAyB,EAAE;IAI5C,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAS1C,mBAAmB,CACxB,MAAM,EAAE,MAAM,EACd,oBAAoB,EAAE,MAAM,OAAO,CAAC,iCAAiC,GAAG,IAAI,CAAC,GAC3E,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAkB9B,WAAW,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI;IAOrD,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAO5D,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,yBAAyB,GAAG,yBAAyB,GAAG,IAAI;IAW5G,OAAO,IAAI,IAAI;CAMf;AAED,wBAAgB,oCAAoC,IAAI,sBAAsB,CAE7E"}
1
+ {"version":3,"file":"cline-message-repository.d.ts","sourceRoot":"","sources":["../../src/cline-sdk/cline-message-repository.ts"],"names":[],"mappings":"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"}
@@ -88,6 +88,19 @@ export class InMemoryClineMessageRepository {
88
88
  export function createInMemoryClineMessageRepository() {
89
89
  return new InMemoryClineMessageRepository();
90
90
  }
91
+ export function createTaskEntryFromPersistedSession(taskId, messages, summaryPatch = {}) {
92
+ const entry = createHydrationEntry(taskId);
93
+ for (const message of messages) {
94
+ hydratePersistedMessage(entry, taskId, message);
95
+ }
96
+ entry.summary = {
97
+ ...entry.summary,
98
+ ...summaryPatch,
99
+ taskId,
100
+ updatedAt: Date.now(),
101
+ };
102
+ return entry;
103
+ }
91
104
  function hydratePersistedSessionMessages(taskId, messages) {
92
105
  const entry = createHydrationEntry(taskId);
93
106
  for (const message of messages) {
@@ -120,11 +133,39 @@ function hydratePersistedMessage(entry, taskId, message) {
120
133
  appendPersistedTextMessage(entry, taskId, hydratedRole, message.content, persistedMetadata, persistedReason, persistedMessageKind);
121
134
  return;
122
135
  }
136
+ const textParts = [];
137
+ const images = [];
138
+ const flushRichMessage = () => {
139
+ if (textParts.length === 0 && images.length === 0) {
140
+ return;
141
+ }
142
+ appendPersistedTextMessage(entry, taskId, hydratedRole, textParts.join("\n"), persistedMetadata, persistedReason, persistedMessageKind, images);
143
+ textParts.length = 0;
144
+ images.length = 0;
145
+ };
123
146
  for (const block of message.content) {
124
147
  if (block.type === "text") {
125
- appendPersistedTextMessage(entry, taskId, hydratedRole, block.text, persistedMetadata, persistedReason, persistedMessageKind);
148
+ textParts.push(block.text);
149
+ continue;
150
+ }
151
+ if (block.type === "file") {
152
+ textParts.push(`Attached file: ${block.path}`);
126
153
  continue;
127
154
  }
155
+ if (block.type === "image") {
156
+ if (typeof block.data === "string" && typeof block.mediaType === "string") {
157
+ images.push({
158
+ id: `${taskId}-image-${images.length}-${Date.now()}`,
159
+ data: block.data,
160
+ mimeType: block.mediaType,
161
+ });
162
+ }
163
+ else if (typeof block.mediaType === "string") {
164
+ textParts.push(`Attached image: ${block.mediaType}`);
165
+ }
166
+ continue;
167
+ }
168
+ flushRichMessage();
128
169
  if (block.type === "thinking") {
129
170
  appendPersistedReasoningMessage(entry, taskId, block.thinking);
130
171
  continue;
@@ -150,19 +191,12 @@ function hydratePersistedMessage(entry, taskId, message) {
150
191
  error: block.is_error ? resultText : null,
151
192
  durationMs: null,
152
193
  });
153
- continue;
154
- }
155
- if (block.type === "file") {
156
- appendPersistedTextMessage(entry, taskId, message.role, `Attached file: ${block.path}`);
157
- continue;
158
- }
159
- if (block.type === "image") {
160
- appendPersistedTextMessage(entry, taskId, message.role, `Attached image: ${block.mediaType}`);
161
194
  }
162
195
  }
196
+ flushRichMessage();
163
197
  }
164
- function appendPersistedTextMessage(entry, taskId, role, content, metadata, reason, messageKind) {
165
- if (content.trim().length === 0) {
198
+ function appendPersistedTextMessage(entry, taskId, role, content, metadata, reason, messageKind, images) {
199
+ if (content.trim().length === 0 && (!images || images.length === 0)) {
166
200
  return;
167
201
  }
168
202
  const meta = metadata || reason || messageKind
@@ -173,7 +207,7 @@ function appendPersistedTextMessage(entry, taskId, role, content, metadata, reas
173
207
  reason: reason ?? null,
174
208
  }
175
209
  : null;
176
- entry.messages.push(meta ? createMessageWithMeta(taskId, role, content, meta) : createMessage(taskId, role, content));
210
+ entry.messages.push(meta ? createMessageWithMeta(taskId, role, content, meta, images) : createMessage(taskId, role, content, images));
177
211
  }
178
212
  function appendPersistedReasoningMessage(entry, taskId, content) {
179
213
  if (content.trim().length === 0) {