@hasna/todos 0.15.34 → 0.15.41

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 (93) hide show
  1. package/dist/cli/cloud-router.d.ts +53 -19
  2. package/dist/cli/cloud-router.d.ts.map +1 -1
  3. package/dist/cli/commands/agent-commands.d.ts.map +1 -1
  4. package/dist/cli/commands/plan-template-commands.d.ts.map +1 -1
  5. package/dist/cli/commands/project-commands.d.ts.map +1 -1
  6. package/dist/cli/commands/task-commands.d.ts.map +1 -1
  7. package/dist/cli/commands/task-subtree-transfer-commands.d.ts +3 -0
  8. package/dist/cli/commands/task-subtree-transfer-commands.d.ts.map +1 -0
  9. package/dist/cli/index.js +3551 -836
  10. package/dist/cli/stage-a.d.ts.map +1 -1
  11. package/dist/contracts.js +147 -57
  12. package/dist/db/migrations.d.ts.map +1 -1
  13. package/dist/db/plan-comments.d.ts +14 -0
  14. package/dist/db/plan-comments.d.ts.map +1 -0
  15. package/dist/db/projects.d.ts +23 -0
  16. package/dist/db/projects.d.ts.map +1 -1
  17. package/dist/db/schema.d.ts.map +1 -1
  18. package/dist/db/task-crud.d.ts.map +1 -1
  19. package/dist/db/task-lifecycle.d.ts.map +1 -1
  20. package/dist/db/task-lists.d.ts.map +1 -1
  21. package/dist/db/task-relations.d.ts.map +1 -1
  22. package/dist/index.d.ts +3 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1994 -346
  25. package/dist/json-contracts.d.ts.map +1 -1
  26. package/dist/lib/comment-cursor.d.ts +19 -0
  27. package/dist/lib/comment-cursor.d.ts.map +1 -1
  28. package/dist/lib/import-export-bridge.d.ts.map +1 -1
  29. package/dist/lib/onboarding-fixtures.d.ts.map +1 -1
  30. package/dist/mcp/index.js +2491 -507
  31. package/dist/mcp/tools/task-project-tools.d.ts.map +1 -1
  32. package/dist/mcp.js +11 -4
  33. package/dist/project-registration/authority.d.ts.map +1 -1
  34. package/dist/project-registration/sqlite.d.ts.map +1 -1
  35. package/dist/project-registration.js +362 -79
  36. package/dist/registry.d.ts +1 -1
  37. package/dist/registry.d.ts.map +1 -1
  38. package/dist/registry.js +154 -57
  39. package/dist/release-provenance.json +5 -5
  40. package/dist/sdk/index.d.ts +1 -1
  41. package/dist/sdk/index.d.ts.map +1 -1
  42. package/dist/sdk/index.js +35 -0
  43. package/dist/sdk/v1.generated.d.ts +144 -0
  44. package/dist/sdk/v1.generated.d.ts.map +1 -1
  45. package/dist/server/cloud.d.ts +12 -2
  46. package/dist/server/cloud.d.ts.map +1 -1
  47. package/dist/server/index.js +5247 -8429
  48. package/dist/server/openapi.d.ts +2104 -1314
  49. package/dist/server/openapi.d.ts.map +1 -1
  50. package/dist/server/v1.d.ts +2 -1
  51. package/dist/server/v1.d.ts.map +1 -1
  52. package/dist/storage/config.d.ts +12 -30
  53. package/dist/storage/config.d.ts.map +1 -1
  54. package/dist/storage/index.d.ts +2 -2
  55. package/dist/storage/index.d.ts.map +1 -1
  56. package/dist/storage/interfaces.d.ts +13 -2
  57. package/dist/storage/interfaces.d.ts.map +1 -1
  58. package/dist/storage/local-sqlite.d.ts.map +1 -1
  59. package/dist/storage/postgres-adapter.d.ts.map +1 -1
  60. package/dist/storage/timestamp-backfill.d.ts +62 -0
  61. package/dist/storage/timestamp-backfill.d.ts.map +1 -0
  62. package/dist/storage.d.ts +2 -2
  63. package/dist/storage.d.ts.map +1 -1
  64. package/dist/storage.js +327 -75
  65. package/dist/task-subtree-transfer/authority.d.ts +27 -0
  66. package/dist/task-subtree-transfer/authority.d.ts.map +1 -0
  67. package/dist/task-subtree-transfer/backend.d.ts +9 -0
  68. package/dist/task-subtree-transfer/backend.d.ts.map +1 -0
  69. package/dist/task-subtree-transfer/canonical.d.ts +14 -0
  70. package/dist/task-subtree-transfer/canonical.d.ts.map +1 -0
  71. package/dist/task-subtree-transfer/http.d.ts +16 -0
  72. package/dist/task-subtree-transfer/http.d.ts.map +1 -0
  73. package/dist/task-subtree-transfer/index.d.ts +6 -0
  74. package/dist/task-subtree-transfer/index.d.ts.map +1 -0
  75. package/dist/task-subtree-transfer/planner.d.ts +24 -0
  76. package/dist/task-subtree-transfer/planner.d.ts.map +1 -0
  77. package/dist/task-subtree-transfer/postgres.d.ts +19 -0
  78. package/dist/task-subtree-transfer/postgres.d.ts.map +1 -0
  79. package/dist/task-subtree-transfer/schema-sql.d.ts +5 -0
  80. package/dist/task-subtree-transfer/schema-sql.d.ts.map +1 -0
  81. package/dist/task-subtree-transfer/sqlite.d.ts +16 -0
  82. package/dist/task-subtree-transfer/sqlite.d.ts.map +1 -0
  83. package/dist/task-subtree-transfer/types.d.ts +148 -0
  84. package/dist/task-subtree-transfer/types.d.ts.map +1 -0
  85. package/dist/task-subtree-transfer.d.ts +2 -0
  86. package/dist/task-subtree-transfer.d.ts.map +1 -0
  87. package/dist/task-subtree-transfer.js +1869 -0
  88. package/dist/testing.d.ts +41 -7
  89. package/dist/testing.d.ts.map +1 -1
  90. package/dist/testing.js +44 -1
  91. package/dist/types/index.d.ts +29 -2
  92. package/dist/types/index.d.ts.map +1 -1
  93. package/package.json +11 -4
@@ -12,7 +12,7 @@ export interface TodosPackageSource {
12
12
  version: string;
13
13
  }
