@hasna/todos 0.15.20 → 0.15.24

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 (40) hide show
  1. package/dist/ai-tools.d.ts +80 -0
  2. package/dist/ai-tools.d.ts.map +1 -0
  3. package/dist/ai.d.ts +313 -0
  4. package/dist/ai.d.ts.map +1 -0
  5. package/dist/cli/cloud-router.d.ts +10 -1
  6. package/dist/cli/cloud-router.d.ts.map +1 -1
  7. package/dist/cli/commands/ai-commands.d.ts +3 -0
  8. package/dist/cli/commands/ai-commands.d.ts.map +1 -0
  9. package/dist/cli/commands/help-commands.d.ts +2 -1
  10. package/dist/cli/commands/help-commands.d.ts.map +1 -1
  11. package/dist/cli/commands/task-commands.d.ts.map +1 -1
  12. package/dist/cli/index.js +2856 -547
  13. package/dist/cli/stage-a.d.ts +27 -16
  14. package/dist/cli/stage-a.d.ts.map +1 -1
  15. package/dist/contracts.d.ts +1 -0
  16. package/dist/contracts.d.ts.map +1 -1
  17. package/dist/contracts.js +638 -18
  18. package/dist/index.d.ts +3 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +3142 -1089
  21. package/dist/lib/cli-help.d.ts +2 -2
  22. package/dist/lib/config.d.ts +4 -0
  23. package/dist/lib/config.d.ts.map +1 -1
  24. package/dist/lib/saved-search-views.d.ts.map +1 -1
  25. package/dist/lib/stale-lock-handoff.d.ts.map +1 -1
  26. package/dist/mcp/index.js +127 -72
  27. package/dist/mcp.js +1 -1
  28. package/dist/project-registration.js +67 -29
  29. package/dist/registry.js +603 -18
  30. package/dist/release-provenance.json +5 -5
  31. package/dist/sdk/index.js +1 -1
  32. package/dist/sdk/v1.generated.d.ts +2 -0
  33. package/dist/sdk/v1.generated.d.ts.map +1 -1
  34. package/dist/server/index.js +133 -78
  35. package/dist/server/openapi.d.ts +7 -0
  36. package/dist/server/openapi.d.ts.map +1 -1
  37. package/dist/storage/postgres-adapter.d.ts.map +1 -1
  38. package/dist/storage.js +60 -20
  39. package/dist/task-manifest.js +19 -3
  40. package/package.json +1 -1
