@hasna/todos 0.11.93 → 0.11.95
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.
- package/dist/cli/cloud-router.d.ts +12 -1
- package/dist/cli/cloud-router.d.ts.map +1 -1
- package/dist/cli/commands/plan-template-commands.d.ts.map +1 -1
- package/dist/cli/commands/task-commands.d.ts.map +1 -1
- package/dist/cli/index.js +885 -76
- package/dist/contracts.js +56 -50
- package/dist/db/storage-tombstones.d.ts +1 -1
- package/dist/db/storage-tombstones.d.ts.map +1 -1
- package/dist/db/templates.d.ts.map +1 -1
- package/dist/index.js +170 -56
- package/dist/lib/template-semantics.d.ts +8 -0
- package/dist/lib/template-semantics.d.ts.map +1 -0
- package/dist/mcp/index.js +605 -61
- package/dist/mcp/tools/task-crud.d.ts.map +1 -1
- package/dist/mcp/tools/task-meta-tools.d.ts.map +1 -1
- package/dist/mcp/tools/task-project-tools.d.ts.map +1 -1
- package/dist/mcp.js +1 -1
- package/dist/registry.js +56 -50
- package/dist/release-provenance.json +5 -5
- package/dist/sdk/index.js +35 -0
- package/dist/sdk/v1.generated.d.ts +105 -1
- package/dist/sdk/v1.generated.d.ts.map +1 -1
- package/dist/server/index.js +611 -67
- package/dist/server/openapi.d.ts +496 -0
- package/dist/server/openapi.d.ts.map +1 -1
- package/dist/server/v1.d.ts.map +1 -1
- package/dist/storage/interfaces.d.ts +3 -2
- package/dist/storage/interfaces.d.ts.map +1 -1
- package/dist/storage/postgres-adapter.d.ts.map +1 -1
- package/dist/storage/postgres-sync.d.ts +1 -1
- package/dist/storage/postgres-sync.d.ts.map +1 -1
- package/dist/storage/shadow-outbox.d.ts.map +1 -1
- package/dist/storage/shadow.d.ts +1 -1
- package/dist/storage/shadow.d.ts.map +1 -1
- package/dist/storage/sqlite-snapshot.d.ts.map +1 -1
- package/dist/storage.js +169 -55
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-sync.d.ts","sourceRoot":"","sources":["../../src/storage/postgres-sync.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"postgres-sync.d.ts","sourceRoot":"","sources":["../../src/storage/postgres-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shadow-outbox.d.ts","sourceRoot":"","sources":["../../src/storage/shadow-outbox.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"shadow-outbox.d.ts","sourceRoot":"","sources":["../../src/storage/shadow-outbox.ts"],"names":[],"mappings":"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"}
|
package/dist/storage/shadow.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ import type { TodosStorageAdapter, TodosStorageContext } from "./interfaces.js";
|
|
|
8
8
|
* shadow phase (documented gap; validated data is tasks/projects/plans/agents/
|
|
9
9
|
* task-lists/templates and audit history).
|
|
10
10
|
*/
|
|
11
|
-
type ShadowSnapshotKey = "tasks" | "projects" | "plans" | "agents" | "taskLists" | "templates" | "auditHistory";
|
|
11
|
+
type ShadowSnapshotKey = "tasks" | "projects" | "plans" | "agents" | "taskLists" | "templates" | "templateTasks" | "auditHistory";
|
|
12
12
|
export interface TodosShadowMirrorMetrics {
|
|
13
13
|
enabled: true;
|
|
14
14
|
/** Ops accepted into the mirror queue (one per successful local write). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shadow.d.ts","sourceRoot":"","sources":["../../src/storage/shadow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,YAAY,EACb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,2CAA2C,EACjD,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EACjC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EAGpB,MAAM,iBAAiB,CAAC;AAEzB;;;;;GAKG;AACH,KAAK,iBAAiB,GAClB,OAAO,GACP,UAAU,GACV,OAAO,GACP,QAAQ,GACR,WAAW,GACX,WAAW,GACX,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"shadow.d.ts","sourceRoot":"","sources":["../../src/storage/shadow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-snapshot.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAgB7D,OAAO,KAAK,EACV,wBAAwB,EACxB,oBAAoB,EAGrB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite-snapshot.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAgB7D,OAAO,KAAK,EACV,wBAAwB,EACxB,oBAAoB,EAGrB,MAAM,iBAAiB,CAAC;AA4DzB,wBAAgB,gCAAgC,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,oBAAoB,CAgBpF;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,oBAAoB,EAC9B,EAAE,CAAC,EAAE,QAAQ,GACZ,wBAAwB,CAyE1B"}
|
package/dist/storage.js
CHANGED
|
@@ -6483,6 +6483,50 @@ var init_recurrence = __esm(() => {
|
|
|
6483
6483
|
};
|
|
6484
6484
|
});
|
|
6485
6485
|
|
|
6486
|
+
// src/lib/template-semantics.ts
|
|
6487
|
+
function resolveTemplateVariables(templateVars, provided) {
|
|
6488
|
+
const merged = { ...provided };
|
|
6489
|
+
for (const variable of templateVars) {
|
|
6490
|
+
if (merged[variable.name] === undefined && variable.default !== undefined) {
|
|
6491
|
+
merged[variable.name] = variable.default;
|
|
6492
|
+
}
|
|
6493
|
+
}
|
|
6494
|
+
const missing = templateVars.filter((variable) => variable.required && merged[variable.name] === undefined).map((variable) => variable.name);
|
|
6495
|
+
if (missing.length > 0) {
|
|
6496
|
+
throw new Error(`Missing required template variable(s): ${missing.join(", ")}`);
|
|
6497
|
+
}
|
|
6498
|
+
return merged;
|
|
6499
|
+
}
|
|
6500
|
+
function substituteTemplateVariables(text, variables) {
|
|
6501
|
+
let result = text;
|
|
6502
|
+
for (const [key, value] of Object.entries(variables)) {
|
|
6503
|
+
result = result.replace(new RegExp(`\\{${key}\\}`, "g"), value);
|
|
6504
|
+
}
|
|
6505
|
+
return result;
|
|
6506
|
+
}
|
|
6507
|
+
function evaluateTemplateCondition(condition, variables) {
|
|
6508
|
+
if (!condition || condition.trim() === "")
|
|
6509
|
+
return true;
|
|
6510
|
+
const trimmed = condition.trim();
|
|
6511
|
+
const equal = trimmed.match(/^\{([^}]+)\}\s*==\s*(.+)$/);
|
|
6512
|
+
if (equal)
|
|
6513
|
+
return (variables[equal[1]] ?? "") === equal[2].trim();
|
|
6514
|
+
const unequal = trimmed.match(/^\{([^}]+)\}\s*!=\s*(.+)$/);
|
|
6515
|
+
if (unequal)
|
|
6516
|
+
return (variables[unequal[1]] ?? "") !== unequal[2].trim();
|
|
6517
|
+
const falsy = trimmed.match(/^!\{([^}]+)\}$/);
|
|
6518
|
+
if (falsy) {
|
|
6519
|
+
const value = variables[falsy[1]];
|
|
6520
|
+
return !value || value === "" || value === "false";
|
|
6521
|
+
}
|
|
6522
|
+
const truthy = trimmed.match(/^\{([^}]+)\}$/);
|
|
6523
|
+
if (truthy) {
|
|
6524
|
+
const value = variables[truthy[1]];
|
|
6525
|
+
return !!value && value !== "" && value !== "false";
|
|
6526
|
+
}
|
|
6527
|
+
return true;
|
|
6528
|
+
}
|
|
6529
|
+
|
|
6486
6530
|
// src/db/templates.ts
|
|
6487
6531
|
function rowToTemplate(row) {
|
|
6488
6532
|
return {
|
|
@@ -6558,6 +6602,14 @@ function deleteTemplate(id, db) {
|
|
|
6558
6602
|
payload: template,
|
|
6559
6603
|
version: template.version
|
|
6560
6604
|
}, d);
|
|
6605
|
+
for (const task of getTemplateTasks(resolved, d)) {
|
|
6606
|
+
recordStorageTombstone({
|
|
6607
|
+
object_type: "template_tasks",
|
|
6608
|
+
object_id: task.id,
|
|
6609
|
+
payload: task,
|
|
6610
|
+
version: 1
|
|
6611
|
+
}, d);
|
|
6612
|
+
}
|
|
6561
6613
|
return d.run("DELETE FROM task_templates WHERE id = ?", [resolved]).changes > 0;
|
|
6562
6614
|
}
|
|
6563
6615
|
function updateTemplate(id, updates, db) {
|
|
@@ -6689,34 +6741,7 @@ function getTemplateTasks(templateId, db) {
|
|
|
6689
6741
|
return rows.map(rowToTemplateTask);
|
|
6690
6742
|
}
|
|
6691
6743
|
function evaluateCondition(condition, variables) {
|
|
6692
|
-
|
|
6693
|
-
return true;
|
|
6694
|
-
const trimmed = condition.trim();
|
|
6695
|
-
const eqMatch = trimmed.match(/^\{([^}]+)\}\s*==\s*(.+)$/);
|
|
6696
|
-
if (eqMatch) {
|
|
6697
|
-
const varName = eqMatch[1];
|
|
6698
|
-
const expected = eqMatch[2].trim();
|
|
6699
|
-
return (variables[varName] ?? "") === expected;
|
|
6700
|
-
}
|
|
6701
|
-
const neqMatch = trimmed.match(/^\{([^}]+)\}\s*!=\s*(.+)$/);
|
|
6702
|
-
if (neqMatch) {
|
|
6703
|
-
const varName = neqMatch[1];
|
|
6704
|
-
const expected = neqMatch[2].trim();
|
|
6705
|
-
return (variables[varName] ?? "") !== expected;
|
|
6706
|
-
}
|
|
6707
|
-
const falsyMatch = trimmed.match(/^!\{([^}]+)\}$/);
|
|
6708
|
-
if (falsyMatch) {
|
|
6709
|
-
const varName = falsyMatch[1];
|
|
6710
|
-
const val = variables[varName];
|
|
6711
|
-
return !val || val === "" || val === "false";
|
|
6712
|
-
}
|
|
6713
|
-
const truthyMatch = trimmed.match(/^\{([^}]+)\}$/);
|
|
6714
|
-
if (truthyMatch) {
|
|
6715
|
-
const varName = truthyMatch[1];
|
|
6716
|
-
const val = variables[varName];
|
|
6717
|
-
return !!val && val !== "" && val !== "false";
|
|
6718
|
-
}
|
|
6719
|
-
return true;
|
|
6744
|
+
return evaluateTemplateCondition(condition, variables);
|
|
6720
6745
|
}
|
|
6721
6746
|
function exportTemplate(id, db) {
|
|
6722
6747
|
const d = db || getDatabase();
|
|
@@ -6789,29 +6814,10 @@ function listTemplateVersions(id, db) {
|
|
|
6789
6814
|
return d.query("SELECT * FROM template_versions WHERE template_id = ? ORDER BY version DESC").all(resolved);
|
|
6790
6815
|
}
|
|
6791
6816
|
function resolveVariables(templateVars, provided) {
|
|
6792
|
-
|
|
6793
|
-
for (const v of templateVars) {
|
|
6794
|
-
if (merged[v.name] === undefined && v.default !== undefined) {
|
|
6795
|
-
merged[v.name] = v.default;
|
|
6796
|
-
}
|
|
6797
|
-
}
|
|
6798
|
-
const missing = [];
|
|
6799
|
-
for (const v of templateVars) {
|
|
6800
|
-
if (v.required && merged[v.name] === undefined) {
|
|
6801
|
-
missing.push(v.name);
|
|
6802
|
-
}
|
|
6803
|
-
}
|
|
6804
|
-
if (missing.length > 0) {
|
|
6805
|
-
throw new Error(`Missing required template variable(s): ${missing.join(", ")}`);
|
|
6806
|
-
}
|
|
6807
|
-
return merged;
|
|
6817
|
+
return resolveTemplateVariables(templateVars, provided);
|
|
6808
6818
|
}
|
|
6809
6819
|
function substituteVars(text, variables) {
|
|
6810
|
-
|
|
6811
|
-
for (const [key, val] of Object.entries(variables)) {
|
|
6812
|
-
result = result.replace(new RegExp(`\\{${key}\\}`, "g"), val);
|
|
6813
|
-
}
|
|
6814
|
-
return result;
|
|
6820
|
+
return substituteTemplateVariables(text, variables);
|
|
6815
6821
|
}
|
|
6816
6822
|
function tasksFromTemplate(templateId, projectId, variables, taskListId, db, _visitedTemplateIds) {
|
|
6817
6823
|
const d = db || getDatabase();
|
|
@@ -11499,6 +11505,21 @@ var TEMPLATE_COLUMNS = [
|
|
|
11499
11505
|
"machine_id",
|
|
11500
11506
|
"synced_at"
|
|
11501
11507
|
];
|
|
11508
|
+
var TEMPLATE_TASK_COLUMNS = [
|
|
11509
|
+
"id",
|
|
11510
|
+
"template_id",
|
|
11511
|
+
"position",
|
|
11512
|
+
"title_pattern",
|
|
11513
|
+
"description",
|
|
11514
|
+
"priority",
|
|
11515
|
+
"tags",
|
|
11516
|
+
"task_type",
|
|
11517
|
+
"condition",
|
|
11518
|
+
"include_template_id",
|
|
11519
|
+
"depends_on_positions",
|
|
11520
|
+
"metadata",
|
|
11521
|
+
"created_at"
|
|
11522
|
+
];
|
|
11502
11523
|
var TASK_COLUMNS = [
|
|
11503
11524
|
"id",
|
|
11504
11525
|
"short_id",
|
|
@@ -11567,7 +11588,7 @@ var AUDIT_COLUMNS = [
|
|
|
11567
11588
|
"created_at",
|
|
11568
11589
|
"machine_id"
|
|
11569
11590
|
];
|
|
11570
|
-
var JSON_COLUMNS = new Set(["tags", "metadata", "permissions", "capabilities", "variables"]);
|
|
11591
|
+
var JSON_COLUMNS = new Set(["tags", "metadata", "permissions", "capabilities", "variables", "depends_on_positions"]);
|
|
11571
11592
|
var BOOLEAN_COLUMNS = new Set(["requires_approval"]);
|
|
11572
11593
|
function exportSqliteTodosStorageSnapshot(db) {
|
|
11573
11594
|
const d = db ?? getDatabase();
|
|
@@ -11581,6 +11602,7 @@ function exportSqliteTodosStorageSnapshot(db) {
|
|
|
11581
11602
|
agents: listAgents({ include_archived: true }, d),
|
|
11582
11603
|
taskLists: listTaskLists(undefined, d),
|
|
11583
11604
|
templates: listTemplates(d),
|
|
11605
|
+
templateTasks: listTemplates(d).flatMap((template) => getTemplateTasks(template.id, d)),
|
|
11584
11606
|
auditHistory: getRecentActivity(Number.MAX_SAFE_INTEGER, d),
|
|
11585
11607
|
tombstones: listStorageTombstones(d)
|
|
11586
11608
|
};
|
|
@@ -11630,6 +11652,7 @@ function importSqliteTodosStorageSnapshot(snapshot, db) {
|
|
|
11630
11652
|
applyRows("task_lists", "task_lists", TASK_LIST_COLUMNS, snapshot.taskLists, "updated_at");
|
|
11631
11653
|
applyRows("plans", "plans", PLAN_COLUMNS, snapshot.plans, "updated_at");
|
|
11632
11654
|
applyRows("templates", "task_templates", TEMPLATE_COLUMNS, snapshot.templates);
|
|
11655
|
+
applyRows("template_tasks", "template_tasks", TEMPLATE_TASK_COLUMNS, snapshot.templateTasks ?? []);
|
|
11633
11656
|
applyRows("tasks", "tasks", TASK_COLUMNS, sortedTasks(snapshot.tasks), "updated_at", (row, changed) => {
|
|
11634
11657
|
if (changed && Array.isArray(row["tags"]) && typeof row["id"] === "string") {
|
|
11635
11658
|
replaceTaskTags(row["id"], row["tags"].filter((tag) => typeof tag === "string"), d);
|
|
@@ -11734,6 +11757,8 @@ function tableForTombstone(objectType) {
|
|
|
11734
11757
|
return "task_lists";
|
|
11735
11758
|
if (objectType === "templates")
|
|
11736
11759
|
return "task_templates";
|
|
11760
|
+
if (objectType === "template_tasks")
|
|
11761
|
+
return "template_tasks";
|
|
11737
11762
|
return "task_history";
|
|
11738
11763
|
}
|
|
11739
11764
|
function listRows(db, table, columns) {
|
|
@@ -12152,6 +12177,7 @@ function snapshotEntries(snapshot) {
|
|
|
12152
12177
|
...snapshot.agents.map((payload) => entry("agents", payload, snapshot.exportedAt)),
|
|
12153
12178
|
...snapshot.taskLists.map((payload) => entry("task_lists", payload, snapshot.exportedAt)),
|
|
12154
12179
|
...snapshot.templates.map((payload) => entry("templates", payload, snapshot.exportedAt)),
|
|
12180
|
+
...(snapshot.templateTasks ?? []).map((payload) => entry("template_tasks", payload, snapshot.exportedAt)),
|
|
12155
12181
|
...snapshot.auditHistory.map((payload) => entry("audit_history", payload, snapshot.exportedAt)),
|
|
12156
12182
|
...(snapshot.tombstones ?? []).map((tombstone) => ({
|
|
12157
12183
|
type: tombstone.object_type,
|
|
@@ -12203,6 +12229,7 @@ function rowsToSnapshot(rows) {
|
|
|
12203
12229
|
agents: [],
|
|
12204
12230
|
taskLists: [],
|
|
12205
12231
|
templates: [],
|
|
12232
|
+
templateTasks: [],
|
|
12206
12233
|
auditHistory: [],
|
|
12207
12234
|
tombstones: []
|
|
12208
12235
|
};
|
|
@@ -12237,6 +12264,8 @@ function rowsToSnapshot(rows) {
|
|
|
12237
12264
|
snapshot.taskLists.push(payload);
|
|
12238
12265
|
else if (row.object_type === "templates")
|
|
12239
12266
|
snapshot.templates.push(payload);
|
|
12267
|
+
else if (row.object_type === "template_tasks")
|
|
12268
|
+
snapshot.templateTasks.push(payload);
|
|
12240
12269
|
else if (row.object_type === "audit_history")
|
|
12241
12270
|
snapshot.auditHistory.push(payload);
|
|
12242
12271
|
}
|
|
@@ -12399,10 +12428,13 @@ function createPostgresTodosStorageAdapter(options) {
|
|
|
12399
12428
|
get: (id) => store.get("templates", id),
|
|
12400
12429
|
list: async () => (await store.list("templates")).sort((a, b) => a.name.localeCompare(b.name)),
|
|
12401
12430
|
update: (id, input) => updateTemplate2(id, input, store),
|
|
12402
|
-
delete: (id, context) =>
|
|
12431
|
+
delete: (id, context) => deleteTemplate2(id, store, context),
|
|
12403
12432
|
getWithTasks: async (id) => {
|
|
12404
12433
|
const template = await store.get("templates", id);
|
|
12405
|
-
|
|
12434
|
+
if (!template)
|
|
12435
|
+
return null;
|
|
12436
|
+
const tasks = (await store.list("template_tasks")).filter((task) => task.template_id === id).sort((left, right) => left.position - right.position || left.id.localeCompare(right.id));
|
|
12437
|
+
return { ...template, tasks };
|
|
12406
12438
|
}
|
|
12407
12439
|
},
|
|
12408
12440
|
audit: {
|
|
@@ -12690,6 +12722,57 @@ class PostgresJsonRecordStore {
|
|
|
12690
12722
|
}
|
|
12691
12723
|
return value;
|
|
12692
12724
|
}
|
|
12725
|
+
async createTemplateWithTasks(template, tasks, context = {}) {
|
|
12726
|
+
await this.ensureSchema();
|
|
12727
|
+
const records = [
|
|
12728
|
+
{ object_type: "templates", object_id: template.id, payload: template, updated_at: template.created_at, version: template.version },
|
|
12729
|
+
...tasks.map((task) => ({ object_type: "template_tasks", object_id: task.id, payload: task, updated_at: task.created_at, version: 1 }))
|
|
12730
|
+
];
|
|
12731
|
+
const result = await this.options.client.query(`/* todos:create-template-with-tasks-atomic */ WITH input AS (
|
|
12732
|
+
SELECT value->>'object_type' AS object_type,
|
|
12733
|
+
value->>'object_id' AS object_id,
|
|
12734
|
+
value->'payload' AS payload,
|
|
12735
|
+
value->>'updated_at' AS updated_at,
|
|
12736
|
+
COALESCE((value->>'version')::integer, 1) AS version
|
|
12737
|
+
FROM jsonb_array_elements($2::jsonb) AS value
|
|
12738
|
+
) INSERT INTO ${this.tableName} (
|
|
12739
|
+
service, object_type, object_id, payload, updated_at,
|
|
12740
|
+
deleted_at, source_machine_id, version
|
|
12741
|
+
) SELECT $1, object_type, object_id, payload, updated_at::timestamptz,
|
|
12742
|
+
NULL, $3, version
|
|
12743
|
+
FROM input
|
|
12744
|
+
ON CONFLICT (service, object_type, object_id) DO UPDATE SET
|
|
12745
|
+
payload = EXCLUDED.payload,
|
|
12746
|
+
updated_at = EXCLUDED.updated_at,
|
|
12747
|
+
deleted_at = NULL,
|
|
12748
|
+
source_machine_id = EXCLUDED.source_machine_id,
|
|
12749
|
+
version = EXCLUDED.version
|
|
12750
|
+
WHERE ${this.tableName}.updated_at IS NULL
|
|
12751
|
+
OR ${this.tableName}.updated_at < EXCLUDED.updated_at
|
|
12752
|
+
OR (${this.tableName}.updated_at = EXCLUDED.updated_at
|
|
12753
|
+
AND COALESCE(${this.tableName}.version, 0) <= COALESCE(EXCLUDED.version, 0))
|
|
12754
|
+
RETURNING object_type, object_id`, [this.service, jsonbParam(records), this.machineId(context)]);
|
|
12755
|
+
if (result.rows.length !== records.length) {
|
|
12756
|
+
throw new Error("Template checklist write was rejected before completion; no partial template was committed");
|
|
12757
|
+
}
|
|
12758
|
+
}
|
|
12759
|
+
async deleteTemplateWithTasks(id, context = {}) {
|
|
12760
|
+
await this.ensureSchema();
|
|
12761
|
+
const timestamp = new Date().toISOString();
|
|
12762
|
+
const result = await this.options.client.query(`/* todos:delete-template-with-tasks-atomic */ WITH target AS (
|
|
12763
|
+
SELECT 1 FROM ${this.tableName}
|
|
12764
|
+
WHERE service = $1 AND object_type = 'templates' AND object_id = $2 AND deleted_at IS NULL
|
|
12765
|
+
) UPDATE ${this.tableName} AS record SET
|
|
12766
|
+
deleted_at = $3::timestamptz,
|
|
12767
|
+
updated_at = $3::timestamptz,
|
|
12768
|
+
source_machine_id = COALESCE($4, record.source_machine_id),
|
|
12769
|
+
version = COALESCE(record.version, 0) + 1
|
|
12770
|
+
WHERE record.service = $1 AND record.deleted_at IS NULL AND EXISTS (SELECT 1 FROM target)
|
|
12771
|
+
AND (record.object_type = 'templates' AND record.object_id = $2
|
|
12772
|
+
OR record.object_type = 'template_tasks' AND record.payload->>'template_id' = $2)
|
|
12773
|
+
RETURNING record.object_type`, [this.service, id, timestamp, this.machineId(context)]);
|
|
12774
|
+
return result.rows.some((row) => row.object_type === "templates");
|
|
12775
|
+
}
|
|
12693
12776
|
async completeTask(id, agentId, options) {
|
|
12694
12777
|
await this.ensureSchema();
|
|
12695
12778
|
const operationTimestamp = new Date().toISOString();
|
|
@@ -13030,7 +13113,7 @@ async function updateTask2(id, input, store) {
|
|
|
13030
13113
|
tags: input.tags ?? existing.tags,
|
|
13031
13114
|
metadata: input.metadata ?? existing.metadata,
|
|
13032
13115
|
requires_approval: input.requires_approval ?? existing.requires_approval,
|
|
13033
|
-
task_list_id: input.task_list_id
|
|
13116
|
+
task_list_id: input.task_list_id !== undefined ? input.task_list_id : existing.task_list_id
|
|
13034
13117
|
};
|
|
13035
13118
|
await store.upsert("tasks", task);
|
|
13036
13119
|
return task;
|
|
@@ -13454,7 +13537,7 @@ async function updateTaskList2(id, input, store) {
|
|
|
13454
13537
|
}
|
|
13455
13538
|
async function createTemplate2(input, store, context) {
|
|
13456
13539
|
const timestamp = new Date().toISOString();
|
|
13457
|
-
|
|
13540
|
+
const template = {
|
|
13458
13541
|
id: randomUUID3(),
|
|
13459
13542
|
name: input.name,
|
|
13460
13543
|
title_pattern: input.title_pattern,
|
|
@@ -13469,7 +13552,30 @@ async function createTemplate2(input, store, context) {
|
|
|
13469
13552
|
created_at: timestamp,
|
|
13470
13553
|
machine_id: store.machineId(context),
|
|
13471
13554
|
synced_at: null
|
|
13472
|
-
}
|
|
13555
|
+
};
|
|
13556
|
+
const tasks = buildTemplateTasks(template.id, input.tasks ?? [], timestamp);
|
|
13557
|
+
await store.createTemplateWithTasks(template, tasks, context);
|
|
13558
|
+
return template;
|
|
13559
|
+
}
|
|
13560
|
+
function buildTemplateTasks(templateId, inputs, timestamp) {
|
|
13561
|
+
return inputs.map((input, position) => ({
|
|
13562
|
+
id: randomUUID3(),
|
|
13563
|
+
template_id: templateId,
|
|
13564
|
+
position,
|
|
13565
|
+
title_pattern: input.title_pattern,
|
|
13566
|
+
description: input.description ?? null,
|
|
13567
|
+
priority: input.priority ?? "medium",
|
|
13568
|
+
tags: input.tags ?? [],
|
|
13569
|
+
task_type: input.task_type ?? null,
|
|
13570
|
+
condition: input.condition ?? null,
|
|
13571
|
+
include_template_id: input.include_template_id ?? null,
|
|
13572
|
+
depends_on_positions: input.depends_on ?? [],
|
|
13573
|
+
metadata: input.metadata ?? {},
|
|
13574
|
+
created_at: timestamp
|
|
13575
|
+
}));
|
|
13576
|
+
}
|
|
13577
|
+
async function deleteTemplate2(id, store, context) {
|
|
13578
|
+
return store.deleteTemplateWithTasks(id, context);
|
|
13473
13579
|
}
|
|
13474
13580
|
async function updateTemplate2(id, input, store) {
|
|
13475
13581
|
const template = await store.get("templates", id);
|
|
@@ -13525,6 +13631,7 @@ async function exportSnapshot(store) {
|
|
|
13525
13631
|
agents: await store.list("agents"),
|
|
13526
13632
|
taskLists: await store.list("task_lists"),
|
|
13527
13633
|
templates: await store.list("templates"),
|
|
13634
|
+
templateTasks: await store.list("template_tasks"),
|
|
13528
13635
|
auditHistory: await store.list("audit_history"),
|
|
13529
13636
|
tombstones: await store.listTombstones()
|
|
13530
13637
|
};
|
|
@@ -13549,6 +13656,7 @@ async function importSnapshot(snapshot, store, context) {
|
|
|
13549
13656
|
...snapshot.agents.map((row) => ["agents", row]),
|
|
13550
13657
|
...snapshot.taskLists.map((row) => ["task_lists", row]),
|
|
13551
13658
|
...snapshot.templates.map((row) => ["templates", row]),
|
|
13659
|
+
...(snapshot.templateTasks ?? []).map((row) => ["template_tasks", row]),
|
|
13552
13660
|
...snapshot.auditHistory.map((row) => ["audit_history", row])
|
|
13553
13661
|
];
|
|
13554
13662
|
for (const [type, row] of entries) {
|
|
@@ -13694,6 +13802,7 @@ var SNAPSHOT_TO_OBJECT_TYPE = {
|
|
|
13694
13802
|
agents: "agents",
|
|
13695
13803
|
taskLists: "task_lists",
|
|
13696
13804
|
templates: "templates",
|
|
13805
|
+
templateTasks: "template_tasks",
|
|
13697
13806
|
auditHistory: "audit_history"
|
|
13698
13807
|
};
|
|
13699
13808
|
|
|
@@ -13885,6 +13994,7 @@ function emptySnapshot() {
|
|
|
13885
13994
|
agents: [],
|
|
13886
13995
|
taskLists: [],
|
|
13887
13996
|
templates: [],
|
|
13997
|
+
templateTasks: [],
|
|
13888
13998
|
auditHistory: [],
|
|
13889
13999
|
tombstones: []
|
|
13890
14000
|
};
|
|
@@ -14341,6 +14451,9 @@ class TodosShadowOutbox {
|
|
|
14341
14451
|
case "templates":
|
|
14342
14452
|
snapshot.templates.push(record);
|
|
14343
14453
|
break;
|
|
14454
|
+
case "template_tasks":
|
|
14455
|
+
snapshot.templateTasks.push(record);
|
|
14456
|
+
break;
|
|
14344
14457
|
case "audit_history":
|
|
14345
14458
|
snapshot.auditHistory.push(record);
|
|
14346
14459
|
break;
|
|
@@ -14407,6 +14520,7 @@ function emptySnapshot2() {
|
|
|
14407
14520
|
agents: [],
|
|
14408
14521
|
taskLists: [],
|
|
14409
14522
|
templates: [],
|
|
14523
|
+
templateTasks: [],
|
|
14410
14524
|
auditHistory: [],
|
|
14411
14525
|
tombstones: []
|
|
14412
14526
|
};
|