14
14
  export interface TodosPackageExportContract {
15
- subpath: "." | "./sdk" | "./mcp" | "./registry" | "./contracts" | "./storage" | "./testing" | "./project-registration" | "./task-manifest";
15
+ subpath: "." | "./sdk" | "./mcp" | "./registry" | "./contracts" | "./storage" | "./testing" | "./project-registration" | "./task-manifest" | "./task-subtree-transfer";
16
16
  import: string;
17
17
  types: string;
18
18
  description: string;
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,WAAW,0BAA0B;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,cAAc,CAAC;IAC5B,UAAU,EAAE,aAAa,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EACH,GAAG,GACH,OAAO,GACP,OAAO,GACP,YAAY,GACZ,aAAa,GACb,WAAW,GACX,WAAW,GACX,wBAAwB,GACxB,iBAAiB,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,CAAC,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,OAAO,EAAE,0BAA0B,EAAE,CAAC;IACtC,oBAAoB,EAAE,wBAAwB,CAAC;IAC/C,YAAY,EAAE,uBAAuB,CAAC;IACtC,SAAS,EAAE,sBAAsB,CAAC;IAClC,GAAG,EAAE,gBAAgB,CAAC;IACtB,YAAY,EAAE,yBAAyB,CAAC;CACzC;AAED,eAAO,MAAM,qBAAqB,EAAE,0BAA0B,EAgE7D,CAAC;AAUF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,0BAA+B,GAAG,aAAa,CAc3F;AAED,eAAO,MAAM,cAAc,eAEzB,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,WAAW,0BAA0B;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,cAAc,CAAC;IAC5B,UAAU,EAAE,aAAa,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EACH,GAAG,GACH,OAAO,GACP,OAAO,GACP,YAAY,GACZ,aAAa,GACb,WAAW,GACX,WAAW,GACX,wBAAwB,GACxB,iBAAiB,GACjB,yBAAyB,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,CAAC,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,OAAO,EAAE,0BAA0B,EAAE,CAAC;IACtC,oBAAoB,EAAE,wBAAwB,CAAC;IAC/C,YAAY,EAAE,uBAAuB,CAAC;IACtC,SAAS,EAAE,sBAAsB,CAAC;IAClC,GAAG,EAAE,gBAAgB,CAAC;IACtB,YAAY,EAAE,yBAAyB,CAAC;CACzC;AAED,eAAO,MAAM,qBAAqB,EAAE,0BAA0B,EAuE7D,CAAC;AAUF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,0BAA+B,GAAG,aAAa,CAc3F;AAED,eAAO,MAAM,cAAc,eAEzB,CAAC"}
package/dist/registry.js CHANGED
@@ -1884,6 +1884,10 @@ var init_migrations = __esm(() => {
1884
1884
  );
1885
1885
  INSERT OR IGNORE INTO _migrations (id) VALUES (70);
1886
1886
  COMMIT;
1887
+ `,
1888
+ `BEGIN;
1889
+ INSERT OR IGNORE INTO _migrations (id) VALUES (71);
1890
+ COMMIT;
1887
1891
  `
1888
1892
  ];
1889
1893
  });
@@ -2557,6 +2561,8 @@ function ensureSchema(db) {
2557
2561
  ensureColumn("projects", "task_list_id", "TEXT");
2558
2562
  ensureColumn("projects", "task_prefix", "TEXT");
2559
2563
  ensureColumn("projects", "task_counter", "INTEGER NOT NULL DEFAULT 0");
2564
+ ensureColumn("projects", "parent_id", "TEXT REFERENCES projects(id) ON DELETE SET NULL");
2565
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_projects_parent_id ON projects(parent_id)");
2560
2566
  ensureColumn("tasks", "plan_id", "TEXT REFERENCES plans(id) ON DELETE SET NULL");
2561
2567
  ensureColumn("tasks", "task_list_id", "TEXT REFERENCES task_lists(id) ON DELETE SET NULL");
2562
2568
  ensureColumn("tasks", "short_id", "TEXT");
@@ -2670,6 +2676,20 @@ function ensureSchema(db) {
2670
2676
  ensureIndex("CREATE INDEX IF NOT EXISTS idx_webhook_deliveries_event ON webhook_deliveries(event)");
2671
2677
  ensureColumn("task_comments", "type", "TEXT DEFAULT 'comment'");
2672
2678
  ensureColumn("task_comments", "progress_pct", "INTEGER");
2679
+ ensureTable("plan_comments", `
2680
+ CREATE TABLE plan_comments (
2681
+ id TEXT PRIMARY KEY,
2682
+ plan_id TEXT NOT NULL REFERENCES plans(id) ON DELETE CASCADE,
2683
+ agent_id TEXT,
2684
+ session_id TEXT,
2685
+ content TEXT NOT NULL,
2686
+ type TEXT DEFAULT 'comment' CHECK(type IN ('comment', 'progress', 'note')),
2687
+ progress_pct INTEGER CHECK(progress_pct IS NULL OR (progress_pct >= 0 AND progress_pct <= 100)),
2688
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
2689
+ machine_id TEXT,
2690
+ synced_at TEXT
2691
+ )`);
2692
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_plan_comments_plan ON plan_comments(plan_id)");
2673
2693
  ensureColumn("projects", "machine_id", "TEXT");
2674
2694
  ensureColumn("projects", "synced_at", "TEXT");
2675
2695
  ensureColumn("tasks", "machine_id", "TEXT");
@@ -3651,6 +3671,7 @@ var init_machines = __esm(() => {
3651
3671
  "task_lists",
3652
3672
  "plans",
3653
3673
  "task_comments",
3674
+ "plan_comments",
3654
3675
  "sessions",
3655
3676
  "task_history",
3656
3677
  "webhooks",
@@ -4154,20 +4175,16 @@ var init_sync_utils = __esm(() => {
4154
4175
  // src/storage/config.ts
4155
4176
  var exports_config = {};
4156
4177
  __export(exports_config, {
4157
- parseStorageMode: () => parseStorageMode,
4158
4178
  parseStorageBackend: () => parseStorageBackend,
4159
4179
  loadTodosStorageConfig: () => loadTodosStorageConfig,
4160
4180
  loadStorageConfig: () => loadStorageConfig,
4161
4181
  isTodosShadowEnabled: () => isTodosShadowEnabled,
4162
- isTodosRemoteStorageEnabled: () => isTodosRemoteStorageEnabled,
4163
4182
  isTodosPostgresBackend: () => isTodosPostgresBackend,
4164
4183
  getTodosStorageShadowEnvName: () => getTodosStorageShadowEnvName,
4165
- getTodosStorageMode: () => getTodosStorageMode,
4166
4184
  getTodosStorageEnvName: () => getTodosStorageEnvName,
4167
4185
  getTodosStorageDatabaseUrl: () => getTodosStorageDatabaseUrl,
4168
4186
  getTodosStorageDatabaseEnv: () => getTodosStorageDatabaseEnv,
4169
4187
  getTodosStorageBackend: () => getTodosStorageBackend,
4170
- getStorageMode: () => getStorageMode,
4171
4188
  getStorageDatabaseUrl: () => getStorageDatabaseUrl,
4172
4189
  getStorageDatabaseEnv: () => getStorageDatabaseEnv,
4173
4190
  getCanonicalTodosRdsConfig: () => getCanonicalTodosRdsConfig,
@@ -4177,7 +4194,6 @@ __export(exports_config, {
4177
4194
  TODOS_STORAGE_FALLBACK_ENV: () => TODOS_STORAGE_FALLBACK_ENV,
4178
4195
  TODOS_STORAGE_ENV: () => TODOS_STORAGE_ENV,
4179
4196
  STORAGE_TABLES: () => STORAGE_TABLES,
4180
- REMOVED_STORAGE_MODE_ENV_KEYS: () => REMOVED_STORAGE_MODE_ENV_KEYS,
4181
4197
  CANONICAL_TODOS_RDS_RUNTIME_PATH_ENV: () => CANONICAL_TODOS_RDS_RUNTIME_PATH_ENV,
4182
4198
  CANONICAL_TODOS_RDS_DATABASE: () => CANONICAL_TODOS_RDS_DATABASE,
4183
4199
  CANONICAL_TODOS_RDS_CLUSTER_ENV: () => CANONICAL_TODOS_RDS_CLUSTER_ENV
@@ -4232,9 +4248,6 @@ function loadStorageConfig(env = process.env) {
4232
4248
  function isTodosPostgresBackend(config) {
4233
4249
  return config.mode === "postgres";
4234
4250
  }
4235
- function isTodosRemoteStorageEnabled(config) {
4236
- return isTodosPostgresBackend(config);
4237
- }
4238
4251
  function assertTodosRemoteStorageConfig(config) {
4239
4252
  if (!isTodosPostgresBackend(config))
4240
4253
  return;
@@ -4250,32 +4263,15 @@ function parseStorageBackend(value) {
4250
4263
  return "sqlite";
4251
4264
  if (normalized === "postgres" || normalized === "postgresql")
4252
4265
  return "postgres";
4253
- if (["local", "remote", "cloud", "hybrid", "self_hosted"].includes(normalized)) {
4254
- throw new Error(`${TODOS_STORAGE_ENV.databaseUrl} selects the backend. Deployment modes no longer exist: ` + `delete the storage-mode variable and set ${TODOS_STORAGE_ENV.databaseUrl} to select the ` + `postgresql backend, or leave it unset for sqlite.`);
4255
- }
4256
4266
  throw new Error(`Storage backend must be sqlite or postgres`);
4257
4267
  }
4258
- function parseStorageMode(value) {
4259
- return parseStorageBackend(value);
4260
- }
4261
4268
  function getTodosStorageBackend(env = process.env) {
4262
- for (const key of REMOVED_STORAGE_MODE_ENV_KEYS) {
4263
- if (Object.hasOwn(env, key) && env[key] !== undefined) {
4264
- throw new Error(`${key} was removed. Deployment modes no longer exist: delete the storage-mode variable. ` + `Set ${TODOS_STORAGE_ENV.databaseUrl} to select the postgresql backend, ` + `or leave it unset for sqlite.`);
4265
- }
4266
- }
4267
4269
  if (!getTodosStorageDatabaseUrl(env))
4268
4270
  return "sqlite";
4269
4271
  if (isTodosShadowEnabled(env))
4270
4272
  return "sqlite";
4271
4273
  return "postgres";
4272
4274
  }
4273
- function getTodosStorageMode(env = process.env) {
4274
- return getTodosStorageBackend(env);
4275
- }
4276
- function getStorageMode(env = process.env) {
4277
- return getTodosStorageBackend(env);
4278
- }
4279
4275
  function isTodosShadowEnabled(env = process.env) {
4280
4276
  return parseBoolean(readStorageEnv(env, "shadow").value, false);
4281
4277
  }
@@ -4342,7 +4338,7 @@ function parsePositiveInteger(value, fallback) {
4342
4338
  }
4343
4339
  return parsed;
4344
4340
  }
4345
- var TODOS_STORAGE_TABLES, STORAGE_TABLES, TODOS_STORAGE_ENV, TODOS_STORAGE_FALLBACK_ENV, REMOVED_STORAGE_MODE_ENV_KEYS, CANONICAL_TODOS_RDS_CLUSTER_ENV = "HASNA_TODOS_RDS_CLUSTER", CANONICAL_TODOS_RDS_RUNTIME_PATH_ENV = "HASNA_TODOS_RDS_RUNTIME_PATH", CANONICAL_TODOS_RDS_DATABASE = "todos";
4341
+ var TODOS_STORAGE_TABLES, STORAGE_TABLES, TODOS_STORAGE_ENV, TODOS_STORAGE_FALLBACK_ENV, CANONICAL_TODOS_RDS_CLUSTER_ENV = "HASNA_TODOS_RDS_CLUSTER", CANONICAL_TODOS_RDS_RUNTIME_PATH_ENV = "HASNA_TODOS_RDS_RUNTIME_PATH", CANONICAL_TODOS_RDS_DATABASE = "todos";
4346
4342
  var init_config = __esm(() => {
4347
4343
  TODOS_STORAGE_TABLES = [
4348
4344
  "todos_sync_records",
@@ -4381,12 +4377,6 @@ var init_config = __esm(() => {
4381
4377
  syncBatchSize: "TODOS_SYNC_BATCH_SIZE",
4382
4378
  syncDryRun: "TODOS_SYNC_DRY_RUN"
4383
4379
  };
4384
- REMOVED_STORAGE_MODE_ENV_KEYS = [
4385
- "HASNA_TODOS_STORAGE_MODE",
4386
- "HASNA_TODOS_MODE",
4387
- "TODOS_STORAGE_MODE",
4388
- "TODOS_MODE"
4389
- ];
4390
4380
  });
4391
4381
 
4392
4382
  // src/storage/shadow-outbox-schema.ts
@@ -5045,17 +5035,24 @@ function createProject(input, db) {
5045
5035
  const id = uuid();
5046
5036
  const timestamp2 = now();
5047
5037
  const derivedSlug = slugify(input.name);
5048
- const taskListId = input.task_list_id === undefined ? `todos-${derivedSlug}` : slugify(input.task_list_id);
5038
+ const taskListId = input.task_list_id === undefined ? derivedSlug : slugify(input.task_list_id);
5049
5039
  if (!derivedSlug || !taskListId)
5050
5040
  throw new Error("Project name and task-list slug must be non-empty");
5051
5041
  const slugConflict = d.query("SELECT id FROM projects WHERE task_list_id = ? LIMIT 1").get(taskListId);
5052
5042
  if (slugConflict || !claimCanonicalSlug("project", "global", taskListId, id, d)) {
5053
5043
  throw new ResourceConflictError("PROJECT_SLUG_CONFLICT", `Project slug "${taskListId}" already exists`);
5054
5044
  }
5045
+ const parentId = input.parent_id ?? null;
5046
+ if (parentId !== null) {
5047
+ const parent = getProject(parentId, d);
5048
+ if (!parent)
5049
+ throw new ProjectNotFoundError(parentId);
5050
+ assertNotProjectAncestor(id, parentId, d);
5051
+ }
5055
5052
  const taskPrefix = input.task_prefix || generatePrefix(input.name, d);
5056
5053
  const machineId = currentStorageMachineId(d);
5057
- d.run(`INSERT INTO projects (id, name, path, description, task_list_id, task_prefix, task_counter, created_at, updated_at, machine_id)
5058
- VALUES (?, ?, ?, ?, ?, ?, 0, ?, ?, ?)`, [id, input.name, input.path, input.description || null, taskListId, taskPrefix, timestamp2, timestamp2, machineId]);
5054
+ d.run(`INSERT INTO projects (id, name, path, description, task_list_id, task_prefix, task_counter, parent_id, created_at, updated_at, machine_id)
5055
+ VALUES (?, ?, ?, ?, ?, ?, 0, ?, ?, ?, ?)`, [id, input.name, input.path, input.description || null, taskListId, taskPrefix, parentId, timestamp2, timestamp2, machineId]);
5059
5056
  return getProject(id, d);
5060
5057
  })();
5061
5058
  }
@@ -5080,6 +5077,60 @@ function listProjects(db) {
5080
5077
  const d = db || getDatabase();
5081
5078
  return d.query("SELECT * FROM projects ORDER BY name").all();
5082
5079
  }
5080
+ function orderProjectsParentFirst(projects) {
5081
+ const projectId = (project) => {
5082
+ const id = project.id;
5083
+ return typeof id === "string" && id.length > 0 ? id : null;
5084
+ };
5085
+ const parentId = (project) => {
5086
+ const parent = project.parent_id;
5087
+ return parent == null ? null : String(parent);
5088
+ };
5089
+ const byId = new Set;
5090
+ for (const project of projects) {
5091
+ const id = projectId(project);
5092
+ if (id !== null)
5093
+ byId.add(id);
5094
+ }
5095
+ const ordered = [];
5096
+ const emitted = new Set;
5097
+ let remaining = [...projects];
5098
+ let progress = true;
5099
+ while (progress && remaining.length > 0) {
5100
+ progress = false;
5101
+ const deferred = [];
5102
+ for (const project of remaining) {
5103
+ const parent = parentId(project);
5104
+ if (parent === null || emitted.has(parent) || !byId.has(parent)) {
5105
+ ordered.push(project);
5106
+ const id = projectId(project);
5107
+ if (id !== null)
5108
+ emitted.add(id);
5109
+ progress = true;
5110
+ } else {
5111
+ deferred.push(project);
5112
+ }
5113
+ }
5114
+ remaining = deferred;
5115
+ }
5116
+ ordered.push(...remaining);
5117
+ return ordered;
5118
+ }
5119
+ function assertNotProjectAncestor(projectId, ancestorId, db) {
5120
+ const d = db || getDatabase();
5121
+ let cursor = ancestorId;
5122
+ const seen = new Set;
5123
+ while (cursor !== null) {
5124
+ if (cursor === projectId) {
5125
+ throw new ResourceConflictError("PROJECT_PARENT_CYCLE", `Project "${projectId}" cannot be placed under its own descendant`);
5126
+ }
5127
+ if (seen.has(cursor))
5128
+ break;
5129
+ seen.add(cursor);
5130
+ const row = d.query("SELECT parent_id FROM projects WHERE id = ?").get(cursor);
5131
+ cursor = row?.parent_id ?? null;
5132
+ }
5133
+ }
5083
5134
  function updateProject(id, input, db) {
5084
5135
  const d = db || getDatabase();
5085
5136
  const project = getProject(id, d);
@@ -5102,6 +5153,16 @@ function updateProject(id, input, db) {
5102
5153
  sets.push("path = ?");
5103
5154
  params.push(input.path);
5104
5155
  }
5156
+ if (input.parent_id !== undefined) {
5157
+ if (input.parent_id !== null) {
5158
+ const parent = getProject(input.parent_id, d);
5159
+ if (!parent)
5160
+ throw new ProjectNotFoundError(input.parent_id);
5161
+ assertNotProjectAncestor(id, input.parent_id, d);
5162
+ }
5163
+ sets.push("parent_id = ?");
5164
+ params.push(input.parent_id);
5165
+ }
5105
5166
  params.push(id);
5106
5167
  d.run(`UPDATE projects SET ${sets.join(", ")} WHERE id = ?`, params);
5107
5168
  return getProject(id, d);
@@ -6780,22 +6841,31 @@ function updateTaskList(id, input, db) {
6780
6841
  throw new TaskListNotFoundError(id);
6781
6842
  const sets = ["updated_at = ?"];
6782
6843
  const params = [now()];
6783
- if (input.slug !== undefined) {
6784
- const slug = slugify(input.slug);
6785
- if (!slug)
6786
- throw new Error("Invalid task-list slug \u2014 must be non-empty kebab-case");
6787
- const duplicate = existing.project_id ? d.query("SELECT id FROM task_lists WHERE project_id = ? AND slug = ? AND id != ?").get(existing.project_id, slug, id) : d.query("SELECT id FROM task_lists WHERE project_id IS NULL AND slug = ? AND id != ?").get(slug, id);
6844
+ const projectId = input.project_id === "" || input.project_id === null ? null : input.project_id === undefined ? existing.project_id : input.project_id;
6845
+ const scopeChanged = projectId !== existing.project_id;
6846
+ const effectiveSlug = input.slug !== undefined ? slugify(input.slug) : existing.slug;
6847
+ if (input.slug !== undefined && !effectiveSlug) {
6848
+ throw new Error("Invalid task-list slug \u2014 must be non-empty kebab-case");
6849
+ }
6850
+ if (scopeChanged || input.slug !== undefined && effectiveSlug !== existing.slug) {
6851
+ const duplicate = projectId ? d.query("SELECT id FROM task_lists WHERE project_id = ? AND slug = ? AND id != ?").get(projectId, effectiveSlug, id) : d.query("SELECT id FROM task_lists WHERE project_id IS NULL AND slug = ? AND id != ?").get(effectiveSlug, id);
6788
6852
  if (duplicate) {
6789
- throw new ResourceConflictError("TASK_LIST_SLUG_CONFLICT", `Task list with slug "${slug}" already exists in this scope`);
6853
+ throw new ResourceConflictError("TASK_LIST_SLUG_CONFLICT", `Task list with slug "${effectiveSlug}" already exists in this scope`);
6790
6854
  }
6791
- if (slug !== existing.slug) {
6855
+ if (scopeChanged || effectiveSlug !== existing.slug) {
6792
6856
  releaseCanonicalSlugClaims("task_list", id, d);
6793
- if (!claimCanonicalSlug("task_list", taskListSlugScopeKey(existing.project_id), slug, id, d)) {
6794
- throw new ResourceConflictError("TASK_LIST_SLUG_CONFLICT", `Task list with slug "${slug}" already exists in this scope`);
6857
+ if (!claimCanonicalSlug("task_list", taskListSlugScopeKey(projectId), effectiveSlug, id, d)) {
6858
+ throw new ResourceConflictError("TASK_LIST_SLUG_CONFLICT", `Task list with slug "${effectiveSlug}" already exists in this scope`);
6795
6859
  }
6796
6860
  }
6861
+ }
6862
+ if (input.slug !== undefined) {
6797
6863
  sets.push("slug = ?");
6798
- params.push(slug);
6864
+ params.push(effectiveSlug);
6865
+ }
6866
+ if (projectId !== existing.project_id) {
6867
+ sets.push("project_id = ?");
6868
+ params.push(projectId);
6799
6869
  }
6800
6870
  if (input.name !== undefined) {
6801
6871
  sets.push("name = ?");
@@ -9244,8 +9314,8 @@ function failTask(id, agentId, reason, options, db) {
9244
9314
  const safeMeta = sanitizePreWriteValue(meta, "task.failure.metadata");
9245
9315
  const timestamp2 = now();
9246
9316
  const failTx = d.transaction(() => {
9247
- const res = d.run(`UPDATE tasks SET status = 'failed', reason = ?, locked_by = NULL, locked_at = NULL, metadata = ?, version = version + 1, updated_at = ?
9248
- WHERE id = ? AND version = ?`, [safeReason, JSON.stringify(safeMeta), timestamp2, id, task.version]);
9317
+ const res = d.run(`UPDATE tasks SET status = 'failed', reason = ?, locked_by = NULL, locked_at = NULL, completed_at = COALESCE(completed_at, ?), metadata = ?, version = version + 1, updated_at = ?
9318
+ WHERE id = ? AND version = ?`, [safeReason, timestamp2, JSON.stringify(safeMeta), timestamp2, id, task.version]);
9249
9319
  if (res.changes === 0) {
9250
9320
  const current = getTask(id, d);
9251
9321
  throw new VersionConflictError(id, task.version, current?.version ?? -1);
@@ -9257,6 +9327,7 @@ function failTask(id, agentId, reason, options, db) {
9257
9327
  status: "failed",
9258
9328
  locked_by: null,
9259
9329
  locked_at: null,
9330
+ completed_at: task.completed_at ?? timestamp2,
9260
9331
  reason: safeReason,
9261
9332
  metadata: safeMeta,
9262
9333
  version: task.version + 1,
@@ -9905,13 +9976,20 @@ function updateTaskStored(id, input, db) {
9905
9976
  if (isTerminalStatus(input.status)) {
9906
9977
  sets.push("locked_by = NULL");
9907
9978
  sets.push("locked_at = NULL");
9908
- }
9909
- if (input.status === "completed") {
9910
- sets.push("completed_at = ?");
9911
- params.push(completionTimestamp);
9979
+ if (input.status === "completed") {
9980
+ sets.push("completed_at = ?");
9981
+ params.push(completionTimestamp);
9982
+ } else {
9983
+ sets.push("completed_at = COALESCE(completed_at, ?)");
9984
+ params.push(completionTimestamp);
9985
+ }
9912
9986
  } else if (task.status === "completed" && input.completed_at === undefined) {
9913
9987
  sets.push("completed_at = NULL");
9914
9988
  }
9989
+ if (input.status === "in_progress") {
9990
+ sets.push("started_at = COALESCE(started_at, ?)");
9991
+ params.push(timestamp2);
9992
+ }
9915
9993
  }
9916
9994
  if (input.priority !== undefined) {
9917
9995
  sets.push("priority = ?");
@@ -10049,7 +10127,6 @@ function updateTaskStored(id, input, db) {
10049
10127
  if (input.approved_by !== undefined)
10050
10128
  logTaskChange(id, "approve", "approved_by", null, input.approved_by, agentId, d);
10051
10129
  const reopened = input.status !== undefined && input.status !== "completed" && task.status === "completed" && input.completed_at === undefined;
10052
- const completedNow = input.status === "completed";
10053
10130
  const terminalNow = input.status !== undefined && isTerminalStatus(input.status);
10054
10131
  const updatedTask = {
10055
10132
  ...task,
@@ -10060,7 +10137,8 @@ function updateTaskStored(id, input, db) {
10060
10137
  updated_at: timestamp2,
10061
10138
  locked_by: terminalNow ? null : task.locked_by,
10062
10139
  locked_at: terminalNow ? null : task.locked_at,
10063
- completed_at: completedNow ? completionTimestamp : reopened ? null : input.completed_at !== undefined ? input.completed_at : task.completed_at,
10140
+ completed_at: input.status === "completed" ? completionTimestamp : input.completed_at !== undefined ? input.completed_at : terminalNow ? task.completed_at ?? completionTimestamp : reopened ? null : task.completed_at,
10141
+ started_at: input.status === "in_progress" ? task.started_at ?? timestamp2 : task.started_at,
10064
10142
  sla_minutes: input.sla_minutes !== undefined ? input.sla_minutes : task.sla_minutes,
10065
10143
  actual_minutes: input.actual_minutes ?? task.actual_minutes,
10066
10144
  confidence: input.confidence !== undefined ? input.confidence : task.confidence,
@@ -10121,6 +10199,9 @@ function deleteTask(id, db) {
10121
10199
  version: row.version
10122
10200
  }, d);
10123
10201
  const result = d.run("DELETE FROM tasks WHERE id = ?", [id]);
10202
+ if (result.changes > 0) {
10203
+ d.run("DELETE FROM task_dependencies WHERE task_id = ? OR depends_on = ?", [id, id]);
10204
+ }
10124
10205
  return result.changes > 0;
10125
10206
  }
10126
10207
  var init_task_crud = __esm(() => {
@@ -12728,7 +12809,7 @@ var init_tasks = __esm(() => {
12728
12809
  // package.json
12729
12810
  var package_default = {
12730
12811
  name: "@hasna/todos",
12731
- version: "0.15.34",
12812
+ version: "0.15.41",
12732
12813
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
12733
12814
  type: "module",
12734
12815
  main: "dist/index.js",
@@ -12774,6 +12855,10 @@ var package_default = {
12774
12855
  "./task-manifest": {
12775
12856
  types: "./dist/task-manifest.d.ts",
12776
12857
  import: "./dist/task-manifest.js"
12858
+ },
12859
+ "./task-subtree-transfer": {
12860
+ types: "./dist/task-subtree-transfer.d.ts",
12861
+ import: "./dist/task-subtree-transfer.js"
12777
12862
  }
12778
12863
  },
12779
12864
  workspaces: [
@@ -12787,8 +12872,8 @@ var package_default = {
12787
12872
  "README.md"
12788
12873
  ],
12789
12874
  scripts: {
12790
- build: "rm -rf dist dashboard/dist && cd dashboard && bun install --frozen-lockfile && bun run build && cd .. && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts src/testing.ts src/project-registration.ts src/task-manifest.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && tsc --emitDeclarationOnly --outDir dist",
12791
- "build:server": "rm -rf dist && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts src/testing.ts src/project-registration.ts src/task-manifest.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*'",
12875
+ build: "rm -rf dist dashboard/dist && cd dashboard && bun install --frozen-lockfile && bun run build && cd .. && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts src/testing.ts src/project-registration.ts src/task-manifest.ts src/task-subtree-transfer.ts --outdir dist --root src --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && tsc --emitDeclarationOnly --outDir dist",
12876
+ "build:server": "rm -rf dist && bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/server/index.ts --outdir dist/server --target bun && bun build src/sdk/index.ts --outdir dist/sdk --target bun --external '@hasna/contracts' --external '@hasna/contracts/*' && bun build src/index.ts src/mcp.ts src/registry.ts src/contracts.ts src/storage.ts src/testing.ts src/project-registration.ts src/task-manifest.ts src/task-subtree-transfer.ts --outdir dist --target bun --external '@hasna/contracts' --external '@hasna/contracts/*'",
12792
12877
  migrate: "bun run src/server/index.ts migrate",
12793
12878
  "backfill:comment-redaction": "bun run src/server/index.ts redact-comments",
12794
12879
  "generate:sdk": "bun run scripts/generate-sdk.ts",
@@ -12803,6 +12888,9 @@ var package_default = {
12803
12888
  "verify:release-review": "bun run scripts/verify-npm-release-agent-review.ts",
12804
12889
  "verify:attested-container-candidate": "bun run scripts/attested-container-candidate.ts verify",
12805
12890
  "test:attested-container-candidate": "bun test scripts/attested-container-candidate.test.ts",
12891
+ "emit:iapp-deployment-compatibility-vector": "bun run scripts/attested-container-compatibility-vector.ts emit",
12892
+ "verify:iapp-deployment-compatibility-vector": "bun run scripts/attested-container-compatibility-vector.ts verify",
12893
+ "test:attested-container-compatibility-vector": "bun test scripts/attested-container-compatibility-vector.test.ts",
12806
12894
  "issue:release-review": "bun run scripts/issue-npm-release-agent-review.ts",
12807
12895
  prepublishOnly: "bun run scripts/verify-public-release.ts --mode=publish",
12808
12896
  postinstall: "mkdir -p $HOME/.hasna/todos $HOME/.hasna/todos/training 2>/dev/null || true"
@@ -12839,7 +12927,7 @@ var package_default = {
12839
12927
  author: "Andrei Hasna <andrei@hasna.com>",
12840
12928
  license: "Apache-2.0",
12841
12929
  dependencies: {
12842
- "@hasna/contracts": "0.5.2",
12930
+ "@hasna/contracts": "0.13.3",
12843
12931
  "@hasna/events": "^0.1.11",
12844
12932
  "@modelcontextprotocol/sdk": "^1.12.1",
12845
12933
  chalk: "^5.4.1",
@@ -13491,6 +13579,7 @@ var TODOS_JSON_CONTRACTS = [
13491
13579
  task_list_id: nullableIdField,
13492
13580
  task_prefix: field(["string", "null"], "Optional task prefix.", true),
13493
13581
  task_counter: field("integer", "Monotonic project task counter."),
13582
+ parent_id: field(["string", "null"], "Optional parent project id; null means top-level.", true),
13494
13583
  created_at: isoDateField,
13495
13584
  updated_at: isoDateField
13496
13585
  },
@@ -16776,6 +16865,7 @@ function createAgentProjectDemoBundle() {
16776
16865
  task_list_id: ids.list,
16777
16866
  task_prefix: "DEMO",
16778
16867
  task_counter: 4,
16868
+ parent_id: null,
16779
16869
  created_at: createdAt,
16780
16870
  updated_at: completedAt
16781
16871
  });
@@ -25023,6 +25113,13 @@ var TODOS_PACKAGE_EXPORTS = [
25023
25113
  types: "./dist/task-manifest.d.ts",
25024
25114
  description: "Transactional package-owned authority for deterministic plan and task graph manifests.",
25025
25115
  stability: "stable"
25116
+ },
25117
+ {
25118
+ subpath: "./task-subtree-transfer",
25119
+ import: "./dist/task-subtree-transfer.js",
25120
+ types: "./dist/task-subtree-transfer.d.ts",
25121
+ description: "Atomic package-owned authority for existing task-subtree project transfers and rollback.",
25122
+ stability: "stable"
25026
25123
  }
25027
25124
  ];
25028
25125
  function source8(version) {
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "packageName": "@hasna/todos",
3
- "packageVersion": "0.15.34",
3
+ "packageVersion": "0.15.41",
4
4
  "repository": "https://github.com/hasna/todos.git",
5
- "gitCommit": "1e6a7cf5727c4e29cc48d4fabad68602a1bdb183",
6
- "gitTree": "2a0facd155af45e5d46ced7ae193643b223ff4e5",
7
- "sourceTreeSha256": "e735d06856448b5f3f5903fa141b5201c768077e6531fb7761ab65b5f54a1b8a",
8
- "generatedAt": "2026-08-15T18:18:40.000Z"
5
+ "gitCommit": "ac5d8ade147fee9eff8ec4ddd674eb784d9c38d7",
6
+ "gitTree": "304d3040aaa58c79859bfd770805c3b7fdcfcfb2",
7
+ "sourceTreeSha256": "62c6a2e0e541c85250c14c6ce44524291578d8acf977f7a0ab34f26203542aaf",
8
+ "generatedAt": "2026-08-22T13:16:30.000Z"
9
9
  }
@@ -10,7 +10,7 @@
10
10
  export { TodosClient, createClient } from "./client.js";
11
11
  export type { TodosClientOptions } from "./client.js";
12
12
  export { TodosV1Client, ApiError as TodosV1ApiError } from "./v1.generated.js";
13
- export type { TodosV1ClientOptions, Task as TodosV1Task, Project as TodosV1Project, TaskManifestBindingLookupRequest as TodosV1TaskManifestBindingLookupRequest, TaskManifestBindingLookupResult as TodosV1TaskManifestBindingLookupResult, TaskManifestBindingLookupResponse as TodosV1TaskManifestBindingLookupResponse, ProjectRegistrationCapability as TodosV1ProjectRegistrationCapability, ProjectRegistrationReceipt as TodosV1ProjectRegistrationReceipt, ProjectRegistrationRequest as TodosV1ProjectRegistrationRequest, ProjectRegistrationLookupRequest as TodosV1ProjectRegistrationLookupRequest, ProjectResource as TodosV1ProjectResource, ProjectResourcePage as TodosV1ProjectResourcePage, TaskComment as TodosV1TaskComment, CreateTaskInput as TodosV1CreateTaskInput, UpdateTaskInput as TodosV1UpdateTaskInput, FailTaskInput as TodosV1FailTaskInput, TaskFailureResult as TodosV1TaskFailureResult, CreateProjectInput as TodosV1CreateProjectInput, ProjectTaskListEnsureApplyInput as TodosV1ProjectTaskListEnsureApplyInput, ProjectTaskListRollbackInput as TodosV1ProjectTaskListRollbackInput, ProjectTaskListEnsureReceipt as TodosV1ProjectTaskListEnsureReceipt, ProjectTaskListEnsureResult as TodosV1ProjectTaskListEnsureResult, ProjectTaskListRollbackResult as TodosV1ProjectTaskListRollbackResult, CreateTaskCommentInput as TodosV1CreateTaskCommentInput, AdmitPrGroupInput as TodosV1AdmitPrGroupInput, RecoverPrGroupInput as TodosV1RecoverPrGroupInput, AppendPrGroupEventInput as TodosV1AppendPrGroupEventInput, PrGroupCiProof as TodosV1PrGroupCiProof, PrGroupCleanupProof as TodosV1PrGroupCleanupProof, PrGroupRecord as TodosV1PrGroupRecord, PrGroupAttemptRecord as TodosV1PrGroupAttemptRecord, PrGroupEventRecord as TodosV1PrGroupEventRecord, PrGroupStateView as TodosV1PrGroupStateView, PrGroupEventPage as TodosV1PrGroupEventPage, PrGroupMutationResult as TodosV1PrGroupMutationResult, } from "./v1.generated.js";
13
+ export type { TodosV1ClientOptions, Task as TodosV1Task, Project as TodosV1Project, TaskManifestBindingLookupRequest as TodosV1TaskManifestBindingLookupRequest, TaskManifestBindingLookupResult as TodosV1TaskManifestBindingLookupResult, TaskManifestBindingLookupResponse as TodosV1TaskManifestBindingLookupResponse, TaskSubtreeTransferExpectedTask as TodosV1TaskSubtreeTransferExpectedTask, TaskSubtreeTransferSharedPlanSplit as TodosV1TaskSubtreeTransferSharedPlanSplit, TaskSubtreeTransferInspectRequest as TodosV1TaskSubtreeTransferInspectRequest, TaskSubtreeTransferInspection as TodosV1TaskSubtreeTransferInspection, TaskSubtreeTransferApplyRequest as TodosV1TaskSubtreeTransferApplyRequest, TaskSubtreeTransferTaskImage as TodosV1TaskSubtreeTransferTaskImage, TaskSubtreeTransferPlanImage as TodosV1TaskSubtreeTransferPlanImage, TaskSubtreeTransferImage as TodosV1TaskSubtreeTransferImage, TaskSubtreeTransferReceipt as TodosV1TaskSubtreeTransferReceipt, TaskSubtreeTransferResult as TodosV1TaskSubtreeTransferResult, TaskSubtreeTransferCapability as TodosV1TaskSubtreeTransferCapability, TaskSubtreeTransferRollbackRequest as TodosV1TaskSubtreeTransferRollbackRequest, TaskSubtreeTransferReadExactRequest as TodosV1TaskSubtreeTransferReadExactRequest, ProjectRegistrationCapability as TodosV1ProjectRegistrationCapability, ProjectRegistrationReceipt as TodosV1ProjectRegistrationReceipt, ProjectRegistrationRequest as TodosV1ProjectRegistrationRequest, ProjectRegistrationLookupRequest as TodosV1ProjectRegistrationLookupRequest, ProjectResource as TodosV1ProjectResource, ProjectResourcePage as TodosV1ProjectResourcePage, TaskComment as TodosV1TaskComment, CreateTaskInput as TodosV1CreateTaskInput, UpdateTaskInput as TodosV1UpdateTaskInput, FailTaskInput as TodosV1FailTaskInput, TaskFailureResult as TodosV1TaskFailureResult, CreateProjectInput as TodosV1CreateProjectInput, ProjectTaskListEnsureApplyInput as TodosV1ProjectTaskListEnsureApplyInput, ProjectTaskListRollbackInput as TodosV1ProjectTaskListRollbackInput, ProjectTaskListEnsureReceipt as TodosV1ProjectTaskListEnsureReceipt, ProjectTaskListEnsureResult as TodosV1ProjectTaskListEnsureResult, ProjectTaskListRollbackResult as TodosV1ProjectTaskListRollbackResult, CreateTaskCommentInput as TodosV1CreateTaskCommentInput, AdmitPrGroupInput as TodosV1AdmitPrGroupInput, RecoverPrGroupInput as TodosV1RecoverPrGroupInput, AppendPrGroupEventInput as TodosV1AppendPrGroupEventInput, PrGroupCiProof as TodosV1PrGroupCiProof, PrGroupCleanupProof as TodosV1PrGroupCleanupProof, PrGroupRecord as TodosV1PrGroupRecord, PrGroupAttemptRecord as TodosV1PrGroupAttemptRecord, PrGroupEventRecord as TodosV1PrGroupEventRecord, PrGroupStateView as TodosV1PrGroupStateView, PrGroupEventPage as TodosV1PrGroupEventPage, PrGroupMutationResult as TodosV1PrGroupMutationResult, } from "./v1.generated.js";
14
14
  export type { AdmitPrGroupInput, AppendPrGroupEventInput, PrGroupAdapterViews, PrGroupAttemptRecord, PrGroupCiProof, PrGroupCleanupProof, PrGroupDecisionEnvelopeAdapter, PrGroupEventListOptions, PrGroupEventPage, PrGroupEventRecord, PrGroupEvidenceRefAdapter, PrGroupMutationResult, PrGroupProofBundleAdapter, PrGroupRecord, PrGroupStateView, PrGroupWorkRunAdapter, RecoverPrGroupInput, } from "../pr-groups/types.js";
15
15
  export { TodosAPIError, TodosNotFoundError, TodosConflictError, TodosUnauthorizedError, TodosRateLimitError, TodosTimeoutError, } from "./types.js";
16
16
  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";
@@ -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;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,gCAAgC,IAAI,uCAAuC,EAC3E,+BAA+B,IAAI,sCAAsC,EACzE,iCAAiC,IAAI,wCAAwC,EAC7E,6BAA6B,IAAI,oCAAoC,EACrE,0BAA0B,IAAI,iCAAiC,EAC/D,0BAA0B,IAAI,iCAAiC,EAC/D,gCAAgC,IAAI,uCAAuC,EAC3E,eAAe,IAAI,sBAAsB,EACzC,mBAAmB,IAAI,0BAA0B,EACjD,WAAW,IAAI,kBAAkB,EACjC,eAAe,IAAI,sBAAsB,EACzC,eAAe,IAAI,sBAAsB,EACzC,aAAa,IAAI,oBAAoB,EACrC,iBAAiB,IAAI,wBAAwB,EAC7C,kBAAkB,IAAI,yBAAyB,EAC/C,+BAA+B,IAAI,sCAAsC,EACzE,4BAA4B,IAAI,mCAAmC,EACnE,4BAA4B,IAAI,mCAAmC,EACnE,2BAA2B,IAAI,kCAAkC,EACjE,6BAA6B,IAAI,oCAAoC,EACrE,sBAAsB,IAAI,6BAA6B,EACvD,iBAAiB,IAAI,wBAAwB,EAC7C,mBAAmB,IAAI,0BAA0B,EACjD,uBAAuB,IAAI,8BAA8B,EACzD,cAAc,IAAI,qBAAqB,EACvC,mBAAmB,IAAI,0BAA0B,EACjD,aAAa,IAAI,oBAAoB,EACrC,oBAAoB,IAAI,2BAA2B,EACnD,kBAAkB,IAAI,yBAAyB,EAC/C,gBAAgB,IAAI,uBAAuB,EAC3C,gBAAgB,IAAI,uBAAuB,EAC3C,qBAAqB,IAAI,4BAA4B,GACtD,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,8BAA8B,EAC9B,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,EAClB,yBAAyB,EACzB,qBAAqB,EACrB,yBAAyB,EACzB,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,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":"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"}
package/dist/sdk/index.js CHANGED
@@ -1082,6 +1082,41 @@ class TodosV1Client {
1082
1082
  init
1083
1083
  });
1084
1084
  }
1085
+ async applyTaskSubtreeTransfer(body, init) {
1086
+ return this.request("POST", `/v1/task-subtree-transfer/apply`, {
1087
+ body,
1088
+ query: undefined,
1089
+ init
1090
+ });
1091
+ }
1092
+ async getTaskSubtreeTransferCapability(init) {
1093
+ return this.request("GET", `/v1/task-subtree-transfer/capability`, {
1094
+ body: undefined,
1095
+ query: undefined,
1096
+ init
1097
+ });
1098
+ }
1099
+ async inspectTaskSubtreeTransfer(body, init) {
1100
+ return this.request("POST", `/v1/task-subtree-transfer/inspect`, {
1101
+ body,
1102
+ query: undefined,
1103
+ init
1104
+ });
1105
+ }
1106
+ async readExactTaskSubtreeTransfer(body, init) {
1107
+ return this.request("POST", `/v1/task-subtree-transfer/read-exact`, {
1108
+ body,
1109
+ query: undefined,
1110
+ init
1111
+ });
1112
+ }
1113
+ async rollbackTaskSubtreeTransfer(body, init) {
1114
+ return this.request("POST", `/v1/task-subtree-transfer/rollback`, {
1115
+ body,
1116
+ query: undefined,
1117
+ init
1118
+ });
1119
+ }
1085
1120
  async listTasks(query, init) {
1086
1121
  return this.request("GET", `/v1/tasks`, {
1087
1122
  body: undefined,