@gobing-ai/spur 0.3.42 → 0.3.44

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 (79) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/templates/AGENTS.md +5 -0
  3. package/config/workflows/idea-pipeline.yaml +205 -33
  4. package/config/workflows/task-pipeline.yaml +11 -1
  5. package/package.json +9 -9
  6. package/plugins/sp/commands/dev-run.md +3 -3
  7. package/plugins/sp/commands/dev-runall.md +9 -4
  8. package/plugins/sp/commands/dev-wrap.md +21 -3
  9. package/plugins/sp/commands/dev-wrapall.md +21 -3
  10. package/plugins/sp/plugin.json +1 -1
  11. package/plugins/sp/skills/code-implementation/SKILL.md +27 -0
  12. package/plugins/sp/skills/issue-finding/SKILL.md +21 -3
  13. package/plugins/sp/skills/issue-finding/references/session-formats.md +30 -0
  14. package/plugins/sp/skills/next-router/references/routing-table.md +2 -2
  15. package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +9 -0
  16. package/plugins/sp/skills/spur-cli/SKILL.md +3 -0
  17. package/plugins/sp/skills/spur-cli/references/features/hierarchy-mece.md +8 -3
  18. package/plugins/sp/skills/spur-cli/references/tasks.md +25 -1
  19. package/plugins/sp/skills/spur-dev/SKILL.md +12 -4
  20. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +22 -6
  21. package/plugins/sp/skills/spur-dev/references/dev-operations.md +13 -13
  22. package/plugins/sp/skills/spur-dev/references/execution-batch.md +76 -4
  23. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +4 -2
  24. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +2 -2
  25. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +43 -11
  26. package/plugins/sp/skills/spur-dev/references/planning-workflow.md +53 -0
  27. package/spur.js +529 -290
  28. package/web/_astro/{BoardApp.8sc6Rb1t.js → BoardApp.BnhkWEOG.js} +99 -99
  29. package/web/_astro/BoardApp.CxOS4HSo.js +1 -0
  30. package/web/_astro/{TaskDetail.DOKJP-Kp.js → TaskDetail.B6yiT-U7.js} +1 -1
  31. package/web/_astro/{arc.CTqmqspU.js → arc.PbmgYm3_.js} +1 -1
  32. package/web/_astro/{architectureDiagram-3BPJPVTR.B0iBdehs.js → architectureDiagram-3BPJPVTR.BkOMSdmD.js} +1 -1
  33. package/web/_astro/{blockDiagram-GPEHLZMM.BHE5UFj5.js → blockDiagram-GPEHLZMM.BtomoUdy.js} +1 -1
  34. package/web/_astro/{c4Diagram-AAUBKEIU.DQApkgGM.js → c4Diagram-AAUBKEIU.UzrYwJnF.js} +1 -1
  35. package/web/_astro/channel.DRRsElzO.js +1 -0
  36. package/web/_astro/{chunk-2J33WTMH.fPrKLM8v.js → chunk-2J33WTMH.nNChLHkw.js} +1 -1
  37. package/web/_astro/{chunk-4BX2VUAB.DExvwBhn.js → chunk-4BX2VUAB.DLYAecPo.js} +1 -1
  38. package/web/_astro/{chunk-55IACEB6.EjNkjuD6.js → chunk-55IACEB6.t5bzuj1J.js} +1 -1
  39. package/web/_astro/{chunk-727SXJPM.Dl8xy5rT.js → chunk-727SXJPM.DBV62bIy.js} +1 -1
  40. package/web/_astro/{chunk-AQP2D5EJ.BSzMBgBs.js → chunk-AQP2D5EJ.BdaPhTPs.js} +1 -1
  41. package/web/_astro/{chunk-FMBD7UC4.CAeOHpbb.js → chunk-FMBD7UC4.eoZ88KMf.js} +1 -1
  42. package/web/_astro/{chunk-ND2GUHAM.Bbeu_ZOH.js → chunk-ND2GUHAM.QdNDyeSh.js} +1 -1
  43. package/web/_astro/{chunk-QZHKN3VN.Da_GaIAZ.js → chunk-QZHKN3VN.DPaToLfx.js} +1 -1
  44. package/web/_astro/{classDiagram-4FO5ZUOK.sMfFYSQp.js → classDiagram-4FO5ZUOK.By9BMe7b.js} +1 -1
  45. package/web/_astro/{classDiagram-v2-Q7XG4LA2.sMfFYSQp.js → classDiagram-v2-Q7XG4LA2.By9BMe7b.js} +1 -1
  46. package/web/_astro/{cose-bilkent-S5V4N54A.PS3IwOH4.js → cose-bilkent-S5V4N54A.DMypl6q_.js} +1 -1
  47. package/web/_astro/{dagre-BM42HDAG.EQCx8a6D.js → dagre-BM42HDAG.p26m9grg.js} +1 -1
  48. package/web/_astro/{diagram-2AECGRRQ.aEFQl8v8.js → diagram-2AECGRRQ.C6m3oTIu.js} +1 -1
  49. package/web/_astro/{diagram-5GNKFQAL.jyN4tqFX.js → diagram-5GNKFQAL.JCxivn2z.js} +1 -1
  50. package/web/_astro/{diagram-KO2AKTUF.DaTVHnme.js → diagram-KO2AKTUF.DifbEd3P.js} +1 -1
  51. package/web/_astro/{diagram-LMA3HP47.DWsGRLAN.js → diagram-LMA3HP47.Bffga-cf.js} +1 -1
  52. package/web/_astro/{diagram-OG6HWLK6.DYxmOViu.js → diagram-OG6HWLK6.CUKx5_Cx.js} +1 -1
  53. package/web/_astro/{erDiagram-TEJ5UH35.BKM75coa.js → erDiagram-TEJ5UH35.DaJ9KZR0.js} +1 -1
  54. package/web/_astro/{flowDiagram-I6XJVG4X.B7qpqDW5.js → flowDiagram-I6XJVG4X.Do6l5pzg.js} +1 -1
  55. package/web/_astro/{ganttDiagram-6RSMTGT7.CYBL-hwy.js → ganttDiagram-6RSMTGT7.DqBKgB-3.js} +1 -1
  56. package/web/_astro/{gitGraphDiagram-PVQCEYII.Cz4ly3Kq.js → gitGraphDiagram-PVQCEYII.B3VLSQ22.js} +1 -1
  57. package/web/_astro/{index.yAse9IaO.css → index.QfZ9SC3X.css} +1 -1
  58. package/web/_astro/{infoDiagram-5YYISTIA.CIS7cXrJ.js → infoDiagram-5YYISTIA.hK8ZC1oa.js} +1 -1
  59. package/web/_astro/{ishikawaDiagram-YF4QCWOH.DQ-pmaOG.js → ishikawaDiagram-YF4QCWOH.C8DXwh9Z.js} +1 -1
  60. package/web/_astro/{journeyDiagram-JHISSGLW.DVS6F7UM.js → journeyDiagram-JHISSGLW.mj5aHQDb.js} +1 -1
  61. package/web/_astro/{kanban-definition-UN3LZRKU.D8t-G-U6.js → kanban-definition-UN3LZRKU.Dwlhi49r.js} +1 -1
  62. package/web/_astro/{linear.IO8rTd_n.js → linear.7zBHdlwl.js} +1 -1
  63. package/web/_astro/{mermaid.core.CjVnvFNf.js → mermaid.core.AYdA0EJr.js} +4 -4
  64. package/web/_astro/{mindmap-definition-RKZ34NQL.DZoEMTnU.js → mindmap-definition-RKZ34NQL.BSnniHEq.js} +1 -1
  65. package/web/_astro/{pieDiagram-4H26LBE5.86r1QWnX.js → pieDiagram-4H26LBE5.B7EVpA3J.js} +1 -1
  66. package/web/_astro/{quadrantDiagram-W4KKPZXB.DzFA9uPk.js → quadrantDiagram-W4KKPZXB.rg4i8YOY.js} +1 -1
  67. package/web/_astro/{requirementDiagram-4Y6WPE33.dQvdvfMr.js → requirementDiagram-4Y6WPE33.C4pr792x.js} +1 -1
  68. package/web/_astro/{sankeyDiagram-5OEKKPKP.BvC-VNI8.js → sankeyDiagram-5OEKKPKP.DTXU996O.js} +1 -1
  69. package/web/_astro/{sequenceDiagram-3UESZ5HK.DDQNwHs8.js → sequenceDiagram-3UESZ5HK.D73DOjzi.js} +1 -1
  70. package/web/_astro/{stateDiagram-AJRCARHV.BKwYy-tQ.js → stateDiagram-AJRCARHV.CVkeSaEH.js} +1 -1
  71. package/web/_astro/{stateDiagram-v2-BHNVJYJU.KxCiRYYf.js → stateDiagram-v2-BHNVJYJU.DkBGwoN5.js} +1 -1
  72. package/web/_astro/{timeline-definition-PNZ67QCA.Bh9NDjOx.js → timeline-definition-PNZ67QCA.DnJ9Yh7G.js} +1 -1
  73. package/web/_astro/{vennDiagram-CIIHVFJN.DIM-n6us.js → vennDiagram-CIIHVFJN.DN1tvR4Y.js} +1 -1
  74. package/web/_astro/{wardley-L42UT6IY.DW15qOFQ.js → wardley-L42UT6IY.D54jJ-7-.js} +1 -1
  75. package/web/_astro/{wardleyDiagram-YWT4CUSO.UTIvjsG9.js → wardleyDiagram-YWT4CUSO.C2grUBbE.js} +1 -1
  76. package/web/_astro/{xychartDiagram-2RQKCTM6.CQYhkVDS.js → xychartDiagram-2RQKCTM6.D05okBnV.js} +1 -1
  77. package/web/index.html +2 -2
  78. package/web/_astro/BoardApp.ChKnY1JD.js +0 -1
  79. package/web/_astro/channel.B0q9WGrH.js +0 -1
package/spur.js CHANGED
@@ -47,7 +47,7 @@ var __export = (target, all) => {
47
47
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
48
48
  var __require = import.meta.require;
49
49
 
50
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.24/node_modules/@gobing-ai/ts-utils/dist/errors.js
50
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.27/node_modules/@gobing-ai/ts-utils/dist/errors.js
51
51
  var ErrorCode;
52
52
  var init_errors = __esm(() => {
53
53
  ErrorCode = {
@@ -58,7 +58,7 @@ var init_errors = __esm(() => {
58
58
  };
59
59
  });
60
60
 
61
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.24/node_modules/@gobing-ai/ts-utils/dist/api-response.js
61
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.27/node_modules/@gobing-ai/ts-utils/dist/api-response.js
62
62
  var API_ERROR_CODES, ERROR_CODE_TO_HTTP, CLIENT_SAFE_CODES;
63
63
  var init_api_response = __esm(() => {
64
64
  init_errors();
@@ -81,10 +81,10 @@ var init_api_response = __esm(() => {
81
81
  CLIENT_SAFE_CODES = new Set([ErrorCode.NotFound, ErrorCode.Validation, ErrorCode.Conflict]);
82
82
  });
83
83
 
84
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.24/node_modules/@gobing-ai/ts-utils/dist/cursor.js
84
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.27/node_modules/@gobing-ai/ts-utils/dist/cursor.js
85
85
  var init_cursor = () => {};
86
86
 
87
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.24/node_modules/@gobing-ai/ts-utils/dist/object.js
87
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.27/node_modules/@gobing-ai/ts-utils/dist/object.js
88
88
  function isPlainObject(value) {
89
89
  return typeof value === "object" && value !== null && !Array.isArray(value);
90
90
  }
@@ -102,7 +102,7 @@ function deepMerge(target, source) {
102
102
  return result;
103
103
  }
104
104
 
105
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.24/node_modules/@gobing-ai/ts-utils/dist/output.js
105
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.27/node_modules/@gobing-ai/ts-utils/dist/output.js
106
106
  function processStream(name) {
107
107
  const proc = globalThis.process;
108
108
  const stream = proc?.[name];
@@ -123,7 +123,7 @@ function echoError(message, target = defaultStderrTarget ?? processStream("stder
123
123
  }
124
124
  var defaultStdoutTarget, defaultStderrTarget;
125
125
 
126
- // ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.24/node_modules/@gobing-ai/ts-utils/dist/index.js
126
+ // ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.27/node_modules/@gobing-ai/ts-utils/dist/index.js
127
127
  var init_dist = __esm(() => {
128
128
  init_api_response();
129
129
  init_cursor();
@@ -21745,7 +21745,7 @@ var init_zod = __esm(() => {
21745
21745
  init_external();
21746
21746
  });
21747
21747
 
21748
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+9ac10ce9c9bdeb65/node_modules/@gobing-ai/ts-runtime/dist/config.js
21748
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+9a36123834b81a08/node_modules/@gobing-ai/ts-runtime/dist/config.js
21749
21749
  function getProcessEnv() {
21750
21750
  return process.env;
21751
21751
  }
@@ -21823,7 +21823,7 @@ var init_config = __esm(() => {
21823
21823
  };
21824
21824
  });
21825
21825
 
21826
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+9ac10ce9c9bdeb65/node_modules/@gobing-ai/ts-runtime/dist/file-system-node.js
21826
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+9a36123834b81a08/node_modules/@gobing-ai/ts-runtime/dist/file-system-node.js
21827
21827
  import { appendFileSync, cpSync, createReadStream, createWriteStream, existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "fs";
21828
21828
  import { dirname, resolve as resolvePath } from "path";
21829
21829
  function createNodeFileSystem(root, paths) {
@@ -21910,7 +21910,7 @@ function findProjectRoot(startDir) {
21910
21910
  }
21911
21911
  var init_file_system_node = () => {};
21912
21912
 
21913
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+9ac10ce9c9bdeb65/node_modules/@gobing-ai/ts-runtime/dist/db-errors.js
21913
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+9a36123834b81a08/node_modules/@gobing-ai/ts-runtime/dist/db-errors.js
21914
21914
  var DbModuleNotInstalledError;
21915
21915
  var init_db_errors = __esm(() => {
21916
21916
  DbModuleNotInstalledError = class DbModuleNotInstalledError extends Error {
@@ -29121,7 +29121,7 @@ var init_execa = __esm(() => {
29121
29121
  } = getIpcExport());
29122
29122
  });
29123
29123
 
29124
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+9ac10ce9c9bdeb65/node_modules/@gobing-ai/ts-runtime/dist/process-executor.js
29124
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+9a36123834b81a08/node_modules/@gobing-ai/ts-runtime/dist/process-executor.js
29125
29125
  import { isatty } from "tty";
29126
29126
 
29127
29127
  class NodeProcessExecutor {
@@ -29460,7 +29460,7 @@ var init_process_executor = __esm(() => {
29460
29460
  init_execa();
29461
29461
  });
29462
29462
 
29463
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+9ac10ce9c9bdeb65/node_modules/@gobing-ai/ts-runtime/dist/runtime-node-bun.js
29463
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+9a36123834b81a08/node_modules/@gobing-ai/ts-runtime/dist/runtime-node-bun.js
29464
29464
  function getNodeFileSystem() {
29465
29465
  if (!_nodeFileSystem)
29466
29466
  _nodeFileSystem = createNodeFileSystem();
@@ -29520,7 +29520,7 @@ var init_runtime_node_bun = __esm(() => {
29520
29520
  };
29521
29521
  });
29522
29522
 
29523
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+9ac10ce9c9bdeb65/node_modules/@gobing-ai/ts-runtime/dist/context.js
29523
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+9a36123834b81a08/node_modules/@gobing-ai/ts-runtime/dist/context.js
29524
29524
  class RuntimeContext {
29525
29525
  scope;
29526
29526
  runtimeName;
@@ -29590,7 +29590,7 @@ var init_context = __esm(() => {
29590
29590
  init_runtime_node_bun();
29591
29591
  });
29592
29592
 
29593
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+9ac10ce9c9bdeb65/node_modules/@gobing-ai/ts-runtime/dist/path.js
29593
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+9a36123834b81a08/node_modules/@gobing-ai/ts-runtime/dist/path.js
29594
29594
  function normalizeSeparators(path6) {
29595
29595
  return path6.replaceAll("\\", "/");
29596
29596
  }
@@ -29651,17 +29651,17 @@ var init_path = __esm(() => {
29651
29651
  SEP = globalThis.process?.platform === "win32" ? "\\" : "/";
29652
29652
  });
29653
29653
 
29654
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+9ac10ce9c9bdeb65/node_modules/@gobing-ai/ts-runtime/dist/schema-validation.js
29654
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+9a36123834b81a08/node_modules/@gobing-ai/ts-runtime/dist/schema-validation.js
29655
29655
  var REMOTE_SCHEMA_MAX_BYTES;
29656
29656
  var init_schema_validation = __esm(() => {
29657
29657
  init_dist2();
29658
29658
  REMOTE_SCHEMA_MAX_BYTES = 5 * 1024 * 1024;
29659
29659
  });
29660
29660
 
29661
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+9ac10ce9c9bdeb65/node_modules/@gobing-ai/ts-runtime/dist/types.js
29661
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+9a36123834b81a08/node_modules/@gobing-ai/ts-runtime/dist/types.js
29662
29662
  var init_types = () => {};
29663
29663
 
29664
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+9ac10ce9c9bdeb65/node_modules/@gobing-ai/ts-runtime/dist/index.js
29664
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+9a36123834b81a08/node_modules/@gobing-ai/ts-runtime/dist/index.js
29665
29665
  var init_dist3 = __esm(() => {
29666
29666
  init_config();
29667
29667
  init_context();
@@ -29670,7 +29670,7 @@ var init_dist3 = __esm(() => {
29670
29670
  init_types();
29671
29671
  });
29672
29672
 
29673
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+9ac10ce9c9bdeb65/node_modules/@gobing-ai/ts-runtime/dist/bun-sqlite.js
29673
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+9a36123834b81a08/node_modules/@gobing-ai/ts-runtime/dist/bun-sqlite.js
29674
29674
  import { Database } from "bun:sqlite";
29675
29675
  var init_bun_sqlite = () => {};
29676
29676
 
@@ -33862,7 +33862,7 @@ var init_bun_sqlite2 = __esm(() => {
33862
33862
  init_session2();
33863
33863
  });
33864
33864
 
33865
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/schema/inbox-messages.js
33865
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/schema/inbox-messages.js
33866
33866
  var inboxMessages;
33867
33867
  var init_inbox_messages = __esm(() => {
33868
33868
  init_sqlite_core();
@@ -33881,7 +33881,7 @@ var init_inbox_messages = __esm(() => {
33881
33881
  }, (table2) => [index("idx_inbox_messages_to_status").on(table2.toId, table2.status)]);
33882
33882
  });
33883
33883
 
33884
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/schema/common.js
33884
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/schema/common.js
33885
33885
  function nowTimestamp() {
33886
33886
  return Date.now();
33887
33887
  }
@@ -33910,7 +33910,7 @@ var init_common3 = __esm(() => {
33910
33910
  appendOnlyColumns = buildAppendOnlyColumns();
33911
33911
  });
33912
33912
 
33913
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/schema/queue-jobs.js
33913
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/schema/queue-jobs.js
33914
33914
  var queueJobs;
33915
33915
  var init_queue_jobs = __esm(() => {
33916
33916
  init_sqlite_core();
@@ -33930,7 +33930,7 @@ var init_queue_jobs = __esm(() => {
33930
33930
  }, (table2) => [index("queue_jobs_ready_idx").on(table2.status, table2.nextRetryAt, table2.createdAt)]);
33931
33931
  });
33932
33932
 
33933
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/schema/runtime.js
33933
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/schema/runtime.js
33934
33934
  var exports_runtime = {};
33935
33935
  __export(exports_runtime, {
33936
33936
  queueJobs: () => queueJobs,
@@ -33941,7 +33941,7 @@ var init_runtime = __esm(() => {
33941
33941
  init_queue_jobs();
33942
33942
  });
33943
33943
 
33944
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/adapters/bun-sqlite.js
33944
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/adapters/bun-sqlite.js
33945
33945
  var exports_bun_sqlite = {};
33946
33946
  __export(exports_bun_sqlite, {
33947
33947
  BunSqliteAdapter: () => BunSqliteAdapter
@@ -34232,7 +34232,7 @@ var init_d1 = __esm(() => {
34232
34232
  init_session3();
34233
34233
  });
34234
34234
 
34235
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/adapters/d1.js
34235
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/adapters/d1.js
34236
34236
  var exports_d1 = {};
34237
34237
  __export(exports_d1, {
34238
34238
  D1Adapter: () => D1Adapter
@@ -34296,7 +34296,7 @@ var init_d12 = __esm(() => {
34296
34296
  init_runtime();
34297
34297
  });
34298
34298
 
34299
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/adapter.js
34299
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/adapter.js
34300
34300
  async function createDbAdapter(config3) {
34301
34301
  switch (config3.driver) {
34302
34302
  case "bun-sqlite": {
@@ -34336,7 +34336,7 @@ var init_drizzle_orm = __esm(() => {
34336
34336
  init_view_common();
34337
34337
  });
34338
34338
 
34339
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/query-spec.js
34339
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/query-spec.js
34340
34340
  function compilePredicate(predicate) {
34341
34341
  if ("and" in predicate) {
34342
34342
  const parts = predicate.and.map(compilePredicate).filter((p) => p !== undefined);
@@ -34374,7 +34374,7 @@ var init_query_spec = __esm(() => {
34374
34374
  };
34375
34375
  });
34376
34376
 
34377
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/base-dao.js
34377
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/base-dao.js
34378
34378
  function asSelectQuery(query) {
34379
34379
  return query;
34380
34380
  }
@@ -34416,7 +34416,7 @@ var init_base_dao = __esm(() => {
34416
34416
  init_query_spec();
34417
34417
  });
34418
34418
 
34419
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/embedded-migrations.js
34419
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/embedded-migrations.js
34420
34420
  var embeddedMigrations;
34421
34421
  var init_embedded_migrations = __esm(() => {
34422
34422
  embeddedMigrations = [
@@ -34448,7 +34448,7 @@ var init_embedded_migrations = __esm(() => {
34448
34448
  ];
34449
34449
  });
34450
34450
 
34451
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/entity-dao.js
34451
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/entity-dao.js
34452
34452
  var EntityDao;
34453
34453
  var init_entity_dao = __esm(() => {
34454
34454
  init_drizzle_orm();
@@ -34610,7 +34610,7 @@ var init_entity_dao = __esm(() => {
34610
34610
  };
34611
34611
  });
34612
34612
 
34613
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/inbox-message-dao.js
34613
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/inbox-message-dao.js
34614
34614
  function isPromiseLike(value) {
34615
34615
  return value !== null && (typeof value === "object" || typeof value === "function") && typeof value.then === "function";
34616
34616
  }
@@ -34783,7 +34783,7 @@ var init_migrator2 = __esm(() => {
34783
34783
  init_migrator();
34784
34784
  });
34785
34785
 
34786
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/migrate.js
34786
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/migrate.js
34787
34787
  async function ensureJournalTable(adapter, table3) {
34788
34788
  await adapter.exec(`CREATE TABLE IF NOT EXISTS "${table3}" (` + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "hash text NOT NULL, " + "created_at numeric" + ")");
34789
34789
  }
@@ -34858,7 +34858,7 @@ var init_migrate = __esm(() => {
34858
34858
  init_embedded_migrations();
34859
34859
  });
34860
34860
 
34861
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/queue-job-dao.js
34861
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/queue-job-dao.js
34862
34862
  var QueueJobDao;
34863
34863
  var init_queue_job_dao = __esm(() => {
34864
34864
  init_drizzle_orm();
@@ -34999,7 +34999,7 @@ var init_queue_job_dao = __esm(() => {
34999
34999
  };
35000
35000
  });
35001
35001
 
35002
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/index.js
35002
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/index.js
35003
35003
  var exports_dist = {};
35004
35004
  __export(exports_dist, {
35005
35005
  embeddedMigrations: () => embeddedMigrations,
@@ -37487,7 +37487,7 @@ var init_src = __esm(() => {
37487
37487
  });
37488
37488
  });
37489
37489
 
37490
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/config.js
37490
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/config.js
37491
37491
  function parseYamlObject(text3) {
37492
37492
  let parsed;
37493
37493
  try {
@@ -37614,7 +37614,7 @@ var init_config2 = __esm(() => {
37614
37614
  };
37615
37615
  });
37616
37616
 
37617
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/file-system-node.js
37617
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/file-system-node.js
37618
37618
  import { appendFileSync as appendFileSync3, cpSync as cpSync2, createReadStream as createReadStream3, createWriteStream as createWriteStream3, existsSync as existsSync2, mkdirSync as mkdirSync2, readdirSync as readdirSync2, readFileSync as readFileSync4, realpathSync as realpathSync2, renameSync as renameSync2, rmSync as rmSync2, statSync as statSync3, writeFileSync as writeFileSync3 } from "fs";
37619
37619
  import { dirname as dirname2, resolve as resolvePath3 } from "path";
37620
37620
  function createNodeFileSystem3(root, paths) {
@@ -37701,7 +37701,7 @@ function findProjectRoot3(startDir) {
37701
37701
  }
37702
37702
  var init_file_system_node2 = () => {};
37703
37703
 
37704
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/db-errors.js
37704
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/db-errors.js
37705
37705
  var D1NotConfiguredError2, DbModuleNotInstalledError3;
37706
37706
  var init_db_errors2 = __esm(() => {
37707
37707
  D1NotConfiguredError2 = class D1NotConfiguredError2 extends Error {
@@ -37718,7 +37718,7 @@ var init_db_errors2 = __esm(() => {
37718
37718
  };
37719
37719
  });
37720
37720
 
37721
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/file-system-cf.js
37721
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/file-system-cf.js
37722
37722
  function createCfFileSystem2() {
37723
37723
  return {
37724
37724
  getProjectRoot: () => "/bundle",
@@ -37757,7 +37757,7 @@ function createCfFileSystem2() {
37757
37757
  }
37758
37758
  var UNSUPPORTED = "FileSystem is not available on Cloudflare Workers. Use D1, KV, or R2 for persistent storage.";
37759
37759
 
37760
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/runtime-cf.js
37760
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/runtime-cf.js
37761
37761
  var exports_runtime_cf = {};
37762
37762
  __export(exports_runtime_cf, {
37763
37763
  cloudflareWorkersFactory: () => cloudflareWorkersFactory2
@@ -37795,7 +37795,7 @@ var init_runtime_cf = __esm(() => {
37795
37795
  };
37796
37796
  });
37797
37797
 
37798
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/process-executor.js
37798
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/process-executor.js
37799
37799
  import { isatty as isatty2 } from "tty";
37800
37800
 
37801
37801
  class NodeProcessExecutor3 {
@@ -38181,7 +38181,7 @@ var init_process_executor2 = __esm(() => {
38181
38181
  ProcessExecutor2 = NodeProcessExecutor3;
38182
38182
  });
38183
38183
 
38184
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/runtime-node-bun.js
38184
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/runtime-node-bun.js
38185
38185
  var exports_runtime_node_bun = {};
38186
38186
  __export(exports_runtime_node_bun, {
38187
38187
  nodeBunFactory: () => nodeBunFactory3,
@@ -38249,7 +38249,7 @@ var init_runtime_node_bun2 = __esm(() => {
38249
38249
  };
38250
38250
  });
38251
38251
 
38252
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/platform.js
38252
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/platform.js
38253
38253
  function isCloudflareWorkerRuntime2() {
38254
38254
  return globalThis.navigator?.userAgent?.startsWith("Cloudflare-Workers") ?? false;
38255
38255
  }
@@ -38279,7 +38279,7 @@ function _resetRuntimeFactory2() {
38279
38279
  }
38280
38280
  var _factory, _runtimeName;
38281
38281
 
38282
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/context.js
38282
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/context.js
38283
38283
  class RuntimeContext2 {
38284
38284
  scope;
38285
38285
  runtimeName;
@@ -38369,7 +38369,7 @@ var init_context2 = __esm(() => {
38369
38369
  init_runtime_node_bun2();
38370
38370
  });
38371
38371
 
38372
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/path.js
38372
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/path.js
38373
38373
  function normalizeSeparators2(path7) {
38374
38374
  return path7.replaceAll("\\", "/");
38375
38375
  }
@@ -38492,7 +38492,7 @@ var init_path2 = __esm(() => {
38492
38492
  SEP2 = globalThis.process?.platform === "win32" ? "\\" : "/";
38493
38493
  });
38494
38494
 
38495
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/fs.js
38495
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/fs.js
38496
38496
  async function ensureDirForFile2(path7, fs2 = createNodeFileSystem3()) {
38497
38497
  await fs2.ensureDir(dirnamePath(path7));
38498
38498
  }
@@ -38543,7 +38543,7 @@ var init_fs = __esm(() => {
38543
38543
  init_path2();
38544
38544
  });
38545
38545
 
38546
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/process-registry.js
38546
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/process-registry.js
38547
38547
  function allocateId() {
38548
38548
  nextIdSeq += 1;
38549
38549
  return `pe_${Date.now().toString(36)}_${nextIdSeq.toString(36)}`;
@@ -38667,7 +38667,7 @@ function createInMemoryProcessRegistry2(options) {
38667
38667
  }
38668
38668
  var nextIdSeq = 0;
38669
38669
 
38670
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/runtime-paths.js
38670
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/runtime-paths.js
38671
38671
  function ambientRuntimePaths2() {
38672
38672
  const cwd = getProcessCwd2();
38673
38673
  return { cwd, home: getHomeDir() ?? cwd };
@@ -38677,7 +38677,7 @@ var init_runtime_paths = __esm(() => {
38677
38677
  init_path2();
38678
38678
  });
38679
38679
 
38680
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/schema-validation.js
38680
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/schema-validation.js
38681
38681
  async function loadStructuredConfig(path7, options = {}) {
38682
38682
  const content = await (options.fileSystem ?? createNodeFileSystem3()).readFile(path7);
38683
38683
  return await parseStructuredConfig(content, path7, options);
@@ -38954,10 +38954,10 @@ var init_schema_validation2 = __esm(() => {
38954
38954
  defaultResolve = typeof Bun !== "undefined" ? (specifier, from) => Bun.resolveSync(specifier, from) : undefined;
38955
38955
  });
38956
38956
 
38957
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/types.js
38957
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/types.js
38958
38958
  var init_types2 = () => {};
38959
38959
 
38960
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/index.js
38960
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/index.js
38961
38961
  var exports_dist2 = {};
38962
38962
  __export(exports_dist2, {
38963
38963
  writeJsonFile: () => writeJsonFile2,
@@ -41108,7 +41108,7 @@ var init_mod = __esm(() => {
41108
41108
  init_config3();
41109
41109
  });
41110
41110
 
41111
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/logger.js
41111
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/logger.js
41112
41112
  function toLogTapeLevel(level) {
41113
41113
  return level === "warn" ? "warning" : level;
41114
41114
  }
@@ -42661,7 +42661,7 @@ var require_src = __commonJS((exports) => {
42661
42661
  };
42662
42662
  });
42663
42663
 
42664
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/telemetry/sdk.js
42664
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/telemetry/sdk.js
42665
42665
  function getTelemetryConfig(configPartial = {}) {
42666
42666
  return {
42667
42667
  enabled: configPartial.enabled ?? CONFIG_DEFAULTS.enabled,
@@ -42697,7 +42697,7 @@ var init_sdk = __esm(() => {
42697
42697
  resolvedConfig = getTelemetryConfig();
42698
42698
  });
42699
42699
 
42700
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/telemetry/tracing.js
42700
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/telemetry/tracing.js
42701
42701
  function isSuppressed(tracer2) {
42702
42702
  return tracer2 === undefined && !getResolvedConfig().enabled;
42703
42703
  }
@@ -42737,7 +42737,7 @@ var init_tracing2 = __esm(() => {
42737
42737
  import_api2 = __toESM(require_src(), 1);
42738
42738
  });
42739
42739
 
42740
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/telemetry/metrics.js
42740
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/telemetry/metrics.js
42741
42741
  function getMeter() {
42742
42742
  return import_api3.metrics.getMeter(METER_NAME, METER_VERSION);
42743
42743
  }
@@ -42834,7 +42834,7 @@ var init_metrics = __esm(() => {
42834
42834
  instruments = {};
42835
42835
  });
42836
42836
 
42837
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/event-bus/event-bus.js
42837
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/event-bus/event-bus.js
42838
42838
  function busLogger() {
42839
42839
  if (!_busLogger)
42840
42840
  _busLogger = getLogger2("event-bus");
@@ -43079,7 +43079,7 @@ var init_event_bus = __esm(() => {
43079
43079
  init_metrics();
43080
43080
  });
43081
43081
 
43082
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/event-bus/default-observers.js
43082
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/event-bus/default-observers.js
43083
43083
  function obsLogger() {
43084
43084
  if (!_obsLogger)
43085
43085
  _obsLogger = getLogger2("event-bus.observers");
@@ -43143,7 +43143,7 @@ var init_default_observers = __esm(() => {
43143
43143
  init_event_bus();
43144
43144
  });
43145
43145
 
43146
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/event-bus/file-observer.js
43146
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/event-bus/file-observer.js
43147
43147
  function parentDir(filePath) {
43148
43148
  const idx = filePath.lastIndexOf("/");
43149
43149
  return idx <= 0 ? "." : filePath.slice(0, idx);
@@ -43241,7 +43241,7 @@ var init_file_observer = __esm(() => {
43241
43241
  init_logger3();
43242
43242
  });
43243
43243
 
43244
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/internals/drain.js
43244
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/internals/drain.js
43245
43245
  function settleWithin(promise2, deadline) {
43246
43246
  const remaining = deadline - Date.now();
43247
43247
  if (remaining <= 0)
@@ -43256,7 +43256,7 @@ function settleWithin(promise2, deadline) {
43256
43256
  return settled;
43257
43257
  }
43258
43258
 
43259
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/scheduler/node.js
43259
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/scheduler/node.js
43260
43260
  function parseInterval(cron) {
43261
43261
  const trimmed = cron.trim();
43262
43262
  const num = Number(trimmed);
@@ -43349,7 +43349,7 @@ var init_node3 = __esm(() => {
43349
43349
  init_metrics();
43350
43350
  });
43351
43351
 
43352
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/scheduler-node.js
43352
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/scheduler-node.js
43353
43353
  var exports_scheduler_node = {};
43354
43354
  __export(exports_scheduler_node, {
43355
43355
  NodeSchedulerAdapter: () => NodeSchedulerAdapter
@@ -50354,7 +50354,9 @@ async function messageRollup(db2, sel) {
50354
50354
  SUM(m.cache_read_tokens) AS cacheReadTokens,
50355
50355
  SUM(m.cache_write_tokens) AS cacheWriteTokens,
50356
50356
  SUM(m.cost_usd) AS costUsd,
50357
- SUM(CASE WHEN m.input_tokens IS NOT NULL OR m.output_tokens IS NOT NULL THEN 1 ELSE 0 END) AS recordsWithUsage
50357
+ SUM(CASE WHEN m.input_tokens IS NOT NULL OR m.output_tokens IS NOT NULL THEN 1 ELSE 0 END) AS recordsWithUsage,
50358
+ SUM(CASE WHEN m.role = 'assistant' THEN m.duration_ms END) AS assistantDurationMs,
50359
+ SUM(CASE WHEN m.role = 'assistant' THEN m.duration_ms IS NULL END) AS assistantDurationUnmeasured
50358
50360
  FROM history_message m
50359
50361
  ${where}
50360
50362
  GROUP BY m.source, m.model, DATE(m.ts)`, ...params);
@@ -50393,7 +50395,9 @@ async function bySession(db2, sel, top) {
50393
50395
  MIN(m.ts) AS startedAt,
50394
50396
  COUNT(*) AS messages,
50395
50397
  SUM(m.input_tokens + m.output_tokens) AS tokens,
50396
- SUM(m.cost_usd) AS costUsd
50398
+ SUM(m.cost_usd) AS costUsd,
50399
+ SUM(CASE WHEN m.role = 'assistant' THEN m.duration_ms END) AS assistantDurationMs,
50400
+ SUM(CASE WHEN m.role = 'assistant' THEN m.duration_ms IS NULL END) AS assistantDurationUnmeasured
50397
50401
  FROM history_message m
50398
50402
  ${where}
50399
50403
  GROUP BY m.session_id, m.source
@@ -50441,7 +50445,9 @@ async function bySession(db2, sel, top) {
50441
50445
  toolCalls,
50442
50446
  topTool,
50443
50447
  tokens: msg.tokens,
50444
- costUsd: msg.costUsd
50448
+ costUsd: msg.costUsd,
50449
+ assistantDurationMs: msg.assistantDurationMs,
50450
+ assistantDurationUnmeasured: msg.assistantDurationUnmeasured
50445
50451
  };
50446
50452
  });
50447
50453
  }
@@ -51031,7 +51037,7 @@ function stripScenarioPrefixes(title) {
51031
51037
  let previous;
51032
51038
  do {
51033
51039
  previous = out;
51034
- out = out.replace(/^\[[^\]]*\]\s*/, "").replace(/^Scenario:\s*/i, "").replace(/^R\d+\s*[:\-\u2014]?\s*/, "").trim();
51040
+ out = out.replace(/^\[[^\]]*\]\s*/, "").replace(/\s*\[[^\]]*\]\s*$/, "").replace(/^Scenario:\s*/i, "").replace(/^R\d+\s*[:\-\u2014]?\s*/, "").trim();
51035
51041
  } while (out !== previous);
51036
51042
  return out;
51037
51043
  }
@@ -51126,6 +51132,19 @@ function stripAcFence(body) {
51126
51132
  return out.join(`
51127
51133
  `);
51128
51134
  }
51135
+ function looksLikeGherkinAc(body) {
51136
+ return /^\s*(?:Feature:|Scenario:|Scenario Outline:)/m.test(body);
51137
+ }
51138
+ function normalizeAcFence(body) {
51139
+ const trimmed = body.trim();
51140
+ if (trimmed === "" || /^\s*```/m.test(trimmed))
51141
+ return body;
51142
+ if (!looksLikeGherkinAc(trimmed))
51143
+ return body;
51144
+ return `\`\`\`gherkin
51145
+ ${trimmed}
51146
+ \`\`\``;
51147
+ }
51129
51148
 
51130
51149
  // ../../packages/domain/src/bdd/scaffold.ts
51131
51150
  function renderScenarioStub(scenario) {
@@ -51782,7 +51801,7 @@ var init_drizzle_zod = __esm(() => {
51782
51801
  };
51783
51802
  });
51784
51803
 
51785
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/schema/drizzle-internals.js
51804
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/schema/drizzle-internals.js
51786
51805
  function sqlExpressionToText(value) {
51787
51806
  if (typeof value !== "object" || value === null || !("queryChunks" in value)) {
51788
51807
  return;
@@ -51805,7 +51824,7 @@ function getDrizzleTableName(table3) {
51805
51824
  return String(table3[nameSym]);
51806
51825
  }
51807
51826
 
51808
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/schema/ddl.js
51827
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/schema/ddl.js
51809
51828
  function quoteIdent(name) {
51810
51829
  return `"${name.replace(/"/g, '""')}"`;
51811
51830
  }
@@ -51899,7 +51918,7 @@ var init_ddl = __esm(() => {
51899
51918
  init_sqlite_core();
51900
51919
  });
51901
51920
 
51902
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/schema/define-table.js
51921
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/schema/define-table.js
51903
51922
  function defineTable(name, columns2) {
51904
51923
  const table3 = sqliteTable(name, columns2);
51905
51924
  let insert2;
@@ -51933,7 +51952,7 @@ var init_define_table = __esm(() => {
51933
51952
  init_ddl();
51934
51953
  });
51935
51954
 
51936
- // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.24+cdac192cf152c5ea/node_modules/@gobing-ai/ts-db/dist/schema/index.js
51955
+ // ../../node_modules/.bun/@gobing-ai+ts-db@0.4.27+d178e82c03238f76/node_modules/@gobing-ai/ts-db/dist/schema/index.js
51937
51956
  var init_schema = __esm(() => {
51938
51957
  init_sqlite_core();
51939
51958
  init_define_table();
@@ -52558,7 +52577,7 @@ var init_dao = __esm(() => {
52558
52577
  init_workspace_dao();
52559
52578
  });
52560
52579
 
52561
- // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/errors.js
52580
+ // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/errors.js
52562
52581
  var WorkflowValidationError, FSMError, RunCollisionError, WorkflowResumeError;
52563
52582
  var init_errors6 = __esm(() => {
52564
52583
  WorkflowValidationError = class WorkflowValidationError extends Error {
@@ -52593,12 +52612,12 @@ var init_errors6 = __esm(() => {
52593
52612
  };
52594
52613
  });
52595
52614
 
52596
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/event-bus/index.js
52615
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/event-bus/index.js
52597
52616
  var init_event_bus2 = __esm(() => {
52598
52617
  init_event_bus();
52599
52618
  });
52600
52619
 
52601
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/api-client.js
52620
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/api-client.js
52602
52621
  function sanitizeUrlForObservability(url2) {
52603
52622
  try {
52604
52623
  const parsed = new URL(url2);
@@ -52828,12 +52847,12 @@ var init_api_client = __esm(() => {
52828
52847
  };
52829
52848
  });
52830
52849
 
52831
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/telemetry/index.js
52850
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/telemetry/index.js
52832
52851
  var init_telemetry = __esm(() => {
52833
52852
  init_tracing2();
52834
52853
  });
52835
52854
 
52836
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/index.js
52855
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/index.js
52837
52856
  var init_dist6 = __esm(() => {
52838
52857
  init_api_client();
52839
52858
  init_event_bus2();
@@ -52841,7 +52860,7 @@ var init_dist6 = __esm(() => {
52841
52860
  init_telemetry();
52842
52861
  });
52843
52862
 
52844
- // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/run-lifecycle.js
52863
+ // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/run-lifecycle.js
52845
52864
  function runtimeBuiltins(workflowName, stateOrNodeId, runId, transitionsTaken, mode) {
52846
52865
  return {
52847
52866
  workflow: workflowName,
@@ -53100,7 +53119,7 @@ var init_run_lifecycle = __esm(() => {
53100
53119
  ];
53101
53120
  });
53102
53121
 
53103
- // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/schema.js
53122
+ // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/schema.js
53104
53123
  var RESERVED_VAR_NAMES, IDENTIFIER, VarsSchema, EnvSchema, ActionDefSchema, GuardDefSchema, StateMachineWorkflowDefSchema, TransitionFlowWorkflowDefSchema, WorkflowDefSchema;
53105
53124
  var init_schema2 = __esm(() => {
53106
53125
  init_zod();
@@ -53185,7 +53204,7 @@ var init_schema2 = __esm(() => {
53185
53204
  WorkflowDefSchema = exports_external.union([StateMachineWorkflowDefSchema, TransitionFlowWorkflowDefSchema]);
53186
53205
  });
53187
53206
 
53188
- // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/config.js
53207
+ // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/config.js
53189
53208
  async function loadWorkflowDef(path9, options = {}) {
53190
53209
  return parseWorkflowDef(await loadStructuredConfig(path9, options), path9);
53191
53210
  }
@@ -53352,7 +53371,7 @@ var init_config4 = __esm(() => {
53352
53371
  RUNTIME_TEMPLATE_NAMESPACES = new Set(RUNTIME_BUILTIN_KEYS);
53353
53372
  });
53354
53373
 
53355
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/extension/capability-registry.js
53374
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/extension/capability-registry.js
53356
53375
  class CapabilityRegistry {
53357
53376
  kind;
53358
53377
  capabilities = new Map;
@@ -53383,7 +53402,7 @@ class CapabilityRegistry {
53383
53402
  }
53384
53403
  }
53385
53404
 
53386
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/extension/extension-path.js
53405
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/extension/extension-path.js
53387
53406
  function assertRelativeExtensionPath(path9, options = {}) {
53388
53407
  const where = options.sourceName !== undefined ? ` declared by "${options.sourceName}"` : "";
53389
53408
  if (/^([/\\]|[A-Za-z]:[/\\])/.test(path9)) {
@@ -53394,20 +53413,20 @@ function assertRelativeExtensionPath(path9, options = {}) {
53394
53413
  }
53395
53414
  }
53396
53415
 
53397
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/extension/extension-loader.js
53416
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/extension/extension-loader.js
53398
53417
  var init_extension_loader = () => {};
53399
53418
 
53400
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/extension/index.js
53419
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/extension/index.js
53401
53420
  var init_extension = __esm(() => {
53402
53421
  init_extension_loader();
53403
53422
  });
53404
53423
 
53405
- // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.24+0e570c46d7f56d30/node_modules/@gobing-ai/ts-runtime/dist/extension.js
53424
+ // ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.27+f7e0689639f664f9/node_modules/@gobing-ai/ts-runtime/dist/extension.js
53406
53425
  var init_extension2 = __esm(() => {
53407
53426
  init_extension();
53408
53427
  });
53409
53428
 
53410
- // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/host.js
53429
+ // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/host.js
53411
53430
  class WorkflowEngineHost {
53412
53431
  lifecycleBus;
53413
53432
  actions = new CapabilityRegistry("workflow action");
@@ -53576,7 +53595,7 @@ var init_host = __esm(() => {
53576
53595
  init_errors6();
53577
53596
  });
53578
53597
 
53579
- // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/schema-sql.js
53598
+ // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/schema-sql.js
53580
53599
  var WORKFLOW_ENGINE_SCHEMA_SQL;
53581
53600
  var init_schema_sql = __esm(() => {
53582
53601
  WORKFLOW_ENGINE_SCHEMA_SQL = `
@@ -53649,7 +53668,7 @@ CREATE TABLE IF NOT EXISTS action_runs (
53649
53668
  `.trim();
53650
53669
  });
53651
53670
 
53652
- // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/persistence.js
53671
+ // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/persistence.js
53653
53672
  async function applyWorkflowEngineSchema(db2) {
53654
53673
  for (const statement of WORKFLOW_ENGINE_SCHEMA_SQL.split(";")) {
53655
53674
  const sql4 = statement.trim();
@@ -53938,7 +53957,7 @@ var init_persistence = __esm(() => {
53938
53957
  init_schema_sql();
53939
53958
  });
53940
53959
 
53941
- // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/variables.js
53960
+ // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/variables.js
53942
53961
  function mergeVars(workflowVars = {}, overrideVars = {}) {
53943
53962
  return { ...workflowVars, ...overrideVars };
53944
53963
  }
@@ -53998,7 +54017,7 @@ var init_variables = __esm(() => {
53998
54017
  TEMPLATE_REF = /\$\{([^}]+)\}/g;
53999
54018
  });
54000
54019
 
54001
- // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/action-step.js
54020
+ // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/action-step.js
54002
54021
  async function runActionStep(action, vars, deps) {
54003
54022
  const { host, persistence, lifecycle, stateOrNodeId, runId } = deps;
54004
54023
  const resolved = resolveTemplates(action.options ?? {}, {
@@ -54056,7 +54075,7 @@ var init_action_step = __esm(() => {
54056
54075
  init_variables();
54057
54076
  });
54058
54077
 
54059
- // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/state-machine.js
54078
+ // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/state-machine.js
54060
54079
  class StateMachineDriver {
54061
54080
  options;
54062
54081
  constructor(options) {
@@ -54192,7 +54211,7 @@ var init_state_machine = __esm(() => {
54192
54211
  EMPTY_OUTCOME = { outcome: "completed", result: undefined };
54193
54212
  });
54194
54213
 
54195
- // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/transition-flow.js
54214
+ // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/transition-flow.js
54196
54215
  class TransitionFlowDriver {
54197
54216
  options;
54198
54217
  constructor(options) {
@@ -54311,7 +54330,7 @@ var init_transition_flow = __esm(() => {
54311
54330
  init_variables();
54312
54331
  });
54313
54332
 
54314
- // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/service.js
54333
+ // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/service.js
54315
54334
  class WorkflowService {
54316
54335
  host;
54317
54336
  persistence;
@@ -54528,7 +54547,7 @@ var init_service = __esm(() => {
54528
54547
  init_variables();
54529
54548
  });
54530
54549
 
54531
- // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/index.js
54550
+ // ../../node_modules/.bun/@gobing-ai+ts-dual-workflow-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-dual-workflow-engine/dist/index.js
54532
54551
  var init_dist7 = __esm(() => {
54533
54552
  init_config4();
54534
54553
  init_host();
@@ -54537,7 +54556,7 @@ var init_dist7 = __esm(() => {
54537
54556
  init_service();
54538
54557
  });
54539
54558
 
54540
- // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.24+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/hash.js
54559
+ // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.27+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/hash.js
54541
54560
  import { createHash as createHash2 } from "crypto";
54542
54561
  function stableJson(value) {
54543
54562
  if (Array.isArray(value)) {
@@ -54554,7 +54573,7 @@ function sha256(value) {
54554
54573
  }
54555
54574
  var init_hash = () => {};
54556
54575
 
54557
- // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.24+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/errors.js
54576
+ // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.27+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/errors.js
54558
54577
  var HistoryImportError;
54559
54578
  var init_errors7 = __esm(() => {
54560
54579
  HistoryImportError = class HistoryImportError extends Error {
@@ -54567,7 +54586,7 @@ var init_errors7 = __esm(() => {
54567
54586
  };
54568
54587
  });
54569
54588
 
54570
- // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.24+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/schema-sql.js
54589
+ // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.27+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/schema-sql.js
54571
54590
  var HISTORY_IMPORT_SCHEMA_SQL;
54572
54591
  var init_schema_sql2 = __esm(() => {
54573
54592
  HISTORY_IMPORT_SCHEMA_SQL = `
@@ -54711,7 +54730,7 @@ CREATE INDEX IF NOT EXISTS idx_history_tool_call_message_hash
54711
54730
  `.trim();
54712
54731
  });
54713
54732
 
54714
- // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.24+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/mappers.js
54733
+ // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.27+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/mappers.js
54715
54734
  function identityFieldMap(keys) {
54716
54735
  const map2 = {};
54717
54736
  for (const key of keys) {
@@ -54912,39 +54931,41 @@ function piSplit(raw) {
54912
54931
  }
54913
54932
  return entries;
54914
54933
  }
54915
- function ompSplit(raw) {
54934
+ function ompSplit(raw, context4) {
54935
+ const msg = raw.message;
54916
54936
  const recordType = String(raw.type ?? "");
54917
- if (recordType === "title" || recordType === "title_change" || recordType === "service_tier_change" || recordType === "ttsr_injection" || recordType === "session_init" || recordType === "compaction") {
54937
+ const sessionId = sessionIdFromContext(context4, raw);
54938
+ const seq = context4?.sourceLine ?? (typeof raw.seq === "number" ? raw.seq : 0);
54939
+ const ts = s(raw.ts, raw.timestamp, raw.createdAt) ?? new Date(0).toISOString();
54940
+ if (recordType === "title" || recordType === "title_change" || recordType === "service_tier_change" || recordType === "ttsr_injection" || recordType === "session_init" || recordType === "session" || recordType === "model_change" || recordType === "thinking_level_change" || recordType === "compaction" || recordType === "custom" || recordType === "custom_message" || recordType.startsWith("custom.")) {
54918
54941
  return [
54919
54942
  {
54920
54943
  targetTable: "history_message",
54921
54944
  record: {
54922
- session_id: s(raw.id, o2(raw.session).id) ?? "unknown",
54923
- seq: typeof raw.seq === "number" ? raw.seq : 0,
54945
+ session_id: sessionId,
54946
+ seq,
54924
54947
  role: "meta",
54925
54948
  record_type: recordType,
54926
54949
  disposition: "meta",
54927
- ts: s(raw.ts, raw.timestamp) ?? new Date(0).toISOString(),
54950
+ ts,
54928
54951
  provenance: "ambient"
54929
54952
  }
54930
54953
  }
54931
54954
  ];
54932
54955
  }
54933
54956
  const entries = [];
54934
- const sessionId = s(raw.id, o2(raw.session).id) ?? "unknown";
54935
- const seq = typeof raw.seq === "number" ? raw.seq : 0;
54936
- const ts = s(raw.ts, raw.timestamp, raw.createdAt) ?? new Date(0).toISOString();
54937
- const role = mapRole(raw.type ?? raw.role);
54938
- const model = s(raw.model, o2(raw.message).model);
54957
+ const role = mapRole(msg?.role ?? raw.type ?? raw.role);
54958
+ const model = s(raw.model, o2(msg).model);
54939
54959
  const cwd = s(raw.cwd, raw.dir);
54940
- const msg = raw.message;
54941
- const usage = msg?.usage;
54960
+ const usage = msg?.usage ?? raw.usage;
54942
54961
  const inputTokens = usage?.input ?? usage?.input_tokens ?? undefined;
54943
54962
  const outputTokens = usage?.output ?? usage?.output_tokens ?? undefined;
54944
54963
  const cacheRead = usage?.cacheRead ?? usage?.cache_read_tokens ?? undefined;
54945
54964
  const cacheWrite = usage?.cacheWrite ?? usage?.cache_write_tokens ?? undefined;
54946
54965
  const costObj = msg?.cost ?? raw.cost;
54947
54966
  const costUsd = typeof costObj?.total === "number" ? costObj.total : computeCost(inputTokens, outputTokens, model);
54967
+ const contentBlocks = msg?.content ?? raw.content;
54968
+ const durationMs = typeof msg?.duration === "number" && Number.isFinite(msg.duration) ? msg.duration : undefined;
54948
54969
  const messageSplitIndex = entries.length;
54949
54970
  entries.push({
54950
54971
  targetTable: "history_message",
@@ -54955,43 +54976,53 @@ function ompSplit(raw) {
54955
54976
  record_type: recordType,
54956
54977
  disposition: "keep",
54957
54978
  ts,
54958
- duration_ms: undefined,
54979
+ duration_ms: durationMs,
54959
54980
  model: model ?? null,
54960
54981
  input_tokens: inputTokens ?? null,
54961
54982
  output_tokens: outputTokens ?? null,
54962
54983
  cache_read_tokens: cacheRead ?? null,
54963
54984
  cache_write_tokens: cacheWrite ?? null,
54964
54985
  cost_usd: costUsd ?? null,
54965
- content_text: s(raw.content, raw.text, msg?.content) ?? null,
54986
+ content_text: extractContentText(contentBlocks) ?? s(raw.content, raw.text, msg?.content) ?? null,
54966
54987
  cwd: cwd ?? null,
54967
54988
  provenance: detectProvenance(cwd)
54968
54989
  }
54969
54990
  });
54970
- if (Array.isArray(raw.content) && role === "assistant") {
54971
- for (const block of raw.content) {
54972
- if (block?.toolCall) {
54973
- const tc = block.toolCall;
54974
- entries.push({
54975
- targetTable: "history_tool_call",
54976
- record: {
54977
- _messageSplitIndex: messageSplitIndex,
54978
- session_id: sessionId,
54979
- seq,
54980
- tool_name: String(tc.name ?? ""),
54981
- args_digest: argsDigest(tc.input ?? tc.arguments),
54982
- status: "ok",
54983
- started_at: undefined,
54984
- completed_at: undefined,
54985
- duration_ms: undefined,
54986
- result_bytes: undefined,
54987
- error_text: undefined
54988
- }
54989
- });
54990
- }
54991
+ if (Array.isArray(contentBlocks) && role === "assistant") {
54992
+ for (const block of contentBlocks) {
54993
+ const call = normalizeOmpToolCall(block);
54994
+ if (call === null)
54995
+ continue;
54996
+ entries.push({
54997
+ targetTable: "history_tool_call",
54998
+ record: {
54999
+ _messageSplitIndex: messageSplitIndex,
55000
+ session_id: sessionId,
55001
+ seq,
55002
+ tool_name: String(call.name ?? ""),
55003
+ args_digest: argsDigest(call.input ?? call.arguments),
55004
+ status: "ok",
55005
+ started_at: undefined,
55006
+ completed_at: undefined,
55007
+ duration_ms: undefined,
55008
+ result_bytes: undefined,
55009
+ error_text: undefined
55010
+ }
55011
+ });
54991
55012
  }
54992
55013
  }
54993
55014
  return entries;
54994
55015
  }
55016
+ function normalizeOmpToolCall(block) {
55017
+ if (typeof block !== "object" || block === null)
55018
+ return null;
55019
+ const nested = o2(block.toolCall);
55020
+ if (Object.keys(nested).length > 0)
55021
+ return nested;
55022
+ if (block.type === "toolCall")
55023
+ return block;
55024
+ return null;
55025
+ }
54995
55026
  function codexSplit(raw) {
54996
55027
  const entries = [];
54997
55028
  const payload = raw.payload ?? raw;
@@ -55763,7 +55794,7 @@ var init_mappers = __esm(() => {
55763
55794
  GEMINI_SCHEMA = passthroughSchema;
55764
55795
  });
55765
55796
 
55766
- // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.24+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/sources.js
55797
+ // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.27+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/sources.js
55767
55798
  function firstString(...values) {
55768
55799
  for (const value of values) {
55769
55800
  if (typeof value === "string" && value.length > 0)
@@ -55917,7 +55948,7 @@ var init_sources = __esm(() => {
55917
55948
  };
55918
55949
  });
55919
55950
 
55920
- // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.24+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/jsonl-importer-dao.js
55951
+ // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.27+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/jsonl-importer-dao.js
55921
55952
  function targetTableFor(table3) {
55922
55953
  if (!VALID_TABLE_NAME.test(table3)) {
55923
55954
  throw new HistoryImportError(`Invalid history ETL target table: ${table3}`, { table: table3 });
@@ -56013,6 +56044,43 @@ async function insertLedger(db2, recordHash, source, sourceFile, sourceLine, spl
56013
56044
  await db2.run(`INSERT INTO history_import_ledger (record_hash, source, source_file, source_line, split_index, target_table, imported_at)
56014
56045
  VALUES (?, ?, ?, ?, ?, ?, ?)`, recordHash, source, sourceFile, sourceLine, splitIndex, targetTable, timestamp(now2));
56015
56046
  }
56047
+ async function reconcileFullImport(db2, source, desiredHashes, discoveredFiles, dryRun) {
56048
+ const ledgerRows = await db2.queryAll("SELECT record_hash, target_table FROM history_import_ledger WHERE source = ?", source);
56049
+ const stale = [];
56050
+ for (const row of ledgerRows) {
56051
+ if (!desiredHashes.has(row.record_hash))
56052
+ stale.push(row);
56053
+ }
56054
+ const checkpointRows = await db2.queryAll("SELECT source_file FROM history_import_checkpoint WHERE source = ?", source);
56055
+ const discovered = new Set(discoveredFiles);
56056
+ const staleCheckpoints = checkpointRows.map((row) => row.source_file).filter((sourceFile) => !discovered.has(sourceFile));
56057
+ const summary = {
56058
+ staleTargetRows: stale.length,
56059
+ staleLedgerRows: stale.length,
56060
+ staleCheckpointRows: staleCheckpoints.length
56061
+ };
56062
+ if (dryRun || stale.length === 0 && staleCheckpoints.length === 0)
56063
+ return summary;
56064
+ const operations2 = [];
56065
+ for (const row of stale) {
56066
+ operations2.push({
56067
+ sql: `DELETE FROM ${targetTableFor(row.target_table)} WHERE record_hash = ?`,
56068
+ params: [row.record_hash]
56069
+ });
56070
+ operations2.push({
56071
+ sql: "DELETE FROM history_import_ledger WHERE record_hash = ?",
56072
+ params: [row.record_hash]
56073
+ });
56074
+ }
56075
+ for (const sourceFile of staleCheckpoints) {
56076
+ operations2.push({
56077
+ sql: "DELETE FROM history_import_checkpoint WHERE source = ? AND source_file = ?",
56078
+ params: [source, sourceFile]
56079
+ });
56080
+ }
56081
+ await db2.batch(operations2);
56082
+ return summary;
56083
+ }
56016
56084
  async function readOpenCodeMessages(db2, lastTime, lastId, limit) {
56017
56085
  return db2.queryAll(`SELECT m.id, m.session_id, m.time_created, m.data, s.directory
56018
56086
  FROM message m
@@ -56051,6 +56119,12 @@ function openCodeDeleteOperations(entries) {
56051
56119
  }
56052
56120
  ]);
56053
56121
  }
56122
+ function deleteCheckpointOperation(source, sourceFile) {
56123
+ return {
56124
+ sql: "DELETE FROM history_import_checkpoint WHERE source = ? AND source_file = ?",
56125
+ params: [source, sourceFile]
56126
+ };
56127
+ }
56054
56128
  function openCodeBulkWriteOperations(entries, checkpointFiles, now2) {
56055
56129
  const importedAt = timestamp(now2);
56056
56130
  const operations2 = [];
@@ -56157,7 +56231,7 @@ var init_jsonl_importer_dao = __esm(() => {
56157
56231
  _ensuredTables = new Set;
56158
56232
  });
56159
56233
 
56160
- // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.24+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/redaction.js
56234
+ // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.27+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/redaction.js
56161
56235
  function redactValue(value, rules = DEFAULT_REDACTION_RULES) {
56162
56236
  if (typeof value === "string") {
56163
56237
  return rules.reduce((current, rule) => current.replace(rule.pattern, rule.replacement), value);
@@ -56194,7 +56268,7 @@ var init_redaction = __esm(() => {
56194
56268
  ];
56195
56269
  });
56196
56270
 
56197
- // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.24+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/importer.js
56271
+ // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.27+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/importer.js
56198
56272
  async function runJsonlImport(source, options) {
56199
56273
  const definition = resolveSourceDefinition(source);
56200
56274
  const resolvedSource = definition.source;
@@ -56213,6 +56287,7 @@ async function runJsonlImport(source, options) {
56213
56287
  let skippedDuplicates = 0;
56214
56288
  let unknownRecords = 0;
56215
56289
  let checkpointUpdates = 0;
56290
+ const desiredHashes = new Set;
56216
56291
  for (const file2 of files) {
56217
56292
  const checkpoint = mode === "incremental" ? await readCheckpoint(options.db, resolvedSource, file2) : 0;
56218
56293
  let lineNumber = 0;
@@ -56232,6 +56307,7 @@ async function runJsonlImport(source, options) {
56232
56307
  splitIndex: 0
56233
56308
  });
56234
56309
  let lineSucceeded = false;
56310
+ let lineRejected = false;
56235
56311
  const prepared = [];
56236
56312
  for (let splitIndex = 0;splitIndex < splitRecords.length; splitIndex += 1) {
56237
56313
  const split = splitRecords[splitIndex];
@@ -56250,6 +56326,7 @@ async function runJsonlImport(source, options) {
56250
56326
  sourceLine: lineNumber,
56251
56327
  reason: parsed.error.issues.map((issue2) => issue2.message).join("; ")
56252
56328
  });
56329
+ lineRejected = true;
56253
56330
  continue;
56254
56331
  }
56255
56332
  const redacted = redactRecord(parsed.data, options.redactionRules);
@@ -56261,12 +56338,15 @@ async function runJsonlImport(source, options) {
56261
56338
  splitIndex,
56262
56339
  record: redacted
56263
56340
  });
56341
+ desiredHashes.add(recordHash);
56264
56342
  if (await ledgerExists(options.db, recordHash)) {
56265
56343
  skippedDuplicates += 1;
56266
56344
  continue;
56267
56345
  }
56268
56346
  prepared.push({ split, splitIndex, normalized: redacted, recordHash });
56269
56347
  }
56348
+ if (lineRejected)
56349
+ continue;
56270
56350
  const recordHashBySplitIndex = new Map(prepared.map((e) => [e.splitIndex, e.recordHash]));
56271
56351
  for (const entry of prepared) {
56272
56352
  const { split, splitIndex, normalized, recordHash } = entry;
@@ -56293,6 +56373,10 @@ async function runJsonlImport(source, options) {
56293
56373
  }
56294
56374
  }
56295
56375
  }
56376
+ let reconciliation;
56377
+ if (mode === "full") {
56378
+ reconciliation = await reconcileFullImport(options.db, resolvedSource, desiredHashes, files, options.dryRun ?? false);
56379
+ }
56296
56380
  return {
56297
56381
  source: resolvedSource,
56298
56382
  mode,
@@ -56303,7 +56387,8 @@ async function runJsonlImport(source, options) {
56303
56387
  unknownRecords,
56304
56388
  parseErrors,
56305
56389
  validationErrors,
56306
- checkpointUpdates
56390
+ checkpointUpdates,
56391
+ reconciliation
56307
56392
  };
56308
56393
  }
56309
56394
  function parseJsonLine(line, sourceFile, sourceLine, parseErrors) {
@@ -56421,7 +56506,7 @@ var init_importer = __esm(() => {
56421
56506
  init_sources();
56422
56507
  });
56423
56508
 
56424
- // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.24+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/opencode-importer.js
56509
+ // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.27+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/opencode-importer.js
56425
56510
  async function runOpenCodeImport(options) {
56426
56511
  const paths = options.paths ?? ambientRuntimePaths2();
56427
56512
  const sourceDatabase = options.sourceDatabase ?? joinPath2(paths.home, ".local/share/opencode/opencode.db");
@@ -56440,7 +56525,12 @@ async function runOpenCodeImport(options) {
56440
56525
  let lastTime = -1;
56441
56526
  let lastId = "";
56442
56527
  const existingBySourceFile = await readOpenCodeExistingEntries(options.db);
56528
+ const seenSourceFiles = new Set;
56443
56529
  const operations2 = [];
56530
+ let staleTargetRows = 0;
56531
+ let staleLedgerRows = 0;
56532
+ let staleCheckpointRows = 0;
56533
+ let reconciliation;
56444
56534
  try {
56445
56535
  while (true) {
56446
56536
  const messages = await readOpenCodeMessages(sourceDb, lastTime, lastId, PAGE_SIZE);
@@ -56462,11 +56552,16 @@ async function runOpenCodeImport(options) {
56462
56552
  validationErrors.push({ sourceFile, sourceLine: 1, reason: "OpenCode message has no valid role" });
56463
56553
  continue;
56464
56554
  }
56555
+ seenSourceFiles.add(sourceFile);
56465
56556
  const existing = existingBySourceFile.get(sourceFile) ?? [];
56466
56557
  if (sameHashes(existing, entries)) {
56467
56558
  skippedDuplicates += entries.length;
56468
56559
  continue;
56469
56560
  }
56561
+ if (mode === "full") {
56562
+ staleTargetRows += existing.length;
56563
+ staleLedgerRows += existing.length;
56564
+ }
56470
56565
  if (!options.dryRun) {
56471
56566
  operations2.push(...openCodeDeleteOperations(existing));
56472
56567
  for (const entry of entries) {
@@ -56487,6 +56582,20 @@ async function runOpenCodeImport(options) {
56487
56582
  lastTime = tail.time_created;
56488
56583
  lastId = tail.id;
56489
56584
  }
56585
+ if (mode === "full") {
56586
+ for (const [sourceFile, entries] of existingBySourceFile) {
56587
+ if (seenSourceFiles.has(sourceFile))
56588
+ continue;
56589
+ staleLedgerRows += entries.length;
56590
+ staleTargetRows += entries.length;
56591
+ staleCheckpointRows += 1;
56592
+ if (!options.dryRun) {
56593
+ operations2.push(...openCodeDeleteOperations(entries));
56594
+ operations2.push(deleteCheckpointOperation(SOURCE, sourceFile));
56595
+ }
56596
+ }
56597
+ reconciliation = { staleTargetRows, staleLedgerRows, staleCheckpointRows };
56598
+ }
56490
56599
  if (operations2.length > 0)
56491
56600
  await options.db.batch(operations2);
56492
56601
  } finally {
@@ -56502,7 +56611,8 @@ async function runOpenCodeImport(options) {
56502
56611
  unknownRecords: 0,
56503
56612
  parseErrors,
56504
56613
  validationErrors,
56505
- checkpointUpdates
56614
+ checkpointUpdates,
56615
+ reconciliation
56506
56616
  };
56507
56617
  }
56508
56618
  function groupParts(parts) {
@@ -56647,14 +56757,14 @@ var init_opencode_importer = __esm(() => {
56647
56757
  init_redaction();
56648
56758
  });
56649
56759
 
56650
- // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.24+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/index.js
56760
+ // ../../node_modules/.bun/@gobing-ai+ts-llm-jsonl-importer@0.4.27+d5c29f764bf0e6e0/node_modules/@gobing-ai/ts-llm-jsonl-importer/dist/index.js
56651
56761
  var init_dist8 = __esm(() => {
56652
56762
  init_importer();
56653
56763
  init_opencode_importer();
56654
56764
  init_schema_sql2();
56655
56765
  });
56656
56766
 
56657
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/config/extensions.js
56767
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/config/extensions.js
56658
56768
  function collectExtensions(sourceName, sourceDir, extensions) {
56659
56769
  if (extensions === undefined)
56660
56770
  return [];
@@ -56670,7 +56780,7 @@ var init_extensions = __esm(() => {
56670
56780
  init_dist5();
56671
56781
  });
56672
56782
 
56673
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/types.js
56783
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/types.js
56674
56784
  function createFinding(rule, message, filePath, extras = {}) {
56675
56785
  return {
56676
56786
  ruleId: rule.id,
@@ -56741,7 +56851,7 @@ var init_types3 = __esm(() => {
56741
56851
  });
56742
56852
  });
56743
56853
 
56744
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/config/loader.js
56854
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/config/loader.js
56745
56855
  async function loadPreset(name, options) {
56746
56856
  const merged = await buildMergedRoots(options.roots.map((root) => resolvePath4(root)), options.fileSystem);
56747
56857
  const presetPath = findMergedPreset(merged, name);
@@ -56956,7 +57066,7 @@ var init_loader2 = __esm(() => {
56956
57066
  FIX_MODE_AUTHORITY = { none: 0, suggest: 1, auto: 2 };
56957
57067
  });
56958
57068
 
56959
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/fixers/test-stub-fixer.js
57069
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/fixers/test-stub-fixer.js
56960
57070
  function normalizeFindingPath(filePath) {
56961
57071
  if (!filePath || isAbsolutePath2(filePath))
56962
57072
  return null;
@@ -57021,7 +57131,7 @@ var init_test_stub_fixer = __esm(() => {
57021
57131
  realFileSystem = createNodeFileSystem3();
57022
57132
  });
57023
57133
 
57024
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/fixers/fixers.js
57134
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/fixers/fixers.js
57025
57135
  function registerBuiltinFixers(host, exec) {
57026
57136
  const regexFixer = new RegexFixerProvider;
57027
57137
  const pathFixer = new PathFixerProvider;
@@ -57224,7 +57334,7 @@ var init_fixers = __esm(() => {
57224
57334
  };
57225
57335
  });
57226
57336
 
57227
- // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.24+fd3bcbcfd5172c57/node_modules/@gobing-ai/ts-ai-runner/dist/agents/shims.js
57337
+ // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.27+7c83d7dc3b29919c/node_modules/@gobing-ai/ts-ai-runner/dist/agents/shims.js
57228
57338
  function getAgentSessionCapability(agent) {
57229
57339
  return AGENT_SESSION_CAPABILITY[agent];
57230
57340
  }
@@ -57516,7 +57626,7 @@ var init_shims = __esm(() => {
57516
57626
  ALIAS_TO_CANONICAL = Object.fromEntries(Object.values(AGENT_SHIMS).flatMap((shim) => (shim.aliases ?? []).map((alias3) => [alias3, shim.name])));
57517
57627
  });
57518
57628
 
57519
- // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.24+fd3bcbcfd5172c57/node_modules/@gobing-ai/ts-ai-runner/dist/identity.js
57629
+ // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.27+7c83d7dc3b29919c/node_modules/@gobing-ai/ts-ai-runner/dist/identity.js
57520
57630
  function buildIdentityPreamble(ctx) {
57521
57631
  const sections = [
57522
57632
  `You are agent \`${ctx.agentId}\` (${ctx.agentType}) in workspace \`${ctx.workspace}\`.`
@@ -57576,7 +57686,7 @@ var init_identity = __esm(() => {
57576
57686
  init_dist5();
57577
57687
  });
57578
57688
 
57579
- // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.24+fd3bcbcfd5172c57/node_modules/@gobing-ai/ts-ai-runner/dist/slash-command.js
57689
+ // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.27+7c83d7dc3b29919c/node_modules/@gobing-ai/ts-ai-runner/dist/slash-command.js
57580
57690
  function isClaudeStyleSlashCommand(input) {
57581
57691
  return SLASH_COMMAND_RE.test(input);
57582
57692
  }
@@ -57604,7 +57714,7 @@ var init_slash_command = __esm(() => {
57604
57714
  SLASH_COMMAND_RE = /^\/([a-zA-Z0-9._-]+):([a-zA-Z0-9._-]+)(\s.*)?$/;
57605
57715
  });
57606
57716
 
57607
- // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.24+fd3bcbcfd5172c57/node_modules/@gobing-ai/ts-ai-runner/dist/ai-runner.js
57717
+ // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.27+7c83d7dc3b29919c/node_modules/@gobing-ai/ts-ai-runner/dist/ai-runner.js
57608
57718
  function buildCorrelationEnv(correlation) {
57609
57719
  return {
57610
57720
  [AGENT_RUN_ID_ENV]: correlation.runId,
@@ -57740,7 +57850,7 @@ var init_ai_runner = __esm(() => {
57740
57850
  init_slash_command();
57741
57851
  });
57742
57852
 
57743
- // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.24+fd3bcbcfd5172c57/node_modules/@gobing-ai/ts-ai-runner/dist/agent-detector.js
57853
+ // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.27+7c83d7dc3b29919c/node_modules/@gobing-ai/ts-ai-runner/dist/agent-detector.js
57744
57854
  class AgentDetector {
57745
57855
  runner;
57746
57856
  timeout;
@@ -57816,7 +57926,7 @@ var init_agent_detector = __esm(() => {
57816
57926
  VERSION_PATTERN = /(?<version>\d+\.\d+(?:\.\d+)?)/;
57817
57927
  });
57818
57928
 
57819
- // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.24+fd3bcbcfd5172c57/node_modules/@gobing-ai/ts-ai-runner/dist/agent-spec.js
57929
+ // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.27+7c83d7dc3b29919c/node_modules/@gobing-ai/ts-ai-runner/dist/agent-spec.js
57820
57930
  function validateAgentId(id) {
57821
57931
  if (!/^[a-z][a-z0-9_-]{1,63}$/.test(id)) {
57822
57932
  throw new ValueError(`Invalid agent id "${id}": expected 2-64 chars, lowercase alphanumeric, "_" or "-"`);
@@ -57913,7 +58023,7 @@ var init_agent_spec = __esm(() => {
57913
58023
  };
57914
58024
  });
57915
58025
 
57916
- // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.24+fd3bcbcfd5172c57/node_modules/@gobing-ai/ts-ai-runner/dist/agents/auth-shims.js
58026
+ // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.27+7c83d7dc3b29919c/node_modules/@gobing-ai/ts-ai-runner/dist/agents/auth-shims.js
57917
58027
  function isNonEmpty(value) {
57918
58028
  return value !== undefined && value.trim().length > 0;
57919
58029
  }
@@ -58018,7 +58128,7 @@ var init_auth_shims = __esm(() => {
58018
58128
  };
58019
58129
  });
58020
58130
 
58021
- // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.24+fd3bcbcfd5172c57/node_modules/@gobing-ai/ts-ai-runner/dist/model-health-probe.js
58131
+ // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.27+7c83d7dc3b29919c/node_modules/@gobing-ai/ts-ai-runner/dist/model-health-probe.js
58022
58132
  class ModelHealthProbeRegistry {
58023
58133
  probes = new Map;
58024
58134
  register(providerPrefix, probe) {
@@ -58126,7 +58236,7 @@ var init_model_health_probe = __esm(() => {
58126
58236
  };
58127
58237
  });
58128
58238
 
58129
- // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.24+fd3bcbcfd5172c57/node_modules/@gobing-ai/ts-ai-runner/dist/doctor-runner.js
58239
+ // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.27+7c83d7dc3b29919c/node_modules/@gobing-ai/ts-ai-runner/dist/doctor-runner.js
58130
58240
  class DoctorRunner {
58131
58241
  detector;
58132
58242
  runner;
@@ -58263,15 +58373,15 @@ var init_doctor_runner = __esm(() => {
58263
58373
  init_model_health_probe();
58264
58374
  });
58265
58375
 
58266
- // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.24+fd3bcbcfd5172c57/node_modules/@gobing-ai/ts-ai-runner/dist/events.js
58376
+ // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.27+7c83d7dc3b29919c/node_modules/@gobing-ai/ts-ai-runner/dist/events.js
58267
58377
  var init_events = () => {};
58268
58378
 
58269
- // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.24+fd3bcbcfd5172c57/node_modules/@gobing-ai/ts-ai-runner/dist/messages.js
58379
+ // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.27+7c83d7dc3b29919c/node_modules/@gobing-ai/ts-ai-runner/dist/messages.js
58270
58380
  function formatMessage(msg) {
58271
58381
  return `[task from=${msg.fromId ?? "operator"} id=${msg.id}] ${msg.body}`;
58272
58382
  }
58273
58383
 
58274
- // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.24+fd3bcbcfd5172c57/node_modules/@gobing-ai/ts-ai-runner/dist/team-agent-process.js
58384
+ // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.27+7c83d7dc3b29919c/node_modules/@gobing-ai/ts-ai-runner/dist/team-agent-process.js
58275
58385
  import { Buffer as Buffer5 } from "buffer";
58276
58386
 
58277
58387
  class TeamAgentProcess {
@@ -58405,7 +58515,7 @@ var init_team_agent_process = __esm(() => {
58405
58515
  init_dist5();
58406
58516
  });
58407
58517
 
58408
- // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.24+fd3bcbcfd5172c57/node_modules/@gobing-ai/ts-ai-runner/dist/team-orchestrator.js
58518
+ // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.27+7c83d7dc3b29919c/node_modules/@gobing-ai/ts-ai-runner/dist/team-orchestrator.js
58409
58519
  class TeamOrchestrator {
58410
58520
  configDir;
58411
58521
  inbox;
@@ -58534,7 +58644,7 @@ var init_team_orchestrator = __esm(() => {
58534
58644
  init_team_agent_process();
58535
58645
  });
58536
58646
 
58537
- // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.24+fd3bcbcfd5172c57/node_modules/@gobing-ai/ts-ai-runner/dist/index.js
58647
+ // ../../node_modules/.bun/@gobing-ai+ts-ai-runner@0.4.27+7c83d7dc3b29919c/node_modules/@gobing-ai/ts-ai-runner/dist/index.js
58538
58648
  var exports_dist3 = {};
58539
58649
  __export(exports_dist3, {
58540
58650
  validateAgentId: () => validateAgentId,
@@ -58586,7 +58696,7 @@ var init_dist9 = __esm(() => {
58586
58696
  init_team_orchestrator();
58587
58697
  });
58588
58698
 
58589
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/config-access.js
58699
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/config-access.js
58590
58700
  function stringArray(value) {
58591
58701
  return Array.isArray(value) && value.every((item) => typeof item === "string") ? value : undefined;
58592
58702
  }
@@ -58624,7 +58734,7 @@ function parseInlineFlags(source) {
58624
58734
  return { flags, rest: source.slice(match[0].length) };
58625
58735
  }
58626
58736
 
58627
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/glob-match.js
58737
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/glob-match.js
58628
58738
  function matchesAny(path9, patterns) {
58629
58739
  if (patterns === undefined || patterns.length === 0)
58630
58740
  return true;
@@ -58672,7 +58782,7 @@ function escapeRegExp(value) {
58672
58782
  return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
58673
58783
  }
58674
58784
 
58675
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/file-discovery.js
58785
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/file-discovery.js
58676
58786
  async function discoverFiles2(options) {
58677
58787
  const fs3 = options.fs ?? createNodeFileSystem3();
58678
58788
  const allFiles = await walkDir2(options.workdir, fs3, DEFAULT_EXCLUDES);
@@ -58700,12 +58810,12 @@ var init_file_discovery = __esm(() => {
58700
58810
  DEFAULT_EXCLUDES = new Set([".git", "node_modules", "dist", ".coverage", ".astro", ".wrangler"]);
58701
58811
  });
58702
58812
 
58703
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/file-utils.js
58813
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/file-utils.js
58704
58814
  var init_file_utils = __esm(() => {
58705
58815
  init_file_discovery();
58706
58816
  });
58707
58817
 
58708
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/agent-detection-evaluator.js
58818
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/agent-detection-evaluator.js
58709
58819
  class AgentDetectionEvaluator {
58710
58820
  detector;
58711
58821
  constructor(detector = new AgentDetector) {
@@ -58733,7 +58843,7 @@ var init_agent_detection_evaluator = __esm(() => {
58733
58843
  init_file_utils();
58734
58844
  });
58735
58845
 
58736
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/coverage-gate-evaluator.js
58846
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/coverage-gate-evaluator.js
58737
58847
  class CoverageGateEvaluator {
58738
58848
  constructor() {}
58739
58849
  async evaluate(rule, context4) {
@@ -58817,7 +58927,7 @@ var init_coverage_gate_evaluator = __esm(() => {
58817
58927
  init_file_utils();
58818
58928
  });
58819
58929
 
58820
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/exit-code-evaluator.js
58930
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/exit-code-evaluator.js
58821
58931
  class ExitCodeEvaluator {
58822
58932
  executor;
58823
58933
  constructor(executor = nodeBunFactory3.createProcessExecutor()) {
@@ -58853,7 +58963,7 @@ var init_exit_code_evaluator = __esm(() => {
58853
58963
  init_file_utils();
58854
58964
  });
58855
58965
 
58856
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/forbidden-import-evaluator.js
58966
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/forbidden-import-evaluator.js
58857
58967
  class ForbiddenImportEvaluator {
58858
58968
  constructor() {}
58859
58969
  async evaluate(rule, context4) {
@@ -58934,7 +59044,7 @@ var init_forbidden_import_evaluator = __esm(() => {
58934
59044
  init_file_utils();
58935
59045
  });
58936
59046
 
58937
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/import-boundary-evaluator.js
59047
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/import-boundary-evaluator.js
58938
59048
  class ImportBoundaryEvaluator {
58939
59049
  async evaluate(rule, context4) {
58940
59050
  const config4 = rule.evaluator.config ?? {};
@@ -59027,7 +59137,7 @@ var init_import_boundary_evaluator = __esm(() => {
59027
59137
  init_file_utils();
59028
59138
  });
59029
59139
 
59030
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/path-evaluator.js
59140
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/path-evaluator.js
59031
59141
  class PathEvaluator {
59032
59142
  constructor() {}
59033
59143
  async evaluate(rule, context4) {
@@ -59088,7 +59198,7 @@ var init_path_evaluator = __esm(() => {
59088
59198
  init_file_utils();
59089
59199
  });
59090
59200
 
59091
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/regex-evaluator.js
59201
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/regex-evaluator.js
59092
59202
  class RegexEvaluator {
59093
59203
  constructor() {}
59094
59204
  async evaluate(rule, context4) {
@@ -59166,7 +59276,7 @@ var init_regex_evaluator = __esm(() => {
59166
59276
  init_file_utils();
59167
59277
  });
59168
59278
 
59169
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/ripgrep-evaluator.js
59279
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/ripgrep-evaluator.js
59170
59280
  class RipgrepEvaluator {
59171
59281
  executor;
59172
59282
  constructor(executor = nodeBunFactory3.createProcessExecutor()) {
@@ -59259,7 +59369,7 @@ var init_ripgrep_evaluator = __esm(() => {
59259
59369
  init_file_utils();
59260
59370
  });
59261
59371
 
59262
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/schema-artifact-evaluator.js
59372
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/schema-artifact-evaluator.js
59263
59373
  class SchemaArtifactEvaluator {
59264
59374
  constructor() {}
59265
59375
  async evaluate(rule, context4) {
@@ -59337,7 +59447,7 @@ var init_schema_artifact_evaluator = __esm(() => {
59337
59447
  init_file_utils();
59338
59448
  });
59339
59449
 
59340
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/secrets-scanner-evaluator.js
59450
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/secrets-scanner-evaluator.js
59341
59451
  class SecretsScannerEvaluator {
59342
59452
  constructor() {}
59343
59453
  async evaluate(rule, context4) {
@@ -59405,7 +59515,7 @@ var init_secrets_scanner_evaluator = __esm(() => {
59405
59515
  ALL_CATEGORIES = Object.keys(BUILTIN_PATTERNS);
59406
59516
  });
59407
59517
 
59408
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/sg-evaluator.js
59518
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/sg-evaluator.js
59409
59519
  class SgEvaluator {
59410
59520
  executor;
59411
59521
  constructor(executor = nodeBunFactory3.createProcessExecutor()) {
@@ -59502,7 +59612,7 @@ var init_sg_evaluator = __esm(() => {
59502
59612
  init_file_utils();
59503
59613
  });
59504
59614
 
59505
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/resolvers/test-path-resolver.js
59615
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/resolvers/test-path-resolver.js
59506
59616
  class TypeScriptTestPathResolver {
59507
59617
  name = "typescript";
59508
59618
  constructor() {}
@@ -59585,7 +59695,7 @@ function testify(rel) {
59585
59695
  return `${dir}test_${base2}`;
59586
59696
  }
59587
59697
 
59588
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/test-location-evaluator.js
59698
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/test-location-evaluator.js
59589
59699
  class TestLocationEvaluator {
59590
59700
  resolvers;
59591
59701
  constructor(resolvers) {
@@ -59660,7 +59770,7 @@ var init_test_location_evaluator = __esm(() => {
59660
59770
  TYPESCRIPT_FALLBACK = new TypeScriptTestPathResolver;
59661
59771
  });
59662
59772
 
59663
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/tsdoc-export-evaluator.js
59773
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/evaluators/tsdoc-export-evaluator.js
59664
59774
  class TsdocExportEvaluator {
59665
59775
  constructor() {}
59666
59776
  async evaluate(rule, context4) {
@@ -59745,7 +59855,7 @@ var init_tsdoc_export_evaluator = __esm(() => {
59745
59855
  };
59746
59856
  });
59747
59857
 
59748
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/formatters/json.js
59858
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/formatters/json.js
59749
59859
  class JsonFormatter {
59750
59860
  constructor() {}
59751
59861
  format(result) {
@@ -59753,7 +59863,7 @@ class JsonFormatter {
59753
59863
  }
59754
59864
  }
59755
59865
 
59756
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/formatters/text.js
59866
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/formatters/text.js
59757
59867
  class TextFormatter {
59758
59868
  constructor() {}
59759
59869
  format(result) {
@@ -59767,7 +59877,7 @@ class TextFormatter {
59767
59877
  }
59768
59878
  }
59769
59879
 
59770
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/host/builtins.js
59880
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/host/builtins.js
59771
59881
  function registerBuiltins(host, executor) {
59772
59882
  const path9 = new PathEvaluator;
59773
59883
  host.evaluators.register("regex", new RegexEvaluator, "builtin");
@@ -59807,7 +59917,7 @@ var init_builtins = __esm(() => {
59807
59917
  init_tsdoc_export_evaluator();
59808
59918
  });
59809
59919
 
59810
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/host/rule-engine-host.js
59920
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/host/rule-engine-host.js
59811
59921
  class RuleEngineHost {
59812
59922
  evaluators;
59813
59923
  formatters;
@@ -59824,7 +59934,7 @@ var init_rule_engine_host = __esm(() => {
59824
59934
  init_extension2();
59825
59935
  });
59826
59936
 
59827
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/engine.js
59937
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/engine.js
59828
59938
  class RuleEngine {
59829
59939
  host;
59830
59940
  events;
@@ -59995,7 +60105,7 @@ var init_engine = __esm(() => {
59995
60105
  init_types3();
59996
60106
  });
59997
60107
 
59998
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/host/bundled-rules.js
60108
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/host/bundled-rules.js
59999
60109
  async function bundledRulesRoot() {
60000
60110
  if (cachedRoot2 !== undefined)
60001
60111
  return cachedRoot2;
@@ -60046,7 +60156,7 @@ var init_bundled_rules = __esm(() => {
60046
60156
  init_dist5();
60047
60157
  });
60048
60158
 
60049
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/persistence/db-adapter.js
60159
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/persistence/db-adapter.js
60050
60160
  class DbRulePersistenceAdapter {
60051
60161
  db;
60052
60162
  constructor(db2) {
@@ -60080,7 +60190,7 @@ class DbRulePersistenceAdapter {
60080
60190
  }
60081
60191
  }
60082
60192
 
60083
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/persistence/schema.js
60193
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/persistence/schema.js
60084
60194
  var RULE_ENGINE_SCHEMA_SQL = `
60085
60195
  CREATE TABLE IF NOT EXISTS rule_runs (
60086
60196
  id TEXT PRIMARY KEY,
@@ -60126,10 +60236,10 @@ CREATE TABLE IF NOT EXISTS rule_eval_runs (
60126
60236
  CREATE INDEX IF NOT EXISTS idx_rule_eval_runs_run_id ON rule_eval_runs (run_id);
60127
60237
  `;
60128
60238
 
60129
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/persistence/index.js
60239
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/persistence/index.js
60130
60240
  var init_persistence2 = () => {};
60131
60241
 
60132
- // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.24+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/index.js
60242
+ // ../../node_modules/.bun/@gobing-ai+ts-rule-engine@0.4.27+eb8900f44f4776f9/node_modules/@gobing-ai/ts-rule-engine/dist/index.js
60133
60243
  var init_dist10 = __esm(() => {
60134
60244
  init_extensions();
60135
60245
  init_loader2();
@@ -60206,6 +60316,11 @@ async function applyCliMigrations(adapter, migrations = CLI_MIGRATIONS) {
60206
60316
  const existing = await adapter.queryFirst('SELECT id FROM "__spur_cli_migrations" WHERE id = ?', migration.id);
60207
60317
  if (existing != null)
60208
60318
  continue;
60319
+ if (migration.id === "0009_spur_cli_history_message_run_idx" && !await tableExists(adapter, "history_message")) {
60320
+ for (const statement of splitSqlStatements(HISTORY_IMPORT_SCHEMA_SQL)) {
60321
+ await adapter.exec(statement);
60322
+ }
60323
+ }
60209
60324
  const addColumnGuard = migration.addColumnIfMissing;
60210
60325
  const shouldApplySql = addColumnGuard === undefined || !await columnExists(adapter, addColumnGuard.table, addColumnGuard.column);
60211
60326
  if (shouldApplySql) {
@@ -60235,6 +60350,10 @@ async function columnExists(adapter, table3, column2) {
60235
60350
  const rows = await adapter.queryAll(`PRAGMA table_info("${table3}")`);
60236
60351
  return rows.some((row) => row.name === column2);
60237
60352
  }
60353
+ async function tableExists(adapter, table3) {
60354
+ const row = await adapter.queryFirst("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?", table3);
60355
+ return row != null;
60356
+ }
60238
60357
  function splitSqlStatements(sql4) {
60239
60358
  return sql4.split(";").map((statement) => statement.trim()).filter(Boolean);
60240
60359
  }
@@ -60352,7 +60471,7 @@ ${SYSTEM_EVENTS_SCHEMA_SQL}
60352
60471
  ];
60353
60472
  });
60354
60473
 
60355
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/job-queue/db-job-queue.js
60474
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/job-queue/db-job-queue.js
60356
60475
  function queueLogger() {
60357
60476
  if (!_queueLogger)
60358
60477
  _queueLogger = getLogger2("job-queue");
@@ -60629,7 +60748,7 @@ var init_db_job_queue = __esm(() => {
60629
60748
  init_tracing2();
60630
60749
  });
60631
60750
 
60632
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/job-queue-db.js
60751
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/job-queue-db.js
60633
60752
  var exports_job_queue_db = {};
60634
60753
  __export(exports_job_queue_db, {
60635
60754
  DBQueueConsumer: () => DBQueueConsumer,
@@ -62732,12 +62851,14 @@ __export(exports_src, {
62732
62851
  normalizeTaskStatus: () => normalizeTaskStatus,
62733
62852
  normalizeFeatureStatus: () => normalizeFeatureStatus,
62734
62853
  normalizeCapabilityTier: () => normalizeCapabilityTier,
62854
+ normalizeAcFence: () => normalizeAcFence,
62735
62855
  messageRollup: () => messageRollup,
62736
62856
  mergeStubs: () => mergeStubs,
62737
62857
  matrixEntrySchema: () => matrixEntrySchema,
62738
62858
  matchEtlPayloads: () => matchEtlPayloads,
62739
62859
  matchEtlForAction: () => matchEtlForAction,
62740
62860
  loops: () => loops,
62861
+ looksLikeGherkinAc: () => looksLikeGherkinAc,
62741
62862
  loadSqlMigrations: () => loadSqlMigrations,
62742
62863
  loadAllEtlPayloads: () => loadAllEtlPayloads,
62743
62864
  isTierEligible: () => isTierEligible,
@@ -64757,6 +64878,10 @@ function hasAdjacentFileLineColumns(body) {
64757
64878
  }
64758
64879
  return false;
64759
64880
  }
64881
+ function hasSolutionFileLineCitation(body) {
64882
+ const hasFileLine = /`[^`]+?:\d+(-\d+)?`/.test(body) || /[^\s`]\.\w+:\d+/.test(body);
64883
+ return hasFileLine || hasAdjacentFileLineColumns(body);
64884
+ }
64760
64885
  var TaskCheckService;
64761
64886
  var init_task_check = __esm(() => {
64762
64887
  init_src2();
@@ -64899,18 +65024,14 @@ var init_task_check = __esm(() => {
64899
65024
  }
64900
65025
  }
64901
65026
  const solBody = doc2.getSection("Solution");
64902
- if (solBody !== null && !isPlaceholderBody(solBody)) {
64903
- const hasFileLine = /`[^`]+?:\d+(-\d+)?`/.test(solBody) || /[^\s`]\.\w+:\d+/.test(solBody);
64904
- const hasTableFileLine = hasFileLine || hasAdjacentFileLineColumns(solBody);
64905
- if (!hasTableFileLine) {
64906
- findings.push({
64907
- layer: "L3",
64908
- code: FINDING_CODES.L3_SOLUTION_FILE_LINE,
64909
- severity: "error",
64910
- section: "Solution",
64911
- message: "Solution must contain at least one `file:line` citation"
64912
- });
64913
- }
65027
+ if (solBody !== null && !isPlaceholderBody(solBody) && !hasSolutionFileLineCitation(solBody)) {
65028
+ findings.push({
65029
+ layer: "L3",
65030
+ code: FINDING_CODES.L3_SOLUTION_FILE_LINE,
65031
+ severity: "error",
65032
+ section: "Solution",
65033
+ message: "Solution must contain at least one `file:line` citation"
65034
+ });
64914
65035
  }
64915
65036
  const revBody = doc2.getSection("Review");
64916
65037
  const revRequired = (entry?.required ?? []).includes("Review");
@@ -66801,7 +66922,8 @@ class FeatureService {
66801
66922
  const slug = basename2(f.filePath).replace(/^[A-Z][1-9]*_/, "").replace(/\.md$/, "");
66802
66923
  const newPath = `${this.ctx.featuresDir}/${newId}_${slug}.md`;
66803
66924
  removed.push({ path: f.filePath, content: raw });
66804
- await atomicWriteAsync(newPath, doc2.serialize(), newId, this.ctx.fs, this.ctx.projectName ?? "spur");
66925
+ const movedContent = doc2.serialize().replace(/^#\s+[A-Z][1-9]*:/m, `# ${newId}:`);
66926
+ await atomicWriteAsync(newPath, movedContent, newId, this.ctx.fs, this.ctx.projectName ?? "spur");
66805
66927
  created.push(newPath);
66806
66928
  if (newPath !== f.filePath)
66807
66929
  await this.ctx.fs.deleteFile(f.filePath);
@@ -67142,7 +67264,9 @@ class HistoryService {
67142
67264
  toolCalls: r.toolCalls,
67143
67265
  tokens: r.tokens ?? 0,
67144
67266
  costUsd: r.costUsd ?? 0,
67145
- topTool: r.topTool
67267
+ topTool: r.topTool,
67268
+ assistantDurationMs: r.assistantDurationMs ?? 0,
67269
+ assistantDurationUnmeasured: r.assistantDurationUnmeasured
67146
67270
  })),
67147
67271
  loops: loopRows,
67148
67272
  warnings: [...buildWarnings(driftRows, coverage), ...opts.extraWarnings ?? []]
@@ -67211,7 +67335,15 @@ class HistoryService {
67211
67335
  } finally {
67212
67336
  clearTimeout(timer);
67213
67337
  }
67214
- const status = result.scannedFiles === 0 ? "empty" : "ok";
67338
+ const hasDegradedInput = result.parseErrors.length > 0 || result.validationErrors.length > 0;
67339
+ const status = result.scannedFiles === 0 ? "empty" : hasDegradedInput ? "degraded" : "ok";
67340
+ if (hasDegradedInput) {
67341
+ sourceWarnings.push({
67342
+ code: "source-degraded",
67343
+ source,
67344
+ detail: `source '${source}' imported ${result.importedRecords} records but skipped ` + `${result.parseErrors.length} parse and ${result.validationErrors.length} ` + "validation error(s); samples are bounded in the artifact and streamed to the sidecar"
67345
+ });
67346
+ }
67215
67347
  if (status === "empty" && wasNonEmpty) {
67216
67348
  sourceWarnings.push({
67217
67349
  code: "source-was-nonempty",
@@ -67230,7 +67362,8 @@ class HistoryService {
67230
67362
  parseErrors: result.parseErrors.length,
67231
67363
  validationErrors: result.validationErrors.length,
67232
67364
  parseErrorSamples: result.parseErrors.slice(0, MAX_ERROR_SAMPLES).map(formatIssue),
67233
- validationErrorSamples: result.validationErrors.slice(0, MAX_ERROR_SAMPLES).map(formatIssue)
67365
+ validationErrorSamples: result.validationErrors.slice(0, MAX_ERROR_SAMPLES).map(formatIssue),
67366
+ ...result.reconciliation ? { reconciliation: result.reconciliation } : {}
67234
67367
  };
67235
67368
  return { coverageEntry, sourceWarnings };
67236
67369
  } catch (e) {
@@ -67267,7 +67400,9 @@ function emptyTotals() {
67267
67400
  messages: 0,
67268
67401
  toolCalls: 0,
67269
67402
  durationMs: 0,
67270
- durationUnmeasured: 0
67403
+ durationUnmeasured: 0,
67404
+ assistantDurationMs: 0,
67405
+ assistantDurationUnmeasured: 0
67271
67406
  };
67272
67407
  }
67273
67408
  function foldMessage(bucket, row) {
@@ -67279,6 +67414,8 @@ function foldMessage(bucket, row) {
67279
67414
  bucket.cacheWriteTokens += row.cacheWriteTokens ?? 0;
67280
67415
  bucket.costUsd += row.costUsd ?? 0;
67281
67416
  bucket.recordsWithUsage += row.recordsWithUsage;
67417
+ bucket.assistantDurationMs += row.assistantDurationMs ?? 0;
67418
+ bucket.assistantDurationUnmeasured += row.assistantDurationUnmeasured;
67282
67419
  }
67283
67420
  function foldTool(bucket, row) {
67284
67421
  bucket.toolCalls += row.toolCalls;
@@ -67321,11 +67458,11 @@ function buildCoverage(sourceRows, tRows, driftRows, coverageErrors, importCover
67321
67458
  for (const row of sourceRows)
67322
67459
  sqlBySource.set(row.source, row);
67323
67460
  return importCoverage.map((imp) => {
67324
- if (imp.status === "ok") {
67461
+ if (imp.status === "ok" || imp.status === "degraded") {
67325
67462
  const sql4 = sqlBySource.get(imp.source);
67326
67463
  return {
67327
67464
  source: imp.source,
67328
- status: "ok",
67465
+ status: imp.status,
67329
67466
  files: sql4?.files ?? imp.files,
67330
67467
  messages: sql4?.messages ?? imp.messages,
67331
67468
  toolCalls: toolCounts2[imp.source] ?? 0,
@@ -67334,7 +67471,8 @@ function buildCoverage(sourceRows, tRows, driftRows, coverageErrors, importCover
67334
67471
  parseErrors: imp.parseErrors,
67335
67472
  validationErrors: imp.validationErrors,
67336
67473
  parseErrorSamples: imp.parseErrorSamples,
67337
- validationErrorSamples: imp.validationErrorSamples
67474
+ validationErrorSamples: imp.validationErrorSamples,
67475
+ ...imp.reconciliation ? { reconciliation: imp.reconciliation } : {}
67338
67476
  };
67339
67477
  }
67340
67478
  return imp;
@@ -67348,9 +67486,10 @@ function buildCoverage(sourceRows, tRows, driftRows, coverageErrors, importCover
67348
67486
  unknownCounts[row.source] = (unknownCounts[row.source] ?? 0) + row.n;
67349
67487
  return sourceRows.map((s2) => {
67350
67488
  const err = coverageErrors?.[s2.source] ?? { parseErrors: [], validationErrors: [] };
67489
+ const hasErrors = err.parseErrors.length > 0 || err.validationErrors.length > 0;
67351
67490
  return {
67352
67491
  source: s2.source,
67353
- status: s2.messages > 0 ? "ok" : "empty",
67492
+ status: s2.messages > 0 ? hasErrors ? "degraded" : "ok" : "empty",
67354
67493
  files: s2.files,
67355
67494
  messages: s2.messages,
67356
67495
  toolCalls: toolCounts[s2.source] ?? 0,
@@ -67375,6 +67514,13 @@ function buildWarnings(driftRows, coverage) {
67375
67514
  if (entry.status === "empty") {
67376
67515
  warnings.push({ code: "source-empty", source: entry.source, detail: "0 messages discovered" });
67377
67516
  }
67517
+ if (entry.status === "degraded") {
67518
+ warnings.push({
67519
+ code: "source-degraded",
67520
+ source: entry.source,
67521
+ detail: `${entry.parseErrors} parse and ${entry.validationErrors} validation error(s) \u2014 ` + "source imported with skipped records (task 0504 R2)"
67522
+ });
67523
+ }
67378
67524
  }
67379
67525
  return warnings;
67380
67526
  }
@@ -67477,7 +67623,8 @@ function parseMode(value) {
67477
67623
  }
67478
67624
  function computeExitCode(entries) {
67479
67625
  const failed = entries.filter((e) => e.status === "failed").length;
67480
- if (failed === 0)
67626
+ const degraded = entries.filter((e) => e.status === "degraded").length;
67627
+ if (failed === 0 && degraded === 0)
67481
67628
  return 0;
67482
67629
  if (failed === entries.length)
67483
67630
  return 1;
@@ -67791,7 +67938,8 @@ function applyMutation(doc2, mutation) {
67791
67938
  break;
67792
67939
  case "updateSection":
67793
67940
  if (mutation.sectionName !== undefined && mutation.sectionBody !== undefined) {
67794
- doc2.replaceSection(mutation.sectionName, mutation.sectionBody);
67941
+ const body = mutation.sectionName.toLowerCase() === "acceptance criteria" ? normalizeAcFence(mutation.sectionBody) : mutation.sectionBody;
67942
+ doc2.replaceSection(mutation.sectionName, body);
67795
67943
  }
67796
67944
  break;
67797
67945
  case "updateBody":
@@ -69965,7 +70113,7 @@ function renderCreatedTaskContent(params) {
69965
70113
  sectionPatches.Plan = (params.plan ?? "").trim();
69966
70114
  }
69967
70115
  if ((params.acceptanceCriteria ?? "").trim() !== "") {
69968
- sectionPatches["Acceptance Criteria"] = (params.acceptanceCriteria ?? "").trim();
70116
+ sectionPatches["Acceptance Criteria"] = normalizeAcFence((params.acceptanceCriteria ?? "").trim());
69969
70117
  }
69970
70118
  if (Object.keys(sectionPatches).length > 0) {
69971
70119
  const doc2 = MarkdownDocument.parse(content, "task");
@@ -70053,7 +70201,7 @@ class TaskService {
70053
70201
  return { ...templateBodies, ...taskBodies };
70054
70202
  }
70055
70203
  async findDuplicateFollowUp(featureId2, title, withinSec) {
70056
- const siblings = await this.list({ featureId: featureId2 });
70204
+ const siblings = featureId2 !== undefined ? await this.list({ featureId: featureId2 }) : (await this.list()).filter((t) => (t.frontmatter?.feature_id ?? undefined) === undefined);
70057
70205
  const now2 = Date.now();
70058
70206
  const lowerTitle = title.toLowerCase();
70059
70207
  for (const t of siblings) {
@@ -70082,7 +70230,7 @@ class TaskService {
70082
70230
  const status = params.status ?? (params.featureId !== undefined ? "todo" : "backlog");
70083
70231
  return this.writeService.createAllocated(folder, async () => {
70084
70232
  const dedupeWithinSec = params.dedupeWithinSec === null ? undefined : params.dedupeWithinSec ?? 300;
70085
- if (dedupeWithinSec !== undefined && params.featureId !== undefined) {
70233
+ if (dedupeWithinSec !== undefined) {
70086
70234
  const collision = await this.findDuplicateFollowUp(params.featureId, params.title, dedupeWithinSec);
70087
70235
  if (collision !== null) {
70088
70236
  throw new DuplicateFollowUpError(collision.wbs, collision.name, params.title);
@@ -70372,6 +70520,9 @@ class TaskService {
70372
70520
  const filePath = await this.resolveTaskFile(wbs);
70373
70521
  const raw = await this.ctx.fs.readFile(sourceFile);
70374
70522
  const body = stripLeadingSectionHeader2(raw, sectionName);
70523
+ if (sectionName === "Solution" && !hasSolutionFileLineCitation(body)) {
70524
+ throw new SectionMutationError("invalid-solution", "Solution must contain at least one `file:line` citation");
70525
+ }
70375
70526
  const ref = { kind: "task", id: wbs, filePath, folder: this.ctx.tasksDir };
70376
70527
  const result = await this.writeService.updateSection(ref, sectionName, body);
70377
70528
  if (sectionName === "Acceptance Criteria") {
@@ -70633,7 +70784,7 @@ ${issues}`);
70633
70784
  taskBodies.Plan = (item.plan ?? "").trim();
70634
70785
  }
70635
70786
  if ((item.acceptance_criteria ?? "").trim() !== "") {
70636
- taskBodies["Acceptance Criteria"] = (item.acceptance_criteria ?? "").trim();
70787
+ taskBodies["Acceptance Criteria"] = normalizeAcFence((item.acceptance_criteria ?? "").trim());
70637
70788
  }
70638
70789
  const content = buildTaskSkeleton({
70639
70790
  wbs,
@@ -70835,6 +70986,7 @@ var init_task_service = __esm(() => {
70835
70986
  init_src2();
70836
70987
  init_errors5();
70837
70988
  init_pipeline_run_link();
70989
+ init_task_check();
70838
70990
  init_task_locator();
70839
70991
  init_task_record();
70840
70992
  DependencyMutationError = class DependencyMutationError extends Error {
@@ -71153,7 +71305,7 @@ var init_task_verdict = __esm(() => {
71153
71305
  });
71154
71306
 
71155
71307
  // ../../packages/app/src/services/team-service.ts
71156
- import { join as join16 } from "path";
71308
+ import { join as join16, resolve as resolve6 } from "path";
71157
71309
 
71158
71310
  class TeamService {
71159
71311
  ctx;
@@ -71361,13 +71513,18 @@ class TeamService {
71361
71513
  const specs = await loadAgentSpecs(this.configDir);
71362
71514
  const config4 = await this.loadTeamConfig();
71363
71515
  const teams = new Map;
71516
+ const configTeamIds = new Set;
71364
71517
  if (config4?.agent?.team) {
71365
71518
  for (const [teamId, teamConfig] of Object.entries(config4.agent.team)) {
71519
+ configTeamIds.add(teamId);
71520
+ const workDir = this.resolveWorkspaceDir(teamConfig.work_dir);
71366
71521
  teams.set(teamId, {
71367
71522
  teamId,
71368
71523
  name: teamConfig.name,
71369
71524
  members: [],
71370
- specs: []
71525
+ specs: [],
71526
+ workDir,
71527
+ isCurrentProject: this.isCurrentProject(workDir)
71371
71528
  });
71372
71529
  }
71373
71530
  }
@@ -71384,7 +71541,9 @@ class TeamService {
71384
71541
  teamId,
71385
71542
  name: teamId,
71386
71543
  members: [],
71387
- specs: [spec]
71544
+ specs: [spec],
71545
+ workDir: null,
71546
+ isCurrentProject: false
71388
71547
  });
71389
71548
  }
71390
71549
  } else {
@@ -71396,9 +71555,18 @@ class TeamService {
71396
71555
  teamId: "__untethered__",
71397
71556
  name: "Untethered",
71398
71557
  members: [],
71399
- specs: untethered
71558
+ specs: untethered,
71559
+ workDir: null,
71560
+ isCurrentProject: false
71400
71561
  });
71401
71562
  }
71563
+ for (const team of Array.from(teams.values())) {
71564
+ if (configTeamIds.has(team.teamId))
71565
+ continue;
71566
+ const common4 = this.commonWorkspace(team.specs);
71567
+ team.workDir = common4.workDir;
71568
+ team.isCurrentProject = common4.isCurrentProject;
71569
+ }
71402
71570
  return Array.from(teams.values());
71403
71571
  }
71404
71572
  async materializeTeam(teamId, opts) {
@@ -71487,6 +71655,23 @@ class TeamService {
71487
71655
  });
71488
71656
  return result;
71489
71657
  }
71658
+ resolveWorkspaceDir(p) {
71659
+ return resolve6(this.ctx.cwd, p);
71660
+ }
71661
+ isCurrentProject(workDir) {
71662
+ return resolve6(this.ctx.cwd, workDir) === resolve6(this.ctx.cwd, this.ctx.cwd);
71663
+ }
71664
+ commonWorkspace(specs) {
71665
+ if (specs.length === 0)
71666
+ return { workDir: null, isCurrentProject: false };
71667
+ const first = specs[0]?.workspace;
71668
+ if (typeof first !== "string" || first.length === 0)
71669
+ return { workDir: null, isCurrentProject: false };
71670
+ if (!specs.every((s2) => s2.workspace === first))
71671
+ return { workDir: null, isCurrentProject: false };
71672
+ const workDir = this.resolveWorkspaceDir(first);
71673
+ return { workDir, isCurrentProject: this.isCurrentProject(workDir) };
71674
+ }
71490
71675
  async loadTeamConfig() {
71491
71676
  try {
71492
71677
  return await loadSpurConfig(this.ctx.cwd);
@@ -71924,16 +72109,16 @@ class WorkflowSteeringController {
71924
72109
  active.state = "boundary";
71925
72110
  active.version += 1;
71926
72111
  this.publishState(active);
71927
- return await new Promise((resolve6) => {
72112
+ return await new Promise((resolve7) => {
71928
72113
  const settle = (decision) => {
71929
72114
  clearTimeout(timer);
71930
- resolve6(decision);
72115
+ resolve7(decision);
71931
72116
  };
71932
72117
  const timer = setTimeout(() => {
71933
72118
  if (active.resolve !== settle)
71934
72119
  return;
71935
72120
  active.resolve = undefined;
71936
- this.acceptDefault(active, resolve6);
72121
+ this.acceptDefault(active, resolve7);
71937
72122
  }, active.policy.timeoutMs);
71938
72123
  timer.unref?.();
71939
72124
  active.resolve = settle;
@@ -72031,7 +72216,7 @@ class WorkflowSteeringController {
72031
72216
  deadlineAt: new Date(Date.now() + deadlineMs).toISOString()
72032
72217
  });
72033
72218
  }
72034
- acceptDefault(active, resolve6) {
72219
+ acceptDefault(active, resolve7) {
72035
72220
  const command = {
72036
72221
  commandId: crypto.randomUUID(),
72037
72222
  runId: active.runId,
@@ -72056,7 +72241,7 @@ class WorkflowSteeringController {
72056
72241
  at: new Date().toISOString()
72057
72242
  };
72058
72243
  this.onAck?.(ack);
72059
- resolve6({ operation: "continue" });
72244
+ resolve7({ operation: "continue" });
72060
72245
  }
72061
72246
  accept(command, active, note) {
72062
72247
  return this.publish({
@@ -73429,7 +73614,7 @@ var init_builtins2 = __esm(() => {
73429
73614
 
73430
73615
  // ../../packages/app/src/services/workflow-service.ts
73431
73616
  import { homedir as homedir5 } from "os";
73432
- import { join as join19, resolve as resolve6 } from "path";
73617
+ import { join as join19, resolve as resolve7 } from "path";
73433
73618
  function signalSubprocess(pid) {
73434
73619
  if (!Number.isInteger(pid) || pid <= 1)
73435
73620
  return false;
@@ -73499,7 +73684,7 @@ class WorkflowAppService {
73499
73684
  };
73500
73685
  }
73501
73686
  async validate(file2, opts = {}) {
73502
- const absolute = resolve6(this.ctx.cwd, file2);
73687
+ const absolute = resolve7(this.ctx.cwd, file2);
73503
73688
  if (!await fileExists(absolute)) {
73504
73689
  return { ok: false, valid: false, file: file2, errors: [`File not found: ${absolute}`] };
73505
73690
  }
@@ -73558,7 +73743,7 @@ class WorkflowAppService {
73558
73743
  ...opts.vars ?? {},
73559
73744
  __runId: runId
73560
73745
  };
73561
- const absolute = resolve6(this.ctx.cwd, file2);
73746
+ const absolute = resolve7(this.ctx.cwd, file2);
73562
73747
  const embedded = this.embeddedSchemaOptions();
73563
73748
  const workflow = await loadWorkflowDef(absolute, {
73564
73749
  validateSchema: true,
@@ -73594,7 +73779,7 @@ class WorkflowAppService {
73594
73779
  return;
73595
73780
  let workflowName;
73596
73781
  try {
73597
- const def = await loadWorkflowDef(resolve6(this.ctx.cwd, file2), { validateSchema: false });
73782
+ const def = await loadWorkflowDef(resolve7(this.ctx.cwd, file2), { validateSchema: false });
73598
73783
  workflowName = def.name;
73599
73784
  } catch {
73600
73785
  return;
@@ -73719,7 +73904,7 @@ class WorkflowAppService {
73719
73904
  if (entry === undefined)
73720
73905
  return null;
73721
73906
  for (const layer of listing.layers) {
73722
- const abs = resolve6(layer.path, entry.path);
73907
+ const abs = resolve7(layer.path, entry.path);
73723
73908
  if (await fileExists(abs)) {
73724
73909
  try {
73725
73910
  return await loadWorkflowDef(abs, { validateSchema: false });
@@ -73735,7 +73920,7 @@ class WorkflowAppService {
73735
73920
  const entries = [];
73736
73921
  const scannedPaths = new Set;
73737
73922
  for (const relPath of workflowPaths) {
73738
- const absPath = resolve6(projectRoot, relPath);
73923
+ const absPath = resolve7(projectRoot, relPath);
73739
73924
  layers.push({ id: "project", path: absPath });
73740
73925
  scannedPaths.add(absPath);
73741
73926
  try {
@@ -73744,7 +73929,7 @@ class WorkflowAppService {
73744
73929
  } catch {}
73745
73930
  }
73746
73931
  for (const relPath of workflowPaths) {
73747
- const absPath = resolve6(globalRoot, relPath);
73932
+ const absPath = resolve7(globalRoot, relPath);
73748
73933
  if (scannedPaths.has(absPath))
73749
73934
  continue;
73750
73935
  layers.push({ id: "global", path: absPath });
@@ -74000,7 +74185,7 @@ async function scanWorkflowFiles(rootPath, source) {
74000
74185
  async function walk3(dirPath) {
74001
74186
  const names = await fs3.readDir(dirPath);
74002
74187
  for (const name of names) {
74003
- const fullPath = resolve6(dirPath, name);
74188
+ const fullPath = resolve7(dirPath, name);
74004
74189
  const st = await fs3.stat(fullPath);
74005
74190
  if (!st)
74006
74191
  continue;
@@ -74533,19 +74718,19 @@ var {
74533
74718
  init_src();
74534
74719
  init_loader();
74535
74720
 
74536
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/application-node.js
74721
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/application-node.js
74537
74722
  init_dist4();
74538
74723
  init_dist5();
74539
74724
  import { appendFileSync as appendFileSync4, mkdirSync as mkdirSync3, readFileSync as readFileSync5 } from "fs";
74540
74725
  import { dirname as dirname5 } from "path";
74541
74726
 
74542
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/application/index.js
74727
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/application/index.js
74543
74728
  init_default_observers();
74544
74729
  init_event_bus();
74545
74730
  init_file_observer();
74546
74731
  init_logger3();
74547
74732
 
74548
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/scheduler/noop.js
74733
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/scheduler/noop.js
74549
74734
  class NoopSchedulerAdapter {
74550
74735
  constructor() {}
74551
74736
  register(_cron, _action) {}
@@ -74553,7 +74738,7 @@ class NoopSchedulerAdapter {
74553
74738
  async stop() {}
74554
74739
  }
74555
74740
 
74556
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/scheduler/factory.js
74741
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/scheduler/factory.js
74557
74742
  function initScheduler(adapter, cronEntries) {
74558
74743
  const resolved = adapter ?? new NoopSchedulerAdapter;
74559
74744
  if (cronEntries) {
@@ -74564,7 +74749,7 @@ function initScheduler(adapter, cronEntries) {
74564
74749
  return resolved;
74565
74750
  }
74566
74751
 
74567
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/application/plugins/builtins.js
74752
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/application/plugins/builtins.js
74568
74753
  init_logger3();
74569
74754
  init_metrics();
74570
74755
  init_sdk();
@@ -74657,7 +74842,7 @@ function dbPlugin(db2) {
74657
74842
  };
74658
74843
  }
74659
74844
 
74660
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/application/plugins/host.js
74845
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/application/plugins/host.js
74661
74846
  init_logger3();
74662
74847
 
74663
74848
  class PluginHost {
@@ -74745,7 +74930,7 @@ class PluginHost {
74745
74930
  }
74746
74931
  }
74747
74932
 
74748
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/application/index.js
74933
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/application/index.js
74749
74934
  async function performShutdown(state, reason) {
74750
74935
  if (state.stopped)
74751
74936
  return;
@@ -74856,10 +75041,10 @@ async function runApplication(options) {
74856
75041
  }
74857
75042
  }
74858
75043
 
74859
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/application-node.js
75044
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/application-node.js
74860
75045
  init_scheduler_node();
74861
75046
 
74862
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/telemetry/otel-node.js
75047
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/telemetry/otel-node.js
74863
75048
  var import_api14 = __toESM(require_src(), 1);
74864
75049
 
74865
75050
  // ../../node_modules/.bun/@opentelemetry+exporter-metrics-otlp-http@0.218.0+e40b0dfdd726a224/node_modules/@opentelemetry/exporter-metrics-otlp-http/build/esm/OTLPMetricExporterBase.js
@@ -77875,7 +78060,7 @@ class OTLPTraceExporter extends import_otlp_exporter_base2.OTLPExporterBase {
77875
78060
  }), JsonTraceSerializer));
77876
78061
  }
77877
78062
  }
77878
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/telemetry/otel-node.js
78063
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/telemetry/otel-node.js
77879
78064
  var import_resources2 = __toESM(require_src4(), 1);
77880
78065
  var import_sdk_trace_node = __toESM(require_src8(), 1);
77881
78066
  var import_semantic_conventions = __toESM(require_src2(), 1);
@@ -77926,7 +78111,7 @@ async function shutdownNodeTelemetry() {
77926
78111
  await Promise.all(pending);
77927
78112
  }
77928
78113
 
77929
- // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.24+f96ea141b2a06f45/node_modules/@gobing-ai/ts-infra/dist/application-node.js
78114
+ // ../../node_modules/.bun/@gobing-ai+ts-infra@0.4.27+2c3cbd358f360a0e/node_modules/@gobing-ai/ts-infra/dist/application-node.js
77930
78115
  class ConfigValidationError extends Error {
77931
78116
  constructor(message) {
77932
78117
  super(message);
@@ -82006,15 +82191,15 @@ function parseLoopPoll(raw) {
82006
82191
  return Number.isFinite(n2) && n2 > 0 ? n2 : DEFAULT_LOOP_POLL_MS;
82007
82192
  }
82008
82193
  function loopSleep(ms, signal) {
82009
- return new Promise((resolve7) => {
82194
+ return new Promise((resolve8) => {
82010
82195
  if (signal?.aborted) {
82011
- resolve7();
82196
+ resolve8();
82012
82197
  return;
82013
82198
  }
82014
- const timer = setTimeout(resolve7, ms);
82199
+ const timer = setTimeout(resolve8, ms);
82015
82200
  signal?.addEventListener("abort", () => {
82016
82201
  clearTimeout(timer);
82017
- resolve7();
82202
+ resolve8();
82018
82203
  }, { once: true });
82019
82204
  });
82020
82205
  }
@@ -82074,7 +82259,7 @@ init_loader();
82074
82259
  init_src2();
82075
82260
  import { existsSync as existsSync10 } from "fs";
82076
82261
  import { homedir as homedir6 } from "os";
82077
- import { join as join21, resolve as resolve7 } from "path";
82262
+ import { join as join21, resolve as resolve8 } from "path";
82078
82263
 
82079
82264
  // src/workflow/resolve-spur-bin.ts
82080
82265
  import { basename as basename4 } from "path";
@@ -82095,7 +82280,7 @@ function resolveSpurBin() {
82095
82280
  var GLOBAL_CONFIG_DIR = join21(".config", "spur");
82096
82281
  function globalConfigRoot(context4) {
82097
82282
  const override = context4.env.SPUR_GLOBAL_RULES_DIR;
82098
- return override !== undefined && override.length > 0 ? resolve7(context4.cwd, override) : join21(homedir6(), GLOBAL_CONFIG_DIR);
82283
+ return override !== undefined && override.length > 0 ? resolve8(context4.cwd, override) : join21(homedir6(), GLOBAL_CONFIG_DIR);
82099
82284
  }
82100
82285
  function resolveWorkflowPath(context4, profile) {
82101
82286
  const bundledRoot = bundledConfigRoot();
@@ -82494,22 +82679,39 @@ async function assertFeatureCheckPass(context4, id, folderOverride, strict, asSt
82494
82679
  init_src3();
82495
82680
  init_src2();
82496
82681
  init_dist6();
82682
+ import { createRequire } from "module";
82497
82683
 
82498
82684
  // src/config.ts
82499
82685
  var CLI_CONFIG = {
82500
82686
  binaryName: "spur",
82501
82687
  binaryLabel: "spur",
82502
- binaryVersion: "0.3.42",
82688
+ binaryVersion: "0.3.44",
82503
82689
  configDir: ".spur",
82504
82690
  configFile: ".spur/config.yaml",
82505
82691
  databaseFile: ".spur/spur.db"
82506
82692
  };
82507
82693
 
82508
82694
  // src/commands/history.ts
82695
+ async function resolveImportProvenance(fs3) {
82696
+ const binary = process.argv[1] ?? "unknown";
82697
+ let importer = "unknown";
82698
+ try {
82699
+ const require2 = createRequire(import.meta.url);
82700
+ const packagePath = require2.resolve("@gobing-ai/ts-llm-jsonl-importer/package.json");
82701
+ const raw = JSON.parse(await fs3.readFile(packagePath));
82702
+ const version3 = raw !== null && typeof raw === "object" && "version" in raw ? raw.version : undefined;
82703
+ if (typeof version3 === "string" && version3.length > 0)
82704
+ importer = version3;
82705
+ } catch {}
82706
+ return { binary, importer };
82707
+ }
82708
+ function formatProvenance(provenance) {
82709
+ return `binary: ${provenance.binary}
82710
+ importer: @gobing-ai/ts-llm-jsonl-importer@${provenance.importer}`;
82711
+ }
82509
82712
  function registerHistoryCommand(program2, context4) {
82510
82713
  const noun = program2.command("history").summary("import and analyze coding-agent history");
82511
82714
  noun.command("import").description("Import agent conversation JSONL. `--source all` fans out across all sources with " + "per-source failure isolation (task 0470). A single source is the n=1 case of " + "the same contract \u2014 never two import paths.").option("--source <source>", "pi|claude|codex|gemini|opencode|antigravity|openclaw|omp|grok|agy|all", "all").option("--file <path>", "Import one JSONL file (single-source only)").option("--root <path>", "Scan a history root").option("--mode <mode>", "full|incremental|force-file").option("--dry-run", "Scan without persisting imported records").option("--source-timeout <ms>", "Per-source timeout in milliseconds (default 600000 = 10 min)", "600000").option("--json", "Output machine-readable JSON where supported").action(async (options) => {
82512
- const svc = new HistoryService({ getDb: () => context4.getDb() });
82513
82715
  const source = options.source ?? "all";
82514
82716
  if (options.file && source === "all") {
82515
82717
  context4.output.write(options.json ? toJson2({ status: "error", message: '--file requires a single --source, not "all".' }) : 'spur history import: --file requires a single --source, not "all".');
@@ -82528,6 +82730,13 @@ function registerHistoryCommand(program2, context4) {
82528
82730
  context4.setExitCode(1);
82529
82731
  return;
82530
82732
  }
82733
+ if (options.file && mode === "full" && options.dryRun !== true) {
82734
+ const unsafeMsg = "spur history import: --file <path> --mode full without --dry-run is unsafe \u2014 full mode " + "treats the file as the authoritative source for reconciliation. Preview with --dry-run, " + "or import a single file with --mode force-file.";
82735
+ context4.output.write(options.json ? toJson2({ status: "error", message: unsafeMsg }) : unsafeMsg);
82736
+ context4.setExitCode(1);
82737
+ return;
82738
+ }
82739
+ const svc = new HistoryService({ getDb: () => context4.getDb() });
82531
82740
  const fanOut = await svc.importAll({
82532
82741
  sources: source === "all" ? undefined : [source],
82533
82742
  file: options.file || undefined,
@@ -82536,7 +82745,9 @@ function registerHistoryCommand(program2, context4) {
82536
82745
  dryRun: options.dryRun === true,
82537
82746
  sourceTimeout
82538
82747
  });
82539
- context4.output.write(options.json ? toJson2(fanOut) : formatFanOutResult(fanOut));
82748
+ const provenance = await resolveImportProvenance(context4.fs);
82749
+ context4.output.write(options.json ? toJson2({ ...fanOut, provenance }) : `${formatProvenance(provenance)}
82750
+ ${formatFanOutResult(fanOut)}`);
82540
82751
  context4.setExitCode(fanOut.exitCode);
82541
82752
  });
82542
82753
  noun.command("analyze").description("Aggregate imported history with SQL and write a versioned JSON artifact (Q1-Q10 forensic query set).").option("--since <iso>", "Inclusive lower bound on message timestamp").option("--until <iso>", "Inclusive upper bound on message timestamp").option("--source <source>", "pi|claude|codex|gemini|opencode|antigravity|openclaw|omp|grok|agy|all", "all").option("--session <id>", "Narrow to a single session id").option("--run <runId>", "Narrow to a single workflow run id").option("--task <wbs>", "Narrow to a single task WBS").option("--top <n>", "Leaderboard depth for byTool/bySession", "20").option("--out <path>", "Write the artifact to this path instead of the dated reports dir").option("--json", "Emit the artifact as JSON instead of the human summary").action(async (options) => {
@@ -82656,6 +82867,8 @@ function registerHistoryCommand(program2, context4) {
82656
82867
  });
82657
82868
  } else {
82658
82869
  const failing = entries.filter((e) => e.status === "failed");
82870
+ const degraded = entries.filter((e) => e.status === "degraded");
82871
+ const problems = [...failing, ...degraded];
82659
82872
  await bus.emit("history.daily.failed", {
82660
82873
  source: "history",
82661
82874
  renderer: "history-daily",
@@ -82663,7 +82876,7 @@ function registerHistoryCommand(program2, context4) {
82663
82876
  sources,
82664
82877
  okSources,
82665
82878
  failedSources,
82666
- detail: failing.length > 0 ? failing.map((e) => `${e.source}: ${e.parseErrors + e.validationErrors} errors`).join("; ") : "daily fan-out reported non-zero exit with no failing source",
82879
+ detail: problems.length > 0 ? problems.map((e) => `${e.source}: ${e.status} (${e.parseErrors + e.validationErrors} ` + "parse/validation errors)").join("; ") : "daily fan-out reported non-zero exit with no failing or degraded source",
82667
82880
  durationMs,
82668
82881
  artifactPath
82669
82882
  });
@@ -82724,7 +82937,7 @@ init_loader();
82724
82937
  init_src2();
82725
82938
  init_dist10();
82726
82939
  import { homedir as homedir7 } from "os";
82727
- import { join as join22, resolve as resolve8 } from "path";
82940
+ import { join as join22, resolve as resolve9 } from "path";
82728
82941
 
82729
82942
  // src/config/scaffold-manifest.ts
82730
82943
  var SCAFFOLD_MANIFEST = [
@@ -82803,7 +83016,7 @@ If \`.spur/context/\` is absent, proceed normally. Never block work on its absen
82803
83016
  `;
82804
83017
  function globalRulesRoot(context4) {
82805
83018
  const override = context4.env.SPUR_GLOBAL_RULES_DIR;
82806
- return override !== undefined && override.length > 0 ? resolve8(context4.cwd, override) : join22(homedir7(), GLOBAL_RULES_DIR2);
83019
+ return override !== undefined && override.length > 0 ? resolve9(context4.cwd, override) : join22(homedir7(), GLOBAL_RULES_DIR2);
82807
83020
  }
82808
83021
  async function writeIfNew(context4, path9, content, force, result) {
82809
83022
  if (!force && await context4.fs.exists(path9)) {
@@ -82834,7 +83047,7 @@ async function seedGlobalConfig(context4) {
82834
83047
  if (source === null)
82835
83048
  return 0;
82836
83049
  const globalOverride = context4.env.SPUR_GLOBAL_RULES_DIR;
82837
- const target = globalOverride !== undefined && globalOverride.length > 0 ? resolve8(context4.cwd, globalOverride) : join22(homedir7(), GLOBAL_CONFIG_DIR2);
83050
+ const target = globalOverride !== undefined && globalOverride.length > 0 ? resolve9(context4.cwd, globalOverride) : join22(homedir7(), GLOBAL_CONFIG_DIR2);
82838
83051
  let written = 0;
82839
83052
  for (const relPath of listBundledConfigFiles()) {
82840
83053
  if (relPath === GLOBAL_CONFIG_EXAMPLE)
@@ -83107,15 +83320,15 @@ async function runMessageWatch(svc, output2, options, runtime = {}) {
83107
83320
  }
83108
83321
  }
83109
83322
  function defaultSleep(ms, signal) {
83110
- return new Promise((resolve9) => {
83323
+ return new Promise((resolve10) => {
83111
83324
  if (signal?.aborted) {
83112
- resolve9();
83325
+ resolve10();
83113
83326
  return;
83114
83327
  }
83115
- const timer = setTimeout(resolve9, ms);
83328
+ const timer = setTimeout(resolve10, ms);
83116
83329
  signal?.addEventListener("abort", () => {
83117
83330
  clearTimeout(timer);
83118
- resolve9();
83331
+ resolve10();
83119
83332
  }, { once: true });
83120
83333
  });
83121
83334
  }
@@ -83143,12 +83356,12 @@ function registerMigrateCommand(program2, context4) {
83143
83356
  // src/commands/projects.ts
83144
83357
  init_src3();
83145
83358
  init_dist5();
83146
- import { basename as basename5, resolve as resolve9 } from "path";
83359
+ import { basename as basename5, resolve as resolve10 } from "path";
83147
83360
  function registerProjectsCommand(program2, context4) {
83148
83361
  const projectsCmd = program2.command("projects").summary("manage the Spur multi-project registry");
83149
83362
  projectsCmd.command("add").argument("<path>", "Project root directory path").option("--name <name>", "Display name for the project").option("--json", "Output JSON response").action(async (pathArg, options) => {
83150
83363
  try {
83151
- const absolutePath = resolve9(context4.cwd, pathArg);
83364
+ const absolutePath = resolve10(context4.cwd, pathArg);
83152
83365
  if (!await context4.fs.exists(absolutePath)) {
83153
83366
  throw new Error(`Directory does not exist: ${absolutePath}`);
83154
83367
  }
@@ -83834,8 +84047,8 @@ class EventPublisher {
83834
84047
  if (bufferedEvents.length > 0) {
83835
84048
  return { done: false, value: bufferedEvents.shift() };
83836
84049
  }
83837
- return new Promise((resolve10, reject) => {
83838
- pullResolvers.push([resolve10, reject]);
84050
+ return new Promise((resolve11, reject) => {
84051
+ pullResolvers.push([resolve11, reject]);
83839
84052
  });
83840
84053
  }, async () => {
83841
84054
  unsubscribe();
@@ -90360,6 +90573,8 @@ var teamModule = {
90360
90573
  const enriched = teams.map((team) => ({
90361
90574
  teamId: team.teamId,
90362
90575
  name: team.name,
90576
+ workDir: team.workDir,
90577
+ isCurrentProject: team.isCurrentProject,
90363
90578
  members: team.specs.map((spec) => {
90364
90579
  const proc = processes.find((p2) => p2.agentId === spec.id);
90365
90580
  const configModel = spec.config?.model;
@@ -93846,7 +94061,7 @@ function registerTaskCommand(program2, context4) {
93846
94061
  dedupeWithinSec: options.allowDuplicateName ? null : options.dedupeWithin
93847
94062
  });
93848
94063
  if (options.json) {
93849
- context4.output.write(toJson2(result));
94064
+ context4.output.write(toJson2({ ...result, wbs: result.ref.id, filePath: result.ref.filePath }));
93850
94065
  } else {
93851
94066
  context4.output.write(`Created task ${result.ref.id}: ${result.ref.filePath}`);
93852
94067
  }
@@ -94026,8 +94241,13 @@ ${result.content}`);
94026
94241
  context4.setExitCode(2);
94027
94242
  }
94028
94243
  } catch (err) {
94029
- context4.output.error(String(err));
94030
- context4.setExitCode(1);
94244
+ if (err instanceof SectionMutationError) {
94245
+ context4.output.error(`[${err.code}] ${err.message}`);
94246
+ context4.setExitCode(err.code === "usage" ? 2 : 3);
94247
+ } else {
94248
+ context4.output.error(String(err));
94249
+ context4.setExitCode(1);
94250
+ }
94031
94251
  }
94032
94252
  });
94033
94253
  task.command("deps").summary("Mutate the dependencies[] frontmatter array on a task.").description("Mutate the `dependencies[]` array on an existing task. Operations:\n" + ` set <wbs...> \u2014 replace the array with the given WBS values
@@ -94390,32 +94610,51 @@ ${result.content}`);
94390
94610
  const svc = await makeCheckService(context4);
94391
94611
  const planningFolders = await resolvePlanningFolders(context4.fs);
94392
94612
  const activeFolder = planningFolders.foldersConfig.active_folder;
94393
- const tasksDir = options.folder ?? context4.fs.resolve(activeFolder);
94394
- const entries = await context4.fs.readDir(tasksDir);
94395
- const wbsPattern = wbs ? [wbs] : entries.filter((n2) => /^\d{4}_.+\.md$/.test(n2)).map((n2) => n2.match(/^(\d{4})_/)?.[1]).filter((n2) => n2 !== undefined);
94613
+ const tasksDir = context4.fs.resolve(options.folder ?? activeFolder);
94614
+ const printResult = (result) => {
94615
+ if (json3)
94616
+ return;
94617
+ context4.output.write(`
94618
+ ${result.wbs} (${result.status}): ${result.pass ? "PASS" : "FAIL"}`);
94619
+ for (const f of result.findings) {
94620
+ const tag = f.severity === "error" ? "ERR" : "WARN";
94621
+ context4.output.write(` [${tag}] ${f.layer} ${f.section}: ${f.message}`);
94622
+ }
94623
+ if (result.missingSections.length > 0) {
94624
+ context4.output.write(` Missing: ${result.missingSections.join(", ")}`);
94625
+ }
94626
+ };
94396
94627
  const results = [];
94397
- for (const w of wbsPattern) {
94398
- const fileName = entries.find((n2) => n2.startsWith(`${w}_`) && n2.endsWith(".md"));
94399
- if (!fileName) {
94400
- context4.output.error(`Task ${w} not found`);
94628
+ if (wbs) {
94629
+ const locator = options.folder !== undefined ? TaskLocator.forSingleDir(context4.fs, tasksDir) : await makeTaskLocator(context4);
94630
+ const hit = await locator.findByWbs(wbs);
94631
+ if (hit === null) {
94632
+ context4.output.error(`Task ${wbs} not found`);
94401
94633
  context4.setExitCode(1);
94402
- continue;
94634
+ } else {
94635
+ const result = await svc.check(hit.filePath, wbs, {
94636
+ strict,
94637
+ severityOverrides: planningFolders.severityOverrides
94638
+ });
94639
+ results.push(result);
94640
+ printResult(result);
94403
94641
  }
94404
- const result = await svc.check(`${tasksDir}/${fileName}`, w, {
94405
- strict,
94406
- severityOverrides: planningFolders.severityOverrides
94407
- });
94408
- results.push(result);
94409
- if (!json3) {
94410
- context4.output.write(`
94411
- ${result.wbs} (${result.status}): ${result.pass ? "PASS" : "FAIL"}`);
94412
- for (const f of result.findings) {
94413
- const tag = f.severity === "error" ? "ERR" : "WARN";
94414
- context4.output.write(` [${tag}] ${f.layer} ${f.section}: ${f.message}`);
94415
- }
94416
- if (result.missingSections.length > 0) {
94417
- context4.output.write(` Missing: ${result.missingSections.join(", ")}`);
94642
+ } else {
94643
+ const entries = await context4.fs.readDir(tasksDir);
94644
+ const wbsPattern = entries.filter((n2) => /^\d{4}_.+\.md$/.test(n2)).map((n2) => n2.match(/^(\d{4})_/)?.[1]).filter((n2) => n2 !== undefined);
94645
+ for (const w of wbsPattern) {
94646
+ const fileName = entries.find((n2) => n2.startsWith(`${w}_`) && n2.endsWith(".md"));
94647
+ if (!fileName) {
94648
+ context4.output.error(`Task ${w} not found`);
94649
+ context4.setExitCode(1);
94650
+ continue;
94418
94651
  }
94652
+ const result = await svc.check(`${tasksDir}/${fileName}`, w, {
94653
+ strict,
94654
+ severityOverrides: planningFolders.severityOverrides
94655
+ });
94656
+ results.push(result);
94657
+ printResult(result);
94419
94658
  }
94420
94659
  }
94421
94660
  if (!wbs) {
@@ -94538,7 +94777,7 @@ ${result.wbs} (${result.status}): ${result.pass ? "PASS" : "FAIL"}`);
94538
94777
  }
94539
94778
  async function makeService2(context4, folderOverride, noLifecycle = false) {
94540
94779
  const foldersConfig = (await resolvePlanningFolders(context4.fs)).foldersConfig;
94541
- const tasksDir = folderOverride ?? context4.fs.resolve(foldersConfig.active_folder);
94780
+ const tasksDir = context4.fs.resolve(folderOverride ?? foldersConfig.active_folder);
94542
94781
  const lifecycle = noLifecycle ? undefined : makeLifecycleAdapter(context4, TASK_LIFECYCLE_PROFILE);
94543
94782
  const writeService = new PlanningWriteService({
94544
94783
  fs: context4.fs,
@@ -94931,7 +95170,7 @@ init_dist7();
94931
95170
  init_dist6();
94932
95171
  init_dist5();
94933
95172
  import { closeSync as closeSync5, fstatSync as fstatSync3, openSync as openSync5, readSync as readSync3 } from "fs";
94934
- import { join as join30, resolve as resolve10 } from "path";
95173
+ import { join as join30, resolve as resolve11 } from "path";
94935
95174
  import { createInterface } from "readline";
94936
95175
  import { setTimeout as sleep3 } from "timers/promises";
94937
95176
  function shQuote2(value2) {
@@ -95130,7 +95369,7 @@ Monitor with: spur workflow trace ${runId2} --follow`);
95130
95369
  let planPreview;
95131
95370
  if (options.plan !== false) {
95132
95371
  try {
95133
- const def = await loadWorkflowDef(resolve10(context4.cwd, file2), { validateSchema: false });
95372
+ const def = await loadWorkflowDef(resolve11(context4.cwd, file2), { validateSchema: false });
95134
95373
  planPreview = renderRunPlan(def);
95135
95374
  } catch {}
95136
95375
  }
@@ -95594,7 +95833,7 @@ init_src3();
95594
95833
  init_src();
95595
95834
  init_src2();
95596
95835
  init_dist5();
95597
- import { dirname as dirname19, join as join31, resolve as resolve11 } from "path";
95836
+ import { dirname as dirname19, join as join31, resolve as resolve12 } from "path";
95598
95837
  import { isatty as isatty4 } from "tty";
95599
95838
 
95600
95839
  // ../../node_modules/.bun/@clack+core@1.4.1/node_modules/@clack/core/dist/index.mjs
@@ -96977,7 +97216,7 @@ class DefaultHitlResponder {
96977
97216
 
96978
97217
  // src/context.ts
96979
97218
  function createCliContext(options) {
96980
- const cwd = resolve11(options.cwd ?? process.cwd());
97219
+ const cwd = resolve12(options.cwd ?? process.cwd());
96981
97220
  const env = options.env ?? process.env;
96982
97221
  const fs3 = createNodeFileSystem3(cwd);
96983
97222
  let dbPromise;