@@ -70,7 +70,7 @@ var package_default;
70
70
  var init_package = __esm(() => {
71
71
  package_default = {
72
72
  name: "@hasna/todos",
73
- version: "0.15.20",
73
+ version: "0.15.24",
74
74
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
75
75
  type: "module",
76
76
  main: "dist/index.js",
@@ -1209,7 +1209,7 @@ var init_plan_project_link_contract = __esm(() => {
1209
1209
  });
1210
1210
 
1211
1211
  // src/lib/config.ts
1212
- import { existsSync as existsSync3 } from "fs";
1212
+ import { existsSync as existsSync3, readFileSync as readFileSync2 } from "fs";
1213
1213
  import { dirname, join as join3 } from "path";
1214
1214
  function getConfigPath() {
1215
1215
  return join3(getTodosGlobalDir(), "config.json");
@@ -1586,7 +1586,7 @@ function requireCanonicalLockVersion(value) {
1586
1586
  throw new StaleLockHandoffError("STALE_LOCK_HANDOFF_INVALID_INPUT", "expected_lock_version must be the exact canonical locked_at timestamp (YYYY-MM-DDTHH:mm:ss.sssZ)", { field: "expected_lock_version" });
1587
1587
  }
1588
1588
  const parsed = Date.parse(value);
1589
- if (Number.isNaN(parsed) || new Date(parsed).toISOString() !== value) {
1589
+ if (value.startsWith("0000-") || Number.isNaN(parsed) || new Date(parsed).toISOString() !== value) {
1590
1590
  throw new StaleLockHandoffError("STALE_LOCK_HANDOFF_INVALID_INPUT", "expected_lock_version must name a real canonical UTC instant", { field: "expected_lock_version" });
1591
1591
  }
1592
1592
  return value;
@@ -1611,9 +1611,6 @@ function prepareStaleLockHandoff(input, options = {}) {
1611
1611
  if (canonicalAgentRef(actor) !== canonicalAgentRef(newHolder)) {
1612
1612
  throw new StaleLockHandoffError("STALE_LOCK_HANDOFF_ACTOR_MISMATCH", "new_holder must match the authenticated actor", { actor, new_holder: newHolder });
1613
1613
  }
1614
- if (canonicalAgentRef(expectedHolder) === canonicalAgentRef(newHolder)) {
1615
- throw new StaleLockHandoffError("STALE_LOCK_HANDOFF_INVALID_INPUT", "new_holder must differ from expected_holder", { field: "new_holder" });
1616
- }
1617
1614
  const operationTimestamp = options.now ?? new Date().toISOString();
1618
1615
  if (!CANONICAL_LOCK_VERSION_RE.test(operationTimestamp) || new Date(Date.parse(operationTimestamp)).toISOString() !== operationTimestamp) {
1619
1616
  throw new StaleLockHandoffError("STALE_LOCK_HANDOFF_INVALID_INPUT", "operation timestamp must be a canonical UTC instant");
@@ -2421,6 +2418,31 @@ var init_audit_history_import = __esm(() => {
2421
2418
  ];
2422
2419
  });
2423
2420
 
2421
+ // src/task-manifest/canonical.ts
2422
+ import { createHash as createHash3 } from "crypto";
2423
+ function canonicalize(value) {
2424
+ if (Array.isArray(value))
2425
+ return value.map(canonicalize);
2426
+ if (value !== null && typeof value === "object") {
2427
+ return Object.fromEntries(Object.entries(value).filter(([, entry2]) => entry2 !== undefined).sort(([left], [right]) => left.localeCompare(right)).map(([key, entry2]) => [key, canonicalize(entry2)]));
2428
+ }
2429
+ return value;
2430
+ }
2431
+ function canonicalJson(value) {
2432
+ return JSON.stringify(canonicalize(value));
2433
+ }
2434
+ function canonicalDigest(value) {
2435
+ return createHash3("sha256").update(canonicalJson(value)).digest("hex");
2436
+ }
2437
+ function deterministicUuid(namespace, ...parts) {
2438
+ const bytes = createHash3("sha256").update([namespace, ...parts].join("\x1F")).digest().subarray(0, 16);
2439
+ bytes[6] = bytes[6] & 15 | 80;
2440
+ bytes[8] = bytes[8] & 63 | 128;
2441
+ const hex = bytes.toString("hex");
2442
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
2443
+ }
2444
+ var init_canonical = () => {};
2445
+
2424
2446
  // src/storage/postgres-adapter.ts
2425
2447
  import { randomUUID } from "crypto";
2426
2448
  function createPostgresTodosStorageAdapter(options) {
@@ -2646,7 +2668,7 @@ class PostgresJsonRecordStore {
2646
2668
  AND task_record.deleted_at IS NULL
2647
2669
  AND target.payload->>'locked_by' = $3
2648
2670
  AND target.payload->>'locked_at' = $4
2649
- AND todos_try_timestamptz(target.payload->>'locked_at') < $5::timestamptz
2671
+ AND $4::timestamptz < $5::timestamptz
2650
2672
  AND COALESCE(target.payload->>'status', '') NOT IN ('completed', 'failed', 'cancelled')
2651
2673
  RETURNING task_record.payload
2652
2674
  ),
@@ -4088,16 +4110,17 @@ async function findCommit(sha, store) {
4088
4110
  async function addGitRef(input, store, context) {
4089
4111
  if (!await store.get("tasks", input.task_id))
4090
4112
  throw new Error(`Task not found: ${input.task_id}`);
4113
+ const existing = (await store.list("refs")).filter((ref) => ref.task_id === input.task_id && ref.ref_type === input.ref_type && ref.name === input.name).sort((left, right) => left.created_at.localeCompare(right.created_at) || left.id.localeCompare(right.id))[0];
4091
4114
  const timestamp = new Date().toISOString();
4092
4115
  const gitRef = {
4093
- id: randomUUID(),
4116
+ id: existing?.id ?? deterministicUuid("todos:git-ref:v1", input.task_id, input.ref_type, input.name),
4094
4117
  task_id: input.task_id,
4095
4118
  ref_type: input.ref_type,
4096
4119
  name: input.name,
4097
- url: input.url ?? null,
4098
- provider: input.provider ?? null,
4120
+ url: input.url ?? existing?.url ?? null,
4121
+ provider: input.provider ?? existing?.provider ?? null,
4099
4122
  metadata: input.metadata ?? {},
4100
- created_at: timestamp,
4123
+ created_at: existing?.created_at ?? timestamp,
4101
4124
  updated_at: timestamp
4102
4125
  };
4103
4126
  await store.upsert("refs", gitRef, context);
@@ -4659,6 +4682,7 @@ var init_postgres_adapter = __esm(() => {
4659
4682
  init_integrity();
4660
4683
  init_redaction();
4661
4684
  init_audit_history_import();
4685
+ init_canonical();
4662
4686
  TASK_ORDER_BY = `ORDER BY ${TASK_ORDER_TIEBREAK}`;
4663
4687
  });
4664
4688
 
@@ -4678,9 +4702,9 @@ var init_types2 = __esm(() => {
4678
4702
  });
4679
4703
 
4680
4704
  // src/pr-groups/ledger.ts
4681
- import { createHash as createHash3 } from "crypto";
4705
+ import { createHash as createHash4 } from "crypto";
4682
4706
  function sha256(value) {
4683
- return createHash3("sha256").update(value).digest("hex");
4707
+ return createHash4("sha256").update(value).digest("hex");
4684
4708
  }
4685
4709
  function stableValue(value) {
4686
4710
  if (Array.isArray(value))
@@ -12117,7 +12141,7 @@ var init_runner_sandbox = __esm(() => {
12117
12141
  });
12118
12142
 
12119
12143
  // src/lib/event-hooks.ts
12120
- import { createHash as createHash4, randomUUID as randomUUID2 } from "crypto";
12144
+ import { createHash as createHash5, randomUUID as randomUUID2 } from "crypto";
12121
12145
  import { appendFileSync, mkdirSync as mkdirSync3 } from "fs";
12122
12146
  import { dirname as dirname3, resolve as resolve6 } from "path";
12123
12147
  import { createConnection } from "net";
@@ -12184,7 +12208,7 @@ function buildEnvelope(type, payload, timestamp2 = new Date().toISOString()) {
12184
12208
  payload: redactValue(payload ?? {}),
12185
12209
  source: { package: "@hasna/todos", local_only: true }
12186
12210
  };
12187
- const digest = createHash4("sha256").update(canonicalEvent(base)).digest("hex");
12211
+ const digest = createHash5("sha256").update(canonicalEvent(base)).digest("hex");
12188
12212
  return { ...base, integrity: { algorithm: "sha256", digest } };
12189
12213
  }
12190
12214
  function summarize(value) {
@@ -17194,8 +17218,8 @@ var init_boards = __esm(() => {
17194
17218
  });
17195
17219
 
17196
17220
  // src/lib/artifact-store.ts
17197
- import { createHash as createHash5 } from "crypto";
17198
- import { existsSync as existsSync7, mkdirSync as mkdirSync4, readFileSync as readFileSync2, rmSync as rmSync2, statSync as statSync2, writeFileSync as writeFileSync2 } from "fs";
17221
+ import { createHash as createHash6 } from "crypto";
17222
+ import { existsSync as existsSync7, mkdirSync as mkdirSync4, readFileSync as readFileSync3, rmSync as rmSync2, statSync as statSync2, writeFileSync as writeFileSync2 } from "fs";
17199
17223
  import { basename, dirname as dirname4, join as join6, resolve as resolve7 } from "path";
17200
17224
  import { tmpdir as tmpdir2 } from "os";
17201
17225
  function isInMemoryDb2(path) {
@@ -17219,7 +17243,7 @@ function artifactStorePath(relativePath) {
17219
17243
  return join6(artifactStoreRoot(), normalized);
17220
17244
  }
17221
17245
  function sha2562(buffer) {
17222
- return createHash5("sha256").update(buffer).digest("hex");
17246
+ return createHash6("sha256").update(buffer).digest("hex");
17223
17247
  }
17224
17248
  function isTextLike(buffer, path) {
17225
17249
  if (buffer.includes(0))
@@ -17262,7 +17286,7 @@ function storeArtifactContent(input) {
17262
17286
  const sourceStat = statSync2(sourcePath);
17263
17287
  if (!sourceStat.isFile())
17264
17288
  throw new Error(`Artifact path is not a file: ${sanitizePreWriteText(input.path, "artifact.path")}`);
17265
- const sourceBuffer = readFileSync2(sourcePath);
17289
+ const sourceBuffer = readFileSync3(sourcePath);
17266
17290
  const sourceSha = sha2562(sourceBuffer);
17267
17291
  const textLike = isTextLike(sourceBuffer, input.path);
17268
17292
  let storedBuffer = sourceBuffer;
@@ -17349,7 +17373,7 @@ function verifyStoredArtifact(input) {
17349
17373
  message: "stored artifact content is missing"
17350
17374
  };
17351
17375
  }
17352
- const buffer = readFileSync2(storedPath);
17376
+ const buffer = readFileSync3(storedPath);
17353
17377
  const actualSha = sha2562(buffer);
17354
17378
  const actualSize = buffer.length;
17355
17379
  const ok = actualSha === store.sha256 && actualSize === store.size_bytes;
@@ -17369,7 +17393,7 @@ function exportStoredArtifactContent(input) {
17369
17393
  const report = verifyStoredArtifact(input);
17370
17394
  if (report.status !== "ok" || !report.relative_path || !report.actual_sha256 || report.actual_size_bytes === null)
17371
17395
  return null;
17372
- const content = readFileSync2(artifactStorePath(report.relative_path));
17396
+ const content = readFileSync3(artifactStorePath(report.relative_path));
17373
17397
  return {
17374
17398
  artifact_id: input.id,
17375
17399
  sha256: report.actual_sha256,
@@ -20952,25 +20976,25 @@ var init_sqlite = __esm(() => {
20952
20976
  });
20953
20977
 
20954
20978
  // src/project-registration/authority.ts
20955
- import { createHash as createHash6 } from "crypto";
20979
+ import { createHash as createHash7 } from "crypto";
20956
20980
  function canonicalProjectRegistrationJson(value) {
20957
- return JSON.stringify(canonicalize(value));
20981
+ return JSON.stringify(canonicalize2(value));
20958
20982
  }
20959
- function canonicalize(value) {
20983
+ function canonicalize2(value) {
20960
20984
  if (Array.isArray(value))
20961
- return value.map(canonicalize);
20985
+ return value.map(canonicalize2);
20962
20986
  if (!value || typeof value !== "object")
20963
20987
  return value;
20964
20988
  const out = {};
20965
20989
  for (const key of Object.keys(value).sort()) {
20966
20990
  const entry2 = value[key];
20967
20991
  if (entry2 !== undefined)
20968
- out[key] = canonicalize(entry2);
20992
+ out[key] = canonicalize2(entry2);
20969
20993
  }
20970
20994
  return out;
20971
20995
  }
20972
20996
  function digestProjectRegistrationValue(value) {
20973
- return createHash6("sha256").update(canonicalProjectRegistrationJson(value)).digest("hex");
20997
+ return createHash7("sha256").update(canonicalProjectRegistrationJson(value)).digest("hex");
20974
20998
  }
20975
20999
  function deriveTodosProjectRegistrationIdempotencyKey(input) {
20976
21000
  return `prk_${digestProjectRegistrationValue({
@@ -21965,31 +21989,6 @@ var init_project_registration = __esm(() => {
21965
21989
  init_types3();
21966
21990
  });
21967
21991
 
21968
- // src/task-manifest/canonical.ts
21969
- import { createHash as createHash7 } from "crypto";
21970
- function canonicalize2(value) {
21971
- if (Array.isArray(value))
21972
- return value.map(canonicalize2);
21973
- if (value !== null && typeof value === "object") {
21974
- return Object.fromEntries(Object.entries(value).filter(([, entry2]) => entry2 !== undefined).sort(([left], [right]) => left.localeCompare(right)).map(([key, entry2]) => [key, canonicalize2(entry2)]));
21975
- }
21976
- return value;
21977
- }
21978
- function canonicalJson(value) {
21979
- return JSON.stringify(canonicalize2(value));
21980
- }
21981
- function canonicalDigest(value) {
21982
- return createHash7("sha256").update(canonicalJson(value)).digest("hex");
21983
- }
21984
- function deterministicUuid(namespace, ...parts) {
21985
- const bytes = createHash7("sha256").update([namespace, ...parts].join("\x1F")).digest().subarray(0, 16);
21986
- bytes[6] = bytes[6] & 15 | 80;
21987
- bytes[8] = bytes[8] & 63 | 128;
21988
- const hex = bytes.toString("hex");
21989
- return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
21990
- }
21991
- var init_canonical = () => {};
21992
-
21993
21992
  // node_modules/.bun/zod@3.25.76/node_modules/zod/v3/helpers/util.js
21994
21993
  var util, objectUtil, ZodParsedType, getParsedType = (data) => {
21995
21994
  const t = typeof data;
@@ -29638,6 +29637,7 @@ function buildV1OpenApiDocument(version = getPackageVersion()) {
29638
29637
  plan_id: { type: "string" },
29639
29638
  assigned_to: { type: "string" },
29640
29639
  agent_id: { type: "string" },
29640
+ created_by: { type: "string" },
29641
29641
  tags: { type: "array", items: { type: "string" } }
29642
29642
  }
29643
29643
  },
@@ -31480,6 +31480,7 @@ var init_openapi = __esm(() => {
31480
31480
  parent_id: { type: "string", nullable: true },
31481
31481
  assigned_to: { type: "string", nullable: true },
31482
31482
  agent_id: { type: "string", nullable: true },
31483
+ created_by: { type: "string", nullable: true },
31483
31484
  reason: { type: "string", nullable: true },
31484
31485
  tags: { type: "array", items: { type: "string" } },
31485
31486
  version: { type: "number" },
@@ -51389,7 +51390,7 @@ var init_token_utils = __esm(() => {
51389
51390
  });
51390
51391
 
51391
51392
  // src/lib/assignee-validation.ts
51392
- import { readFileSync as readFileSync3 } from "fs";
51393
+ import { readFileSync as readFileSync4 } from "fs";
51393
51394
  import { homedir as homedir3 } from "os";
51394
51395
  import { join as join9 } from "path";
51395
51396
  function defaultSeatRosterPath() {
@@ -51397,7 +51398,7 @@ function defaultSeatRosterPath() {
51397
51398
  }
51398
51399
  function loadSeatSlugs(path = defaultSeatRosterPath()) {
51399
51400
  try {
51400
- const parsed = JSON.parse(readFileSync3(path, "utf8"));
51401
+ const parsed = JSON.parse(readFileSync4(path, "utf8"));
51401
51402
  const slugs = new Set;
51402
51403
  for (const agent of parsed.agents ?? []) {
51403
51404
  if (typeof agent?.slug === "string" && agent.slug.trim()) {
@@ -65030,8 +65031,12 @@ async function cloudGetTask(client, id) {
65030
65031
  const raw = await client.get("tasks", id);
65031
65032
  return raw == null ? null : unwrapTask(raw);
65032
65033
  }
65033
- async function cloudCreateTask(client, input) {
65034
+ async function cloudCreateTask(client, input, verification2 = {}) {
65034
65035
  const expectedParentId = typeof input["parent_id"] === "string" ? input["parent_id"] : null;
65036
+ const expectedCreatedBy = typeof verification2.expectedCreatedBy === "string" && verification2.expectedCreatedBy.trim() ? verification2.expectedCreatedBy : null;
65037
+ if (expectedCreatedBy !== null) {
65038
+ await requireTaskCreatorCapability(client);
65039
+ }
65035
65040
  const created = unwrapTask(await requiredRemoteRoute(client, "/v1/tasks", () => client.transport.post("/tasks", input, {
65036
65041
  idempotencyKey: randomUUID4(),
65037
65042
  retry: false
@@ -65040,8 +65045,9 @@ async function cloudCreateTask(client, input) {
65040
65045
  throw new Error(`REMOTE_API_INCOMPATIBLE: configured Todos authority ${remoteAuthorityBase(client)} returned a task create ` + "response without a stored task id; no success row or local SQLite fallback is permitted");
65041
65046
  }
65042
65047
  const persisted = await cloudGetTask(client, created.id);
65043
- if (!persisted || persisted.id !== created.id || (persisted.parent_id ?? null) !== expectedParentId) {
65044
- throw new Error(`TASK_CREATE_PERSISTENCE_UNVERIFIED: configured Todos authority ${remoteAuthorityBase(client)} accepted ` + `POST /v1/tasks but authoritative GET /v1/tasks/${encodeURIComponent(created.id)} did not return the same ` + "stored task id and parent_id; no success row or local SQLite fallback is permitted");
65048
+ if (!persisted || persisted.id !== created.id || (persisted.parent_id ?? null) !== expectedParentId || expectedCreatedBy !== null && persisted.created_by !== expectedCreatedBy) {
65049
+ const creatorDetail = expectedCreatedBy === null ? "" : ` and explicit created_by=${JSON.stringify(expectedCreatedBy)} ` + `(readback ${JSON.stringify(persisted?.created_by ?? null)})`;
65050
+ throw new Error(`TASK_CREATE_PERSISTENCE_UNVERIFIED: configured Todos authority ${remoteAuthorityBase(client)} accepted ` + `POST /v1/tasks but authoritative GET /v1/tasks/${encodeURIComponent(created.id)} did not return the same ` + `stored task id and parent_id${creatorDetail}; no success row or local SQLite fallback is permitted`);
65045
65051
  }
65046
65052
  return persisted;
65047
65053
  }
@@ -65062,6 +65068,51 @@ async function cloudTaskAction(client, id, action, body2 = {}) {
65062
65068
  const raw = await client.transport.post(`/tasks/${encodeURIComponent(id)}/${action}`, body2);
65063
65069
  return unwrapTask(raw);
65064
65070
  }
65071
+ function resolveOpenApiSchema(document, schema2) {
65072
+ if (!schema2 || typeof schema2 !== "object" || Array.isArray(schema2))
65073
+ return null;
65074
+ const value = schema2;
65075
+ if (typeof value["$ref"] !== "string")
65076
+ return value;
65077
+ const reference = value["$ref"];
65078
+ if (!reference.startsWith("#/"))
65079
+ return null;
65080
+ let current = document;
65081
+ for (const segment of reference.slice(2).split("/")) {
65082
+ const key2 = segment.replace(/~1/g, "/").replace(/~0/g, "~");
65083
+ if (!current || typeof current !== "object" || Array.isArray(current))
65084
+ return null;
65085
+ current = current[key2];
65086
+ }
65087
+ return current && typeof current === "object" && !Array.isArray(current) ? current : null;
65088
+ }
65089
+ function openApiSchemaProperty(document, schemaName, propertyName) {
65090
+ const schema2 = resolveOpenApiSchema(document, {
65091
+ $ref: `#/components/schemas/${schemaName}`
65092
+ });
65093
+ const properties = schema2?.["properties"];
65094
+ if (!properties || typeof properties !== "object" || Array.isArray(properties))
65095
+ return null;
65096
+ const property = properties[propertyName];
65097
+ return property && typeof property === "object" && !Array.isArray(property) ? property : null;
65098
+ }
65099
+ async function fetchTaskCreatorCapability(client) {
65100
+ const document = await requiredRemoteRoute(client, "/v1/openapi.json", () => client.transport.get("/openapi.json"));
65101
+ const inputProperty = openApiSchemaProperty(document, "CreateTaskInput", "created_by");
65102
+ const outputProperty = openApiSchemaProperty(document, "Task", "created_by");
65103
+ return inputProperty?.["type"] === "string" && outputProperty?.["type"] === "string" && outputProperty?.["nullable"] === true;
65104
+ }
65105
+ async function requireTaskCreatorCapability(client) {
65106
+ const authority = remoteAuthorityBase(client);
65107
+ let capability = taskCreatorCapabilityCache.get(authority);
65108
+ if (!capability) {
65109
+ capability = fetchTaskCreatorCapability(client);
65110
+ taskCreatorCapabilityCache.set(authority, capability);
65111
+ }
65112
+ if (!await capability) {
65113
+ throw new Error(`REMOTE_CREATED_BY_UNSUPPORTED: configured Todos authority ${authority} does not advertise created_by ` + "on both CreateTaskInput and Task in /v1/openapi.json; no task mutation was sent; deploy a compatible " + "@hasna/todos /v1 server before retrying; local SQLite fallback is disabled");
65114
+ }
65115
+ }
65065
65116
  async function cloudGetStats(client) {
65066
65117
  const raw = await requiredRemoteRoute(client, "/v1/stats", () => client.transport.get("/stats"));
65067
65118
  return raw ?? {};
@@ -65257,7 +65308,7 @@ async function cloudResolveTaskListRef(client, ref, projectId) {
65257
65308
  return input.toLowerCase();
65258
65309
  return (await cloudResolveTaskList(client, ref, projectId)).id;
65259
65310
  }
65260
- var UUID_RE, TRANSPORT_TOKENS, completionCapabilityCache, retryCapabilityCache, gitRefCapabilityCache, SERVER_MODE_CANDIDATES, cachedServerMode = null, PRIORITY_RANK, listTagsCapabilityCache;
65311
+ var UUID_RE, TRANSPORT_TOKENS, completionCapabilityCache, retryCapabilityCache, taskCreatorCapabilityCache, gitRefCapabilityCache, remoteCommandCapabilityCache, SERVER_MODE_CANDIDATES, cachedServerMode = null, PRIORITY_RANK, listTagsCapabilityCache;
65261
65312
  var init_cloud_router = __esm(() => {
65262
65313
  init_storage();
65263
65314
  init_mode();
@@ -65277,7 +65328,9 @@ var init_cloud_router = __esm(() => {
65277
65328
  };
65278
65329
  completionCapabilityCache = new Map;
65279
65330
  retryCapabilityCache = new Map;
65331
+ taskCreatorCapabilityCache = new Map;
65280
65332
  gitRefCapabilityCache = new Map;
65333
+ remoteCommandCapabilityCache = new Map;
65281
65334
  SERVER_MODE_CANDIDATES = ["postgres", "cloud", "self_hosted"];
65282
65335
  PRIORITY_RANK = { critical: 0, high: 1, medium: 2, low: 3 };
65283
65336
  listTagsCapabilityCache = new Map;
@@ -65673,7 +65726,7 @@ var init_task_crud2 = __esm(() => {
65673
65726
  });
65674
65727
 
65675
65728
  // src/lib/project-bootstrap.ts
65676
- import { existsSync as existsSync9, readFileSync as readFileSync4, statSync as statSync4 } from "fs";
65729
+ import { existsSync as existsSync9, readFileSync as readFileSync5, statSync as statSync4 } from "fs";
65677
65730
  import { basename as basename3, dirname as dirname6, resolve as resolve9 } from "path";
65678
65731
  function safeStat(path) {
65679
65732
  try {
@@ -65707,7 +65760,7 @@ function readPackageJson(path) {
65707
65760
  if (!existsSync9(file))
65708
65761
  return null;
65709
65762
  try {
65710
- const parsed = JSON.parse(readFileSync4(file, "utf-8"));
65763
+ const parsed = JSON.parse(readFileSync5(file, "utf-8"));
65711
65764
  return parsed && typeof parsed === "object" ? parsed : null;
65712
65765
  } catch {
65713
65766
  return null;
@@ -66269,7 +66322,7 @@ var init_retention_cleanup = __esm(() => {
66269
66322
  });
66270
66323
 
66271
66324
  // src/lib/mention-resolver.ts
66272
- import { existsSync as existsSync11, readdirSync as readdirSync2, readFileSync as readFileSync5, statSync as statSync5 } from "fs";
66325
+ import { existsSync as existsSync11, readdirSync as readdirSync2, readFileSync as readFileSync6, statSync as statSync5 } from "fs";
66273
66326
  import { basename as basename4, isAbsolute, join as join10, relative as relative3, resolve as resolve10, sep as sep3 } from "path";
66274
66327
  function blankResolution(parsed) {
66275
66328
  return {
@@ -66378,7 +66431,7 @@ function resolveFile(parsed, workspace) {
66378
66431
  return resolution;
66379
66432
  }
66380
66433
  if (parsed.line !== undefined) {
66381
- const lineCount = readFileSync5(absolutePath, "utf-8").split(/\r?\n/).length;
66434
+ const lineCount = readFileSync6(absolutePath, "utf-8").split(/\r?\n/).length;
66382
66435
  if (parsed.line < 1 || parsed.line > lineCount) {
66383
66436
  resolution.warnings.push(`line ${parsed.line} is outside the file range 1-${lineCount}`);
66384
66437
  return resolution;
@@ -66431,7 +66484,7 @@ function resolveSymbol(parsed, workspace, maxMatches) {
66431
66484
  const pattern = symbolPattern(name);
66432
66485
  const matches = [];
66433
66486
  for (const file of walkSourceFiles(workspace)) {
66434
- const lines = readFileSync5(file, "utf-8").split(/\r?\n/);
66487
+ const lines = readFileSync6(file, "utf-8").split(/\r?\n/);
66435
66488
  for (let index = 0;index < lines.length; index += 1) {
66436
66489
  const line = lines[index];
66437
66490
  const found = pattern.exec(line);
@@ -70098,7 +70151,7 @@ var init_audit_ledger = __esm(() => {
70098
70151
  });
70099
70152
 
70100
70153
  // src/lib/release-compatibility.ts
70101
- import { readFileSync as readFileSync6 } from "fs";
70154
+ import { readFileSync as readFileSync7 } from "fs";
70102
70155
  import { join as join11, resolve as resolve12 } from "path";
70103
70156
  import { Database as Database2 } from "bun:sqlite";
70104
70157
  function pass(id, message, details) {
@@ -70111,7 +70164,7 @@ function warn(id, message, details) {
70111
70164
  return { id, status: "warning", message, details };
70112
70165
  }
70113
70166
  function readPackageJson2(root) {
70114
- return JSON.parse(readFileSync6(join11(root, "package.json"), "utf8"));
70167
+ return JSON.parse(readFileSync7(join11(root, "package.json"), "utf8"));
70115
70168
  }
70116
70169
  function sortedKeys(value) {
70117
70170
  return Object.keys(value ?? {}).sort((left, right) => left.localeCompare(right));
@@ -70492,6 +70545,8 @@ function searchTaskEntities(filters, db) {
70492
70545
  return tasks.filter((task2) => taskMatchesSavedFilters(task2, filters, db)).slice(0, normalizeLimit(filters.limit));
70493
70546
  }
70494
70547
  function searchProjects(filters, db) {
70548
+ if (filters.agent_id)
70549
+ return [];
70495
70550
  const params = [];
70496
70551
  let sql = "SELECT * FROM projects WHERE 1=1";
70497
70552
  if (filters.project_id) {
@@ -100034,7 +100089,7 @@ var init_agent_run_dispatcher = __esm(() => {
100034
100089
  });
100035
100090
 
100036
100091
  // src/lib/verification-providers.ts
100037
- import { existsSync as existsSync12, readFileSync as readFileSync7 } from "fs";
100092
+ import { existsSync as existsSync12, readFileSync as readFileSync8 } from "fs";
100038
100093
  function normalizeName5(name) {
100039
100094
  const normalized = name.trim().toLowerCase();
100040
100095
  if (!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(normalized)) {
@@ -100186,7 +100241,7 @@ Timed out after ${provider.timeout_ms}ms`);
100186
100241
  };
100187
100242
  }
100188
100243
  function runCiLogProvider(input) {
100189
- const text = input.log_text ?? (input.log_path && existsSync12(input.log_path) ? readFileSync7(input.log_path, "utf-8") : "");
100244
+ const text = input.log_text ?? (input.log_path && existsSync12(input.log_path) ? readFileSync8(input.log_path, "utf-8") : "");
100190
100245
  return {
100191
100246
  status: classifyLog(text),
100192
100247
  attempts: 1,
@@ -102927,7 +102982,7 @@ var init_local_bridge = __esm(() => {
102927
102982
 
102928
102983
  // src/lib/local-backups.ts
102929
102984
  import { createHash as createHash12 } from "crypto";
102930
- import { readFileSync as readFileSync8, writeFileSync as writeFileSync3 } from "fs";
102985
+ import { readFileSync as readFileSync9, writeFileSync as writeFileSync3 } from "fs";
102931
102986
  import { dirname as dirname7, resolve as resolve13 } from "path";
102932
102987
  import { mkdirSync as mkdirSync6 } from "fs";
102933
102988
  function stableJson2(value) {
@@ -103037,7 +103092,7 @@ function writeLocalBackupFile(backup, outputPath) {
103037
103092
  return path;
103038
103093
  }
103039
103094
  function readLocalBackupFile(path) {
103040
- return JSON.parse(readFileSync8(resolve13(path), "utf-8"));
103095
+ return JSON.parse(readFileSync9(resolve13(path), "utf-8"));
103041
103096
  }
103042
103097
  function verifyLocalBackup(value, options = {}, db) {
103043
103098
  const verifiedAt = options.verified_at ?? now();
@@ -104488,7 +104543,7 @@ __export(exports_local_extensions, {
104488
104543
  discoverLocalExtensions: () => discoverLocalExtensions
104489
104544
  });
104490
104545
  import { createHash as createHash15, createVerify } from "crypto";
104491
- import { existsSync as existsSync13, readdirSync as readdirSync3, readFileSync as readFileSync9, statSync as statSync6 } from "fs";
104546
+ import { existsSync as existsSync13, readdirSync as readdirSync3, readFileSync as readFileSync10, statSync as statSync6 } from "fs";
104492
104547
  import { basename as basename5, join as join12, resolve as resolve14 } from "path";
104493
104548
  function isObject3(value) {
104494
104549
  return Boolean(value && typeof value === "object" && !Array.isArray(value));
@@ -104570,7 +104625,7 @@ function normalizeManifest(input) {
104570
104625
  };
104571
104626
  }
104572
104627
  function parseJson2(path) {
104573
- return JSON.parse(readFileSync9(path, "utf8"));
104628
+ return JSON.parse(readFileSync10(path, "utf8"));
104574
104629
  }
104575
104630
  function sha2566(bytes) {
104576
104631
  return `sha256:${createHash15("sha256").update(bytes).digest("hex")}`;
@@ -104754,7 +104809,7 @@ function inspectExtensionSource(source3) {
104754
104809
  const manifestPath = stat.isDirectory() ? [join12(resolved, "todos.extension.json"), join12(resolved, "extension.json")].find(existsSync13) : resolved;
104755
104810
  if (!manifestPath)
104756
104811
  throw new Error(`extension directory ${source3} is missing todos.extension.json`);
104757
- const raw = readFileSync9(manifestPath);
104812
+ const raw = readFileSync10(manifestPath);
104758
104813
  const parsed = parseJson2(manifestPath);
104759
104814
  const bundle = isObject3(parsed) && isObject3(parsed["manifest"]);
104760
104815
  const manifest = normalizeManifest(bundle ? parsed["manifest"] : parsed);
@@ -109267,7 +109322,7 @@ __export(exports_extract, {
109267
109322
  buildCodebaseIndex: () => buildCodebaseIndex,
109268
109323
  EXTRACT_TAGS: () => EXTRACT_TAGS
109269
109324
  });
109270
- import { existsSync as existsSync14, readFileSync as readFileSync10, statSync as statSync7 } from "fs";
109325
+ import { existsSync as existsSync14, readFileSync as readFileSync11, statSync as statSync7 } from "fs";
109271
109326
  import { createHash as createHash17 } from "crypto";
109272
109327
  import { relative as relative5, resolve as resolve15, join as join13 } from "path";
109273
109328
  function stableHash(value) {
@@ -109282,7 +109337,7 @@ function readGitignorePatterns(basePath) {
109282
109337
  if (!existsSync14(gitignorePath))
109283
109338
  return [];
109284
109339
  try {
109285
- return readFileSync10(gitignorePath, "utf-8").split(`
109340
+ return readFileSync11(gitignorePath, "utf-8").split(`
109286
109341
  `).map((line) => line.trim()).filter((line) => line && !line.startsWith("#") && !line.startsWith("!"));
109287
109342
  } catch {
109288
109343
  return [];
@@ -109423,7 +109478,7 @@ function buildCodebaseIndex(options) {
109423
109478
  for (const file of files) {
109424
109479
  const fullPath = statSync7(basePath).isFile() ? basePath : join13(basePath, file);
109425
109480
  try {
109426
- const source3 = readFileSync10(fullPath, "utf-8");
109481
+ const source3 = readFileSync11(fullPath, "utf-8");
109427
109482
  const relPath = statSync7(basePath).isFile() ? relative5(resolve15(basePath, ".."), fullPath) : file;
109428
109483
  indexed.push({
109429
109484
  file: relPath,
@@ -109454,7 +109509,7 @@ function extractTodos(options, db) {
109454
109509
  for (const file of files) {
109455
109510
  const fullPath = statSync7(basePath).isFile() ? basePath : join13(basePath, file);
109456
109511
  try {
109457
- const source3 = readFileSync10(fullPath, "utf-8");
109512
+ const source3 = readFileSync11(fullPath, "utf-8");
109458
109513
  const relPath = statSync7(basePath).isFile() ? relative5(resolve15(basePath, ".."), fullPath) : file;
109459
109514
  const comments = extractFromSource(source3, relPath, tags);
109460
109515
  allComments.push(...comments);
@@ -110996,7 +111051,7 @@ __export(exports_environment_snapshots, {
110996
111051
  captureEnvironmentSnapshot: () => captureEnvironmentSnapshot
110997
111052
  });
110998
111053
  import { createHash as createHash18 } from "crypto";
110999
- import { existsSync as existsSync15, readFileSync as readFileSync11, statSync as statSync8 } from "fs";
111054
+ import { existsSync as existsSync15, readFileSync as readFileSync12, statSync as statSync8 } from "fs";
111000
111055
  import { hostname as hostname3, platform, arch } from "os";
111001
111056
  import { dirname as dirname8, join as join15, resolve as resolve16 } from "path";
111002
111057
  import { tmpdir as tmpdir3 } from "os";
@@ -111010,7 +111065,7 @@ function fileRecord(root, relativePath) {
111010
111065
  const stat = statSync8(path);
111011
111066
  if (!stat.isFile())
111012
111067
  return null;
111013
- const content = readFileSync11(path);
111068
+ const content = readFileSync12(path);
111014
111069
  return { path: relativePath, sha256: sha2567(content), size_bytes: content.length };
111015
111070
  }
111016
111071
  function manifestRecord(root, relativePath) {
@@ -53,6 +53,10 @@ export declare function buildV1OpenApiDocument(version?: string): {
53
53
  readonly type: "string";
54
54
  readonly nullable: true;
55
55
  };
56
+ readonly created_by: {
57
+ readonly type: "string";
58
+ readonly nullable: true;
59
+ };
56
60
  readonly reason: {
57
61
  readonly type: "string";
58
62
  readonly nullable: true;
@@ -913,6 +917,9 @@ export declare function buildV1OpenApiDocument(version?: string): {
913
917
  agent_id: {
914
918
  type: string;
915
919
  };
920
+ created_by: {
921
+ type: string;
922
+ };
916
923
  tags: {
917
924
  type: string;
918
925
  items: {
@@ -1 +1 @@
1
- {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/server/openapi.ts"],"names":[],"mappings":"AAmbA,wBAAgB,sBAAsB,CAAC,OAAO,SAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmoDnE"}
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/server/openapi.ts"],"names":[],"mappings":"AAobA,wBAAgB,sBAAsB,CAAC,OAAO,SAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAooDnE"}
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-adapter.d.ts","sourceRoot":"","sources":["../../src/storage/postgres-adapter.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAcV,mBAAmB,EAYpB,MAAM,iBAAiB,CAAC;AAczB,OAAO,EAIL,KAAK,wBAAwB,EAE9B,MAAM,oBAAoB,CAAC;AA0B5B,MAAM,WAAW,wCAAwC;IACvD,MAAM,EAAE,wBAAwB,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAuBD,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,wCAAwC,GAChD,mBAAmB,CA4JrB"}
1
+ {"version":3,"file":"postgres-adapter.d.ts","sourceRoot":"","sources":["../../src/storage/postgres-adapter.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAcV,mBAAmB,EAYpB,MAAM,iBAAiB,CAAC;AAczB,OAAO,EAIL,KAAK,wBAAwB,EAE9B,MAAM,oBAAoB,CAAC;AA2B5B,MAAM,WAAW,wCAAwC;IACvD,MAAM,EAAE,wBAAwB,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAuBD,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,wCAAwC,GAChD,mBAAmB,CA4JrB"}