@hasna/todos 0.11.75 → 0.11.82

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 (65) hide show
  1. package/README.md +8 -0
  2. package/dist/cli/cloud-router.d.ts +90 -0
  3. package/dist/cli/cloud-router.d.ts.map +1 -0
  4. package/dist/cli/commands/agent-commands.d.ts.map +1 -1
  5. package/dist/cli/commands/plan-template-commands.d.ts.map +1 -1
  6. package/dist/cli/commands/project-commands.d.ts.map +1 -1
  7. package/dist/cli/commands/query-commands.d.ts.map +1 -1
  8. package/dist/cli/commands/storage-commands.d.ts.map +1 -1
  9. package/dist/cli/commands/task-commands.d.ts.map +1 -1
  10. package/dist/cli/helpers.d.ts +22 -0
  11. package/dist/cli/helpers.d.ts.map +1 -1
  12. package/dist/cli/index.js +72556 -62360
  13. package/dist/contracts.js +314 -14
  14. package/dist/db/database.d.ts.map +1 -1
  15. package/dist/index.js +1160 -236
  16. package/dist/lib/shadow-status.d.ts +38 -0
  17. package/dist/lib/shadow-status.d.ts.map +1 -0
  18. package/dist/mcp/index.js +10378 -341
  19. package/dist/mcp/tools/agents.d.ts.map +1 -1
  20. package/dist/mcp/tools/task-adv-tools.d.ts.map +1 -1
  21. package/dist/mcp/tools/task-auto-tools.d.ts.map +1 -1
  22. package/dist/mcp/tools/task-crud.d.ts.map +1 -1
  23. package/dist/mcp/tools/task-project-tools.d.ts.map +1 -1
  24. package/dist/mcp/tools/task-workflow-tools.d.ts.map +1 -1
  25. package/dist/registry.js +314 -14
  26. package/dist/release-provenance.json +3 -3
  27. package/dist/sdk/index.d.ts +2 -0
  28. package/dist/sdk/index.d.ts.map +1 -1
  29. package/dist/sdk/index.js +135 -0
  30. package/dist/sdk/v1.generated.d.ts +124 -0
  31. package/dist/sdk/v1.generated.d.ts.map +1 -0
  32. package/dist/server/cloud.d.ts +50 -0
  33. package/dist/server/cloud.d.ts.map +1 -0
  34. package/dist/server/index.js +12073 -2013
  35. package/dist/server/openapi.d.ts +628 -0
  36. package/dist/server/openapi.d.ts.map +1 -0
  37. package/dist/server/serve.d.ts.map +1 -1
  38. package/dist/server/v1.d.ts +19 -0
  39. package/dist/server/v1.d.ts.map +1 -0
  40. package/dist/storage/cloud-client.d.ts +30 -0
  41. package/dist/storage/cloud-client.d.ts.map +1 -0
  42. package/dist/storage/config.d.ts +12 -0
  43. package/dist/storage/config.d.ts.map +1 -1
  44. package/dist/storage/factory.d.ts +2 -0
  45. package/dist/storage/factory.d.ts.map +1 -1
  46. package/dist/storage/index.d.ts +8 -1
  47. package/dist/storage/index.d.ts.map +1 -1
  48. package/dist/storage/interfaces.d.ts +1 -0
  49. package/dist/storage/interfaces.d.ts.map +1 -1
  50. package/dist/storage/local-sqlite.d.ts.map +1 -1
  51. package/dist/storage/postgres-adapter.d.ts.map +1 -1
  52. package/dist/storage/postgres-sync.d.ts.map +1 -1
  53. package/dist/storage/shadow-outbox-schema.d.ts +21 -0
  54. package/dist/storage/shadow-outbox-schema.d.ts.map +1 -0
  55. package/dist/storage/shadow-outbox.d.ts +125 -0
  56. package/dist/storage/shadow-outbox.d.ts.map +1 -0
  57. package/dist/storage/shadow-runtime.d.ts +29 -0
  58. package/dist/storage/shadow-runtime.d.ts.map +1 -0
  59. package/dist/storage/shadow.d.ts +118 -0
  60. package/dist/storage/shadow.d.ts.map +1 -0
  61. package/dist/storage.d.ts +2 -1
  62. package/dist/storage.d.ts.map +1 -1
  63. package/dist/storage.js +1159 -220
  64. package/package.json +6 -2
  65. package/vendor/hasna-contracts-0.5.1.tgz +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,KAAK,OAAO,GAAG;IACb,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD,WAAW,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;IACpC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;CAC5D,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,kBAAkB,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,OAAO,GAAG,IAAI,CAwbjJ"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,KAAK,OAAO,GAAG;IACb,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD,WAAW,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;IACpC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;CAC5D,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,kBAAkB,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,OAAO,GAAG,IAAI,CA6bjJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"task-adv-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-adv-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAGjD,UAAU,cAAc;IACtB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,cAAc,QAmlB1E"}
1
+ {"version":3,"file":"task-adv-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-adv-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAIjD,UAAU,cAAc;IACtB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,cAAc,QAunB1E"}
@@ -1 +1 @@
1
- {"version":3,"file":"task-auto-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-auto-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEjD,UAAU,eAAe;IACvB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QA8V5E"}
1
+ {"version":3,"file":"task-auto-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-auto-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAGjD,UAAU,eAAe;IACvB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QAoX5E"}
@@ -1 +1 @@
1
- {"version":3,"file":"task-crud.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-crud.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAKjD,UAAU,eAAe;IACvB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QA0S5E"}
1
+ {"version":3,"file":"task-crud.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-crud.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAajD,UAAU,eAAe;IACvB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QAqV5E"}
@@ -1 +1 @@
1
- {"version":3,"file":"task-project-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-project-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAkJjD,UAAU,kBAAkB;IAC1B,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,kBAAkB,QAg2FlF"}
1
+ {"version":3,"file":"task-project-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-project-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAmJjD,UAAU,kBAAkB;IAC1B,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,kBAAkB,QAo4FlF"}
@@ -1 +1 @@
1
- {"version":3,"file":"task-workflow-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-workflow-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAIjD,UAAU,mBAAmB;IAC3B,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,mBAAmB,QA0TpF"}
1
+ {"version":3,"file":"task-workflow-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-workflow-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAKjD,UAAU,mBAAmB;IAC3B,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,mBAAmB,QAkZpF"}
package/dist/registry.js CHANGED
@@ -2643,6 +2643,294 @@ var init_machines = __esm(() => {
2643
2643
  ];
2644
2644
  });
2645
2645
 
2646
+ // src/storage/config.ts
2647
+ var exports_config = {};
2648
+ __export(exports_config, {
2649
+ parseStorageMode: () => parseStorageMode,
2650
+ loadTodosStorageConfig: () => loadTodosStorageConfig,
2651
+ loadStorageConfig: () => loadStorageConfig,
2652
+ isTodosShadowEnabled: () => isTodosShadowEnabled,
2653
+ isTodosRemoteStorageEnabled: () => isTodosRemoteStorageEnabled,
2654
+ getTodosStorageShadowEnvName: () => getTodosStorageShadowEnvName,
2655
+ getTodosStorageMode: () => getTodosStorageMode,
2656
+ getTodosStorageEnvName: () => getTodosStorageEnvName,
2657
+ getTodosStorageDatabaseUrl: () => getTodosStorageDatabaseUrl,
2658
+ getTodosStorageDatabaseEnv: () => getTodosStorageDatabaseEnv,
2659
+ getStorageMode: () => getStorageMode,
2660
+ getStorageDatabaseUrl: () => getStorageDatabaseUrl,
2661
+ getStorageDatabaseEnv: () => getStorageDatabaseEnv,
2662
+ getCanonicalTodosRdsConfig: () => getCanonicalTodosRdsConfig,
2663
+ assertTodosShadowConfig: () => assertTodosShadowConfig,
2664
+ assertTodosRemoteStorageConfig: () => assertTodosRemoteStorageConfig,
2665
+ TODOS_STORAGE_TABLES: () => TODOS_STORAGE_TABLES,
2666
+ TODOS_STORAGE_FALLBACK_ENV: () => TODOS_STORAGE_FALLBACK_ENV,
2667
+ TODOS_STORAGE_ENV: () => TODOS_STORAGE_ENV,
2668
+ STORAGE_TABLES: () => STORAGE_TABLES,
2669
+ CANONICAL_TODOS_RDS_RUNTIME_PATH: () => CANONICAL_TODOS_RDS_RUNTIME_PATH,
2670
+ CANONICAL_TODOS_RDS_DATABASE: () => CANONICAL_TODOS_RDS_DATABASE,
2671
+ CANONICAL_TODOS_RDS_CLUSTER: () => CANONICAL_TODOS_RDS_CLUSTER
2672
+ });
2673
+ function getCanonicalTodosRdsConfig() {
2674
+ return {
2675
+ cluster: CANONICAL_TODOS_RDS_CLUSTER,
2676
+ database: CANONICAL_TODOS_RDS_DATABASE,
2677
+ runtimeSecretPath: CANONICAL_TODOS_RDS_RUNTIME_PATH,
2678
+ primaryEnv: TODOS_STORAGE_ENV.databaseUrl,
2679
+ fallbackEnv: TODOS_STORAGE_FALLBACK_ENV.databaseUrl
2680
+ };
2681
+ }
2682
+ function loadTodosStorageConfig(env = process.env) {
2683
+ const mode = getTodosStorageMode(env);
2684
+ const databaseUrl = getTodosStorageDatabaseUrl(env);
2685
+ const bucket = readStorageEnv(env, "s3Bucket").value;
2686
+ const prefix = readStorageEnv(env, "s3Prefix").value ?? "todos/";
2687
+ const region = readStorageEnv(env, "awsRegion").value;
2688
+ const endpoint = readStorageEnv(env, "s3Endpoint").value;
2689
+ const schema = readStorageEnv(env, "databaseSchema").value;
2690
+ return {
2691
+ service: "todos",
2692
+ mode,
2693
+ ...databaseUrl ? {
2694
+ database: {
2695
+ provider: "postgres",
2696
+ url: databaseUrl,
2697
+ ssl: parseBoolean(readStorageEnv(env, "databaseSsl").value, true),
2698
+ ...schema ? { schema } : {}
2699
+ }
2700
+ } : {},
2701
+ ...bucket ? {
2702
+ objectStorage: {
2703
+ provider: "s3",
2704
+ bucket,
2705
+ prefix,
2706
+ ...region ? { region } : {},
2707
+ ...endpoint ? { endpoint } : {},
2708
+ forcePathStyle: parseBoolean(readStorageEnv(env, "s3ForcePathStyle").value, false)
2709
+ }
2710
+ } : {},
2711
+ sync: {
2712
+ batchSize: parsePositiveInteger(readStorageEnv(env, "syncBatchSize").value, 500),
2713
+ dryRun: parseBoolean(readStorageEnv(env, "syncDryRun").value, false)
2714
+ }
2715
+ };
2716
+ }
2717
+ function loadStorageConfig(env = process.env) {
2718
+ return loadTodosStorageConfig(env);
2719
+ }
2720
+ function isTodosRemoteStorageEnabled(config) {
2721
+ return config.mode === "remote" || config.mode === "hybrid";
2722
+ }
2723
+ function assertTodosRemoteStorageConfig(config) {
2724
+ if (!isTodosRemoteStorageEnabled(config))
2725
+ return;
2726
+ if (!config.database?.url) {
2727
+ throw new Error(`${TODOS_STORAGE_ENV.databaseUrl} is required when ${TODOS_STORAGE_ENV.mode}=${config.mode}`);
2728
+ }
2729
+ }
2730
+ function parseStorageMode(value) {
2731
+ const normalized = clean(value)?.toLowerCase();
2732
+ if (!normalized)
2733
+ return "local";
2734
+ if (normalized === "local" || normalized === "remote" || normalized === "hybrid")
2735
+ return normalized;
2736
+ throw new Error(`${TODOS_STORAGE_ENV.mode} must be local, remote, or hybrid`);
2737
+ }
2738
+ function getTodosStorageMode(env = process.env) {
2739
+ return parseStorageMode(readStorageEnv(env, "mode").value);
2740
+ }
2741
+ function getStorageMode(env = process.env) {
2742
+ return getTodosStorageMode(env);
2743
+ }
2744
+ function isTodosShadowEnabled(env = process.env) {
2745
+ return parseBoolean(readStorageEnv(env, "shadow").value, false);
2746
+ }
2747
+ function getTodosStorageShadowEnvName(env = process.env) {
2748
+ return readStorageEnv(env, "shadow").name;
2749
+ }
2750
+ function assertTodosShadowConfig(config, env = process.env) {
2751
+ if (!isTodosShadowEnabled(env))
2752
+ return;
2753
+ if (config.mode !== "local") {
2754
+ throw new Error(`${readStorageEnv(env, "shadow").name} shadow mirror requires ${TODOS_STORAGE_ENV.mode}=local (got ${config.mode})`);
2755
+ }
2756
+ if (!config.database?.url) {
2757
+ throw new Error(`${TODOS_STORAGE_ENV.databaseUrl} is required when ${readStorageEnv(env, "shadow").name} is enabled`);
2758
+ }
2759
+ }
2760
+ function getTodosStorageDatabaseEnv(env = process.env) {
2761
+ return readStorageEnv(env, "databaseUrl").name;
2762
+ }
2763
+ function getStorageDatabaseEnv(env = process.env) {
2764
+ return getTodosStorageDatabaseEnv(env);
2765
+ }
2766
+ function getTodosStorageDatabaseUrl(env = process.env) {
2767
+ return readStorageEnv(env, "databaseUrl").value;
2768
+ }
2769
+ function getStorageDatabaseUrl(env = process.env) {
2770
+ return getTodosStorageDatabaseUrl(env);
2771
+ }
2772
+ function getTodosStorageEnvName(env, key) {
2773
+ return readStorageEnv(env, key).name;
2774
+ }
2775
+ function readStorageEnv(env, key) {
2776
+ const primaryName = TODOS_STORAGE_ENV[key];
2777
+ const primaryValue = clean(env[primaryName]);
2778
+ if (primaryValue !== undefined)
2779
+ return { name: primaryName, value: primaryValue };
2780
+ const fallbackName = TODOS_STORAGE_FALLBACK_ENV[key];
2781
+ const fallbackValue = clean(env[fallbackName]);
2782
+ if (fallbackValue !== undefined)
2783
+ return { name: fallbackName, value: fallbackValue };
2784
+ return { name: primaryName };
2785
+ }
2786
+ function clean(value) {
2787
+ const trimmed = value?.trim();
2788
+ return trimmed ? trimmed : undefined;
2789
+ }
2790
+ function parseBoolean(value, fallback) {
2791
+ const normalized = clean(value)?.toLowerCase();
2792
+ if (!normalized)
2793
+ return fallback;
2794
+ if (["1", "true", "yes", "on"].includes(normalized))
2795
+ return true;
2796
+ if (["0", "false", "no", "off"].includes(normalized))
2797
+ return false;
2798
+ throw new Error(`Expected boolean env value, got ${value}`);
2799
+ }
2800
+ function parsePositiveInteger(value, fallback) {
2801
+ const normalized = clean(value);
2802
+ if (!normalized)
2803
+ return fallback;
2804
+ const parsed = Number.parseInt(normalized, 10);
2805
+ if (!Number.isSafeInteger(parsed) || parsed <= 0) {
2806
+ throw new Error(`${TODOS_STORAGE_ENV.syncBatchSize} must be a positive integer`);
2807
+ }
2808
+ return parsed;
2809
+ }
2810
+ var TODOS_STORAGE_TABLES, STORAGE_TABLES, TODOS_STORAGE_ENV, TODOS_STORAGE_FALLBACK_ENV, CANONICAL_TODOS_RDS_CLUSTER = "hasna-xyz-infra-apps-prod-postgres", CANONICAL_TODOS_RDS_DATABASE = "todos", CANONICAL_TODOS_RDS_RUNTIME_PATH = "hasna/xyz/opensource/todos/prod/rds";
2811
+ var init_config = __esm(() => {
2812
+ TODOS_STORAGE_TABLES = [
2813
+ "todos_sync_records",
2814
+ "todos_sync_cursors"
2815
+ ];
2816
+ STORAGE_TABLES = TODOS_STORAGE_TABLES;
2817
+ TODOS_STORAGE_ENV = {
2818
+ mode: "HASNA_TODOS_STORAGE_MODE",
2819
+ shadow: "HASNA_TODOS_SHADOW",
2820
+ databaseUrl: "HASNA_TODOS_DATABASE_URL",
2821
+ databaseSsl: "HASNA_TODOS_DATABASE_SSL",
2822
+ databaseSchema: "HASNA_TODOS_DATABASE_SCHEMA",
2823
+ s3Bucket: "HASNA_TODOS_S3_BUCKET",
2824
+ s3Prefix: "HASNA_TODOS_S3_PREFIX",
2825
+ awsRegion: "HASNA_TODOS_AWS_REGION",
2826
+ s3Endpoint: "HASNA_TODOS_S3_ENDPOINT",
2827
+ s3ForcePathStyle: "HASNA_TODOS_S3_FORCE_PATH_STYLE",
2828
+ s3AccessKeyId: "HASNA_TODOS_S3_ACCESS_KEY_ID",
2829
+ s3SecretAccessKey: "HASNA_TODOS_S3_SECRET_ACCESS_KEY",
2830
+ s3SessionToken: "HASNA_TODOS_S3_SESSION_TOKEN",
2831
+ syncBatchSize: "HASNA_TODOS_SYNC_BATCH_SIZE",
2832
+ syncDryRun: "HASNA_TODOS_SYNC_DRY_RUN"
2833
+ };
2834
+ TODOS_STORAGE_FALLBACK_ENV = {
2835
+ mode: "TODOS_STORAGE_MODE",
2836
+ shadow: "TODOS_SHADOW",
2837
+ databaseUrl: "TODOS_DATABASE_URL",
2838
+ databaseSsl: "TODOS_DATABASE_SSL",
2839
+ databaseSchema: "TODOS_DATABASE_SCHEMA",
2840
+ s3Bucket: "TODOS_S3_BUCKET",
2841
+ s3Prefix: "TODOS_S3_PREFIX",
2842
+ awsRegion: "TODOS_AWS_REGION",
2843
+ s3Endpoint: "TODOS_S3_ENDPOINT",
2844
+ s3ForcePathStyle: "TODOS_S3_FORCE_PATH_STYLE",
2845
+ s3AccessKeyId: "TODOS_S3_ACCESS_KEY_ID",
2846
+ s3SecretAccessKey: "TODOS_S3_SECRET_ACCESS_KEY",
2847
+ s3SessionToken: "TODOS_S3_SESSION_TOKEN",
2848
+ syncBatchSize: "TODOS_SYNC_BATCH_SIZE",
2849
+ syncDryRun: "TODOS_SYNC_DRY_RUN"
2850
+ };
2851
+ });
2852
+
2853
+ // src/storage/shadow-outbox-schema.ts
2854
+ var exports_shadow_outbox_schema = {};
2855
+ __export(exports_shadow_outbox_schema, {
2856
+ installShadowOutboxSchema: () => installShadowOutboxSchema,
2857
+ SHADOW_TRIGGER_TABLES: () => SHADOW_TRIGGER_TABLES
2858
+ });
2859
+ function installShadowOutboxSchema(db) {
2860
+ db.run(`CREATE TABLE IF NOT EXISTS shadow_outbox (
2861
+ seq INTEGER PRIMARY KEY AUTOINCREMENT,
2862
+ object_type TEXT NOT NULL,
2863
+ object_id TEXT NOT NULL,
2864
+ op TEXT NOT NULL,
2865
+ enqueued_at INTEGER NOT NULL,
2866
+ attempts INTEGER NOT NULL DEFAULT 0,
2867
+ next_attempt_at INTEGER NOT NULL DEFAULT 0,
2868
+ last_error TEXT,
2869
+ status TEXT NOT NULL DEFAULT 'pending',
2870
+ revision INTEGER NOT NULL DEFAULT 0
2871
+ )`);
2872
+ ensureColumn(db, "shadow_outbox", "revision", "INTEGER NOT NULL DEFAULT 0");
2873
+ db.run(`CREATE UNIQUE INDEX IF NOT EXISTS shadow_outbox_pending_uq
2874
+ ON shadow_outbox(object_type, object_id) WHERE status='pending'`);
2875
+ db.run(`CREATE INDEX IF NOT EXISTS shadow_outbox_ready_idx
2876
+ ON shadow_outbox(status, next_attempt_at)`);
2877
+ for (const { table, objectType, deletes } of SHADOW_TRIGGER_TABLES) {
2878
+ const exists = db.query(`SELECT name FROM sqlite_master WHERE type='table' AND name=?`).get(table);
2879
+ if (!exists)
2880
+ continue;
2881
+ const insertTrigger = `shadow_ob_${table}_ai`;
2882
+ const updateTrigger = `shadow_ob_${table}_au`;
2883
+ db.run(`DROP TRIGGER IF EXISTS ${insertTrigger}`);
2884
+ db.run(`DROP TRIGGER IF EXISTS ${updateTrigger}`);
2885
+ db.run(upsertTriggerSql(insertTrigger, table, objectType, "INSERT", "NEW"));
2886
+ db.run(upsertTriggerSql(updateTrigger, table, objectType, "UPDATE", "NEW"));
2887
+ if (deletes) {
2888
+ const deleteTrigger = `shadow_ob_${table}_ad`;
2889
+ db.run(`DROP TRIGGER IF EXISTS ${deleteTrigger}`);
2890
+ db.run(deleteTriggerSql(deleteTrigger, table, objectType));
2891
+ }
2892
+ }
2893
+ }
2894
+ function ensureColumn(db, table, column, definition) {
2895
+ const rows = db.query(`PRAGMA table_info(${table})`).all();
2896
+ if (rows.some((row) => row.name === column))
2897
+ return;
2898
+ db.run(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
2899
+ }
2900
+ function upsertTriggerSql(name, table, objectType, event, row) {
2901
+ return `CREATE TRIGGER IF NOT EXISTS ${name}
2902
+ AFTER ${event} ON ${table}
2903
+ BEGIN
2904
+ INSERT INTO shadow_outbox(object_type, object_id, op, enqueued_at, attempts, next_attempt_at, last_error, status, revision)
2905
+ VALUES('${objectType}', ${row}.id, 'upsert', CAST(strftime('%s','now') AS INTEGER) * 1000, 0, 0, NULL, 'pending', 0)
2906
+ ON CONFLICT(object_type, object_id) WHERE status='pending'
2907
+ DO UPDATE SET op='upsert', enqueued_at=excluded.enqueued_at, attempts=0, next_attempt_at=0, last_error=NULL, revision=shadow_outbox.revision + 1;
2908
+ END`;
2909
+ }
2910
+ function deleteTriggerSql(name, table, objectType) {
2911
+ return `CREATE TRIGGER IF NOT EXISTS ${name}
2912
+ AFTER DELETE ON ${table}
2913
+ BEGIN
2914
+ INSERT INTO shadow_outbox(object_type, object_id, op, enqueued_at, attempts, next_attempt_at, last_error, status, revision)
2915
+ VALUES('${objectType}', OLD.id, 'delete', CAST(strftime('%s','now') AS INTEGER) * 1000, 0, 0, NULL, 'pending', 0)
2916
+ ON CONFLICT(object_type, object_id) WHERE status='pending'
2917
+ DO UPDATE SET op='delete', enqueued_at=excluded.enqueued_at, attempts=0, next_attempt_at=0, last_error=NULL, revision=shadow_outbox.revision + 1;
2918
+ END`;
2919
+ }
2920
+ var SHADOW_TRIGGER_TABLES;
2921
+ var init_shadow_outbox_schema = __esm(() => {
2922
+ SHADOW_TRIGGER_TABLES = [
2923
+ { table: "tasks", objectType: "tasks", deletes: true },
2924
+ { table: "projects", objectType: "projects", deletes: true },
2925
+ { table: "project_machine_paths", objectType: "project_machine_paths", deletes: true },
2926
+ { table: "plans", objectType: "plans", deletes: true },
2927
+ { table: "agents", objectType: "agents", deletes: false },
2928
+ { table: "task_lists", objectType: "task_lists", deletes: true },
2929
+ { table: "task_templates", objectType: "templates", deletes: true },
2930
+ { table: "task_history", objectType: "audit_history", deletes: false }
2931
+ ];
2932
+ });
2933
+
2646
2934
  // src/db/database.ts
2647
2935
  var exports_database = {};
2648
2936
  __export(exports_database, {
@@ -2733,8 +3021,20 @@ function openDatabase(path) {
2733
3021
  runMigrations(db);
2734
3022
  backfillTaskTags(db);
2735
3023
  backfillMachineId(db);
3024
+ maybeInstallShadowCapture(db);
2736
3025
  return db;
2737
3026
  }
3027
+ function maybeInstallShadowCapture(db) {
3028
+ try {
3029
+ const { isTodosShadowEnabled: isTodosShadowEnabled2 } = (init_config(), __toCommonJS(exports_config));
3030
+ if (!isTodosShadowEnabled2())
3031
+ return;
3032
+ const { installShadowOutboxSchema: installShadowOutboxSchema2 } = (init_shadow_outbox_schema(), __toCommonJS(exports_shadow_outbox_schema));
3033
+ installShadowOutboxSchema2(db);
3034
+ } catch (error) {
3035
+ console.error(`[todos] shadow capture install failed: ${error instanceof Error ? error.message : String(error)}`);
3036
+ }
3037
+ }
2738
3038
  function getDatabase(dbPath) {
2739
3039
  const path = dbPath || getDbPath();
2740
3040
  if (_db && _dbPath === path)
@@ -3111,7 +3411,7 @@ function getCompletionGuardConfig(projectPath) {
3111
3411
  return global;
3112
3412
  }
3113
3413
  var cached = null, GUARD_DEFAULTS;
3114
- var init_config = __esm(() => {
3414
+ var init_config2 = __esm(() => {
3115
3415
  init_sync_utils();
3116
3416
  GUARD_DEFAULTS = {
3117
3417
  enabled: false,
@@ -3482,7 +3782,7 @@ function checkCompletionGuard(task, agentId, db, configOverride) {
3482
3782
  }
3483
3783
  var init_completion_guard = __esm(() => {
3484
3784
  init_types();
3485
- init_config();
3785
+ init_config2();
3486
3786
  init_projects();
3487
3787
  });
3488
3788
 
@@ -3490,8 +3790,8 @@ var init_completion_guard = __esm(() => {
3490
3790
  import { tmpdir } from "os";
3491
3791
  import { resolve as resolve3, sep } from "path";
3492
3792
  function envFlag(name) {
3493
- const value = process.env[name];
3494
- return value === "1" || value === "true" || value === "yes";
3793
+ const value = process.env[name]?.trim().toLowerCase();
3794
+ return value === "1" || value === "true" || value === "yes" || value === "on";
3495
3795
  }
3496
3796
  function isUnder(parent, child) {
3497
3797
  const normalizedParent = resolve3(parent);
@@ -3517,7 +3817,7 @@ function usesIsolatedTodosHome() {
3517
3817
  function shouldEmitSharedTaskEvents(dbPath) {
3518
3818
  if (envFlag("TODOS_DISABLE_SHARED_EVENTS"))
3519
3819
  return false;
3520
- if (envFlag("TODOS_ALLOW_EPHEMERAL_SHARED_EVENTS"))
3820
+ if (envFlag("TODOS_ALLOW_EPHEMERAL_SHARED_EVENTS") || envFlag("HASNA_TODOS_ALLOW_GLOBAL_EVENTS_FROM_TEMP_DB"))
3521
3821
  return true;
3522
3822
  if (!isEphemeralTodosDatabase(dbPath))
3523
3823
  return true;
@@ -3619,7 +3919,7 @@ function upsertSecretSafetyConfig(input) {
3619
3919
  }
3620
3920
  var DEFAULT_SECRET_PATTERNS, DEFAULT_SECRET_KEY_PATTERN, NON_SECRET_USAGE_KEYS;
3621
3921
  var init_redaction = __esm(() => {
3622
- init_config();
3922
+ init_config2();
3623
3923
  DEFAULT_SECRET_PATTERNS = [
3624
3924
  { name: "aws-access-key", regex: /\b(AKIA|ASIA)[0-9A-Z]{16}\b/g, replacement: "[REDACTED_AWS_KEY]" },
3625
3925
  { name: "private-key", regex: /-----BEGIN (?:RSA |EC |OPENSSH |)PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |)PRIVATE KEY-----/g, replacement: "[REDACTED_PRIVATE_KEY]" },
@@ -3776,7 +4076,7 @@ function checkWorkspacePermission(input = {}) {
3776
4076
  }
3777
4077
  var DEFAULT_DENYLIST, DEFAULT_ENV_REDACTIONS, PRESET_DEFAULTS;
3778
4078
  var init_workspace_trust = __esm(() => {
3779
- init_config();
4079
+ init_config2();
3780
4080
  DEFAULT_DENYLIST = ["rm -rf", "mkfs", "dd if=", "curl | sh", "wget | sh"];
3781
4081
  DEFAULT_ENV_REDACTIONS = ["API_KEY", "TOKEN", "SECRET", "PASSWORD", "AUTH"];
3782
4082
  PRESET_DEFAULTS = {
@@ -4010,7 +4310,7 @@ function explainRunnerSandbox(input = {}) {
4010
4310
  }
4011
4311
  var DEFAULT_COMMAND_DENYLIST, DEFAULT_ENV_REDACTIONS2;
4012
4312
  var init_runner_sandbox = __esm(() => {
4013
- init_config();
4313
+ init_config2();
4014
4314
  init_workspace_trust();
4015
4315
  DEFAULT_COMMAND_DENYLIST = ["rm -rf", "mkfs", "dd if=", "curl | sh", "wget | sh"];
4016
4316
  DEFAULT_ENV_REDACTIONS2 = ["API_KEY", "TOKEN", "SECRET", "PASSWORD", "AUTH"];
@@ -4246,7 +4546,7 @@ var LOCAL_EVENT_TYPES, VALID_TARGETS;
4246
4546
  var init_event_hooks = __esm(() => {
4247
4547
  init_redaction();
4248
4548
  init_runner_sandbox();
4249
- init_config();
4549
+ init_config2();
4250
4550
  init_event_emission_safety();
4251
4551
  LOCAL_EVENT_TYPES = [
4252
4552
  "task.created",
@@ -16531,7 +16831,7 @@ function writeSdkIntegrationFixtures(directory, options = {}) {
16531
16831
  init_audit();
16532
16832
  init_database();
16533
16833
  init_tasks();
16534
- init_config();
16834
+ init_config2();
16535
16835
  init_event_emission_safety();
16536
16836
  init_event_hooks();
16537
16837
 
@@ -17155,7 +17455,7 @@ init_task_lifecycle();
17155
17455
  init_tasks();
17156
17456
  init_plans();
17157
17457
  init_task_runs();
17158
- init_config();
17458
+ init_config2();
17159
17459
  var LOCAL_ROADMAP_SCHEMA_VERSION = 1;
17160
17460
  function timestamp() {
17161
17461
  return new Date().toISOString();
@@ -17521,7 +17821,7 @@ function renderRoadmapMarkdown(idOrName, db) {
17521
17821
  // src/lib/audit-ledger.ts
17522
17822
  init_database();
17523
17823
  init_task_runs();
17524
- init_config();
17824
+ init_config2();
17525
17825
  init_redaction();
17526
17826
  import { createHash as createHash5 } from "crypto";
17527
17827
  var LOCAL_AUDIT_LEDGER_SCHEMA_VERSION = 1;
@@ -19738,7 +20038,7 @@ init_task_runs();
19738
20038
  init_event_hooks();
19739
20039
 
19740
20040
  // src/lib/terminal-notifications.ts
19741
- init_config();
20041
+ init_config2();
19742
20042
  init_event_hooks();
19743
20043
  init_redaction();
19744
20044
  var SEVERITY_ORDER = {
@@ -20908,7 +21208,7 @@ function renderLocalReportMarkdown(report) {
20908
21208
  `;
20909
21209
  }
20910
21210
  // src/lib/local-encryption.ts
20911
- init_config();
21211
+ init_config2();
20912
21212
  init_redaction();
20913
21213
  import { createCipheriv, createDecipheriv, createHash as createHash8, randomBytes, scryptSync, timingSafeEqual as timingSafeEqual2 } from "crypto";
20914
21214
  var TODOS_ENCRYPTED_VALUE_KIND = "hasna.todos.encrypted-value";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "packageName": "@hasna/todos",
3
- "packageVersion": "0.11.75",
3
+ "packageVersion": "0.11.82",
4
4
  "repository": "https://github.com/hasna/todos.git",
5
- "gitCommit": "a508d390985030bc81c0a0f7b81e30d5e7f55242",
6
- "generatedAt": "2026-07-05T15:01:01.030Z"
5
+ "gitCommit": "c6e5695eeb5700d03c6c7f70b722fdb18dc60e32",
6
+ "generatedAt": "2026-07-08T13:21:23.262Z"
7
7
  }
@@ -9,6 +9,8 @@
9
9
  */
10
10
  export { TodosClient, createClient } from "./client.js";
11
11
  export type { TodosClientOptions } from "./client.js";
12
+ export { TodosV1Client, ApiError as TodosV1ApiError } from "./v1.generated.js";
13
+ export type { TodosV1ClientOptions, Task as TodosV1Task, Project as TodosV1Project, CreateTaskInput as TodosV1CreateTaskInput, UpdateTaskInput as TodosV1UpdateTaskInput, CreateProjectInput as TodosV1CreateProjectInput, } from "./v1.generated.js";
12
14
  export { TodosAPIError, TodosNotFoundError, TodosConflictError, TodosUnauthorizedError, TodosRateLimitError, TodosTimeoutError, } from "./types.js";
13
15
  export type { SSEEvent, CursorPage, ListOptions, TaskListResponse, TaskStatusResponse, TaskNextResponse, TaskActiveResponse, TaskStaleResponse, TaskChangedResponse, TaskContextResponse, TaskProgressResponse, TaskAttachmentsResponse, TaskFailResponse, TaskBulkResponse, AgentMeResponse, AgentQueueResponse, OrgNode, PlanWithTasks, ReportResponse, DoctorResponse, DoctorIssue, } from "./types.js";
14
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,QAAQ,EACR,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,OAAO,EACP,aAAa,EACb,cAAc,EACd,cAAc,EACd,WAAW,GACZ,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAItD,OAAO,EAAE,aAAa,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/E,YAAY,EACV,oBAAoB,EACpB,IAAI,IAAI,WAAW,EACnB,OAAO,IAAI,cAAc,EACzB,eAAe,IAAI,sBAAsB,EACzC,eAAe,IAAI,sBAAsB,EACzC,kBAAkB,IAAI,yBAAyB,GAChD,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,QAAQ,EACR,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,OAAO,EACP,aAAa,EACb,cAAc,EACd,cAAc,EACd,WAAW,GACZ,MAAM,YAAY,CAAC"}
package/dist/sdk/index.js CHANGED
@@ -622,8 +622,143 @@ class TodosClient {
622
622
  function createClient(options) {
623
623
  return new TodosClient(options);
624
624
  }
625
+ // src/sdk/v1.generated.ts
626
+ class ApiError extends Error {
627
+ status;
628
+ body;
629
+ constructor(status, message, body) {
630
+ super(message);
631
+ this.status = status;
632
+ this.body = body;
633
+ this.name = "ApiError";
634
+ }
635
+ }
636
+
637
+ class TodosV1Client {
638
+ baseUrl;
639
+ apiKey;
640
+ fetchImpl;
641
+ baseHeaders;
642
+ constructor(options) {
643
+ if (!options.baseUrl)
644
+ throw new Error("TodosV1Client requires a baseUrl.");
645
+ this.baseUrl = options.baseUrl.replace(/\/$/, "");
646
+ this.apiKey = options.apiKey;
647
+ this.fetchImpl = options.fetch ?? globalThis.fetch;
648
+ this.baseHeaders = options.headers ?? {};
649
+ }
650
+ async request(method, path, opts) {
651
+ const url = new URL(this.baseUrl + path);
652
+ if (opts.query) {
653
+ for (const [key, value] of Object.entries(opts.query)) {
654
+ if (value !== undefined && value !== null)
655
+ url.searchParams.set(key, String(value));
656
+ }
657
+ }
658
+ const headers = { Accept: "application/json", ...this.baseHeaders, ...opts.init?.headers };
659
+ if (this.apiKey)
660
+ headers["x-api-key"] = this.apiKey;
661
+ let payload;
662
+ if (opts.body !== undefined) {
663
+ headers["Content-Type"] = "application/json";
664
+ payload = JSON.stringify(opts.body);
665
+ }
666
+ const response = await this.fetchImpl(url.toString(), { ...opts.init, method, headers, body: payload });
667
+ const text = await response.text();
668
+ const data = text ? (() => {
669
+ try {
670
+ return JSON.parse(text);
671
+ } catch {
672
+ return text;
673
+ }
674
+ })() : undefined;
675
+ if (!response.ok) {
676
+ throw new ApiError(response.status, `${method} ${path} failed: ${response.status}`, data);
677
+ }
678
+ return data;
679
+ }
680
+ async listProjects(init) {
681
+ return this.request("GET", `/v1/projects`, {
682
+ body: undefined,
683
+ query: undefined,
684
+ init
685
+ });
686
+ }
687
+ async createProject(body, init) {
688
+ return this.request("POST", `/v1/projects`, {
689
+ body,
690
+ query: undefined,
691
+ init
692
+ });
693
+ }
694
+ async getProject(id, init) {
695
+ return this.request("GET", `/v1/projects/${encodeURIComponent(String(id))}`, {
696
+ body: undefined,
697
+ query: undefined,
698
+ init
699
+ });
700
+ }
701
+ async getStats(init) {
702
+ return this.request("GET", `/v1/stats`, {
703
+ body: undefined,
704
+ query: undefined,
705
+ init
706
+ });
707
+ }
708
+ async listTasks(query, init) {
709
+ return this.request("GET", `/v1/tasks`, {
710
+ body: undefined,
711
+ query,
712
+ init
713
+ });
714
+ }
715
+ async createTask(body, init) {
716
+ return this.request("POST", `/v1/tasks`, {
717
+ body,
718
+ query: undefined,
719
+ init
720
+ });
721
+ }
722
+ async getTask(id, init) {
723
+ return this.request("GET", `/v1/tasks/${encodeURIComponent(String(id))}`, {
724
+ body: undefined,
725
+ query: undefined,
726
+ init
727
+ });
728
+ }
729
+ async deleteTask(id, init) {
730
+ return this.request("DELETE", `/v1/tasks/${encodeURIComponent(String(id))}`, {
731
+ body: undefined,
732
+ query: undefined,
733
+ init
734
+ });
735
+ }
736
+ async updateTask(id, body, init) {
737
+ return this.request("PATCH", `/v1/tasks/${encodeURIComponent(String(id))}`, {
738
+ body,
739
+ query: undefined,
740
+ init
741
+ });
742
+ }
743
+ async completeTask(id, init) {
744
+ return this.request("POST", `/v1/tasks/${encodeURIComponent(String(id))}/complete`, {
745
+ body: undefined,
746
+ query: undefined,
747
+ init
748
+ });
749
+ }
750
+ async startTask(id, init) {
751
+ return this.request("POST", `/v1/tasks/${encodeURIComponent(String(id))}/start`, {
752
+ body: undefined,
753
+ query: undefined,
754
+ init
755
+ });
756
+ }
757
+ }
625
758
  export {
626
759
  createClient,
760
+ TodosV1Client,
761
+ ApiError as TodosV1ApiError,
627
762
  TodosUnauthorizedError,
628
763
  TodosTimeoutError,
629
764
  TodosRateLimitError,