@hasna/todos 0.15.20 → 0.15.25

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 +2862 -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 +641 -18
  18. package/dist/index.d.ts +3 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +3148 -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 +130 -72
  27. package/dist/mcp.js +4 -1
  28. package/dist/project-registration.js +70 -29
  29. package/dist/registry.js +606 -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 +136 -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 +4 -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.25",
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",
@@ -142,6 +142,8 @@ var init_package = __esm(() => {
142
142
  "dev:serve": "bun run src/server/index.ts",
143
143
  "verify:release": "bun run scripts/verify-public-release.ts --mode=review",
144
144
  "verify:release-review": "bun run scripts/verify-npm-release-agent-review.ts",
145
+ "verify:attested-container-candidate": "bun run scripts/attested-container-candidate.ts verify",
146
+ "test:attested-container-candidate": "bun test scripts/attested-container-candidate.test.ts",
145
147
  "issue:release-review": "bun run scripts/issue-npm-release-agent-review.ts",
146
148
  prepublishOnly: "bun run scripts/verify-public-release.ts --mode=publish",
147
149
  postinstall: "mkdir -p $HOME/.hasna/todos $HOME/.hasna/todos/training 2>/dev/null || true"
@@ -194,6 +196,7 @@ var init_package = __esm(() => {
194
196
  "@types/bun": "^1.2.4",
195
197
  "@types/react": "^18.3.18",
196
198
  "bun-types": "1.3.9",
199
+ "hasna-deployment-contracts": "npm:@hasna/contracts@0.10.4",
197
200
  typescript: "^5.7.3"
198
201
  }
199
202
  };
@@ -1209,7 +1212,7 @@ var init_plan_project_link_contract = __esm(() => {
1209
1212
  });
1210
1213
 
1211
1214
  // src/lib/config.ts
1212
- import { existsSync as existsSync3 } from "fs";
1215
+ import { existsSync as existsSync3, readFileSync as readFileSync2 } from "fs";
1213
1216
  import { dirname, join as join3 } from "path";
1214
1217
  function getConfigPath() {
1215
1218
  return join3(getTodosGlobalDir(), "config.json");
@@ -1586,7 +1589,7 @@ function requireCanonicalLockVersion(value) {
1586
1589
  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
1590
  }
1588
1591
  const parsed = Date.parse(value);
1589
- if (Number.isNaN(parsed) || new Date(parsed).toISOString() !== value) {
1592
+ if (value.startsWith("0000-") || Number.isNaN(parsed) || new Date(parsed).toISOString() !== value) {
1590
1593
  throw new StaleLockHandoffError("STALE_LOCK_HANDOFF_INVALID_INPUT", "expected_lock_version must name a real canonical UTC instant", { field: "expected_lock_version" });
1591
1594
  }
1592
1595
  return value;
@@ -1611,9 +1614,6 @@ function prepareStaleLockHandoff(input, options = {}) {
1611
1614
  if (canonicalAgentRef(actor) !== canonicalAgentRef(newHolder)) {
1612
1615
  throw new StaleLockHandoffError("STALE_LOCK_HANDOFF_ACTOR_MISMATCH", "new_holder must match the authenticated actor", { actor, new_holder: newHolder });
1613
1616
  }
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
1617
  const operationTimestamp = options.now ?? new Date().toISOString();
1618
1618
  if (!CANONICAL_LOCK_VERSION_RE.test(operationTimestamp) || new Date(Date.parse(operationTimestamp)).toISOString() !== operationTimestamp) {
1619
1619
  throw new StaleLockHandoffError("STALE_LOCK_HANDOFF_INVALID_INPUT", "operation timestamp must be a canonical UTC instant");
@@ -2421,6 +2421,31 @@ var init_audit_history_import = __esm(() => {
2421
2421
  ];
2422
2422
  });
2423
2423
 
2424
+ // src/task-manifest/canonical.ts
2425
+ import { createHash as createHash3 } from "crypto";
2426
+ function canonicalize(value) {
2427
+ if (Array.isArray(value))
2428
+ return value.map(canonicalize);
2429
+ if (value !== null && typeof value === "object") {
2430
+ return Object.fromEntries(Object.entries(value).filter(([, entry2]) => entry2 !== undefined).sort(([left], [right]) => left.localeCompare(right)).map(([key, entry2]) => [key, canonicalize(entry2)]));
2431
+ }
2432
+ return value;
2433
+ }
2434
+ function canonicalJson(value) {
2435
+ return JSON.stringify(canonicalize(value));
2436
+ }
2437
+ function canonicalDigest(value) {
2438
+ return createHash3("sha256").update(canonicalJson(value)).digest("hex");
2439
+ }
2440
+ function deterministicUuid(namespace, ...parts) {
2441
+ const bytes = createHash3("sha256").update([namespace, ...parts].join("\x1F")).digest().subarray(0, 16);
2442
+ bytes[6] = bytes[6] & 15 | 80;
2443
+ bytes[8] = bytes[8] & 63 | 128;
2444
+ const hex = bytes.toString("hex");
2445
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
2446
+ }
2447
+ var init_canonical = () => {};
2448
+
2424
2449
  // src/storage/postgres-adapter.ts
2425
2450
  import { randomUUID } from "crypto";
2426
2451
  function createPostgresTodosStorageAdapter(options) {
@@ -2646,7 +2671,7 @@ class PostgresJsonRecordStore {
2646
2671
  AND task_record.deleted_at IS NULL
2647
2672
  AND target.payload->>'locked_by' = $3
2648
2673
  AND target.payload->>'locked_at' = $4
2649
- AND todos_try_timestamptz(target.payload->>'locked_at') < $5::timestamptz
2674
+ AND $4::timestamptz < $5::timestamptz
2650
2675
  AND COALESCE(target.payload->>'status', '') NOT IN ('completed', 'failed', 'cancelled')
2651
2676
  RETURNING task_record.payload
2652
2677
  ),
@@ -4088,16 +4113,17 @@ async function findCommit(sha, store) {
4088
4113
  async function addGitRef(input, store, context) {
4089
4114
  if (!await store.get("tasks", input.task_id))
4090
4115
  throw new Error(`Task not found: ${input.task_id}`);
4116
+ 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
4117
  const timestamp = new Date().toISOString();
4092
4118
  const gitRef = {
4093
- id: randomUUID(),
4119
+ id: existing?.id ?? deterministicUuid("todos:git-ref:v1", input.task_id, input.ref_type, input.name),
4094
4120
  task_id: input.task_id,
4095
4121
  ref_type: input.ref_type,
4096
4122
  name: input.name,
4097
- url: input.url ?? null,
4098
- provider: input.provider ?? null,
4123
+ url: input.url ?? existing?.url ?? null,
4124
+ provider: input.provider ?? existing?.provider ?? null,
4099
4125
  metadata: input.metadata ?? {},
4100
- created_at: timestamp,
4126
+ created_at: existing?.created_at ?? timestamp,
4101
4127
  updated_at: timestamp
4102
4128
  };
4103
4129
  await store.upsert("refs", gitRef, context);
@@ -4659,6 +4685,7 @@ var init_postgres_adapter = __esm(() => {
4659
4685
  init_integrity();
4660
4686
  init_redaction();
4661
4687
  init_audit_history_import();
4688
+ init_canonical();
4662
4689
  TASK_ORDER_BY = `ORDER BY ${TASK_ORDER_TIEBREAK}`;
4663
4690
  });
4664
4691
 
@@ -4678,9 +4705,9 @@ var init_types2 = __esm(() => {
4678
4705
  });
4679
4706
 
4680
4707
  // src/pr-groups/ledger.ts
4681
- import { createHash as createHash3 } from "crypto";
4708
+ import { createHash as createHash4 } from "crypto";
4682
4709
  function sha256(value) {
4683
- return createHash3("sha256").update(value).digest("hex");
4710
+ return createHash4("sha256").update(value).digest("hex");
4684
4711
  }
4685
4712
  function stableValue(value) {
4686
4713
  if (Array.isArray(value))
@@ -12117,7 +12144,7 @@ var init_runner_sandbox = __esm(() => {
12117
12144
  });
12118
12145
 
12119
12146
  // src/lib/event-hooks.ts
12120
- import { createHash as createHash4, randomUUID as randomUUID2 } from "crypto";
12147
+ import { createHash as createHash5, randomUUID as randomUUID2 } from "crypto";
12121
12148
  import { appendFileSync, mkdirSync as mkdirSync3 } from "fs";
12122
12149
  import { dirname as dirname3, resolve as resolve6 } from "path";
12123
12150
  import { createConnection } from "net";
@@ -12184,7 +12211,7 @@ function buildEnvelope(type, payload, timestamp2 = new Date().toISOString()) {
12184
12211
  payload: redactValue(payload ?? {}),
12185
12212
  source: { package: "@hasna/todos", local_only: true }
12186
12213
  };
12187
- const digest = createHash4("sha256").update(canonicalEvent(base)).digest("hex");
12214
+ const digest = createHash5("sha256").update(canonicalEvent(base)).digest("hex");
12188
12215
  return { ...base, integrity: { algorithm: "sha256", digest } };
12189
12216
  }
12190
12217
  function summarize(value) {
@@ -17194,8 +17221,8 @@ var init_boards = __esm(() => {
17194
17221
  });
17195
17222
 
17196
17223
  // 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";
17224
+ import { createHash as createHash6 } from "crypto";
17225
+ import { existsSync as existsSync7, mkdirSync as mkdirSync4, readFileSync as readFileSync3, rmSync as rmSync2, statSync as statSync2, writeFileSync as writeFileSync2 } from "fs";
17199
17226
  import { basename, dirname as dirname4, join as join6, resolve as resolve7 } from "path";
17200
17227
  import { tmpdir as tmpdir2 } from "os";
17201
17228
  function isInMemoryDb2(path) {
@@ -17219,7 +17246,7 @@ function artifactStorePath(relativePath) {
17219
17246
  return join6(artifactStoreRoot(), normalized);
17220
17247
  }
17221
17248
  function sha2562(buffer) {
17222
- return createHash5("sha256").update(buffer).digest("hex");
17249
+ return createHash6("sha256").update(buffer).digest("hex");
17223
17250
  }
17224
17251
  function isTextLike(buffer, path) {
17225
17252
  if (buffer.includes(0))
@@ -17262,7 +17289,7 @@ function storeArtifactContent(input) {
17262
17289
  const sourceStat = statSync2(sourcePath);
17263
17290
  if (!sourceStat.isFile())
17264
17291
  throw new Error(`Artifact path is not a file: ${sanitizePreWriteText(input.path, "artifact.path")}`);
17265
- const sourceBuffer = readFileSync2(sourcePath);
17292
+ const sourceBuffer = readFileSync3(sourcePath);
17266
17293
  const sourceSha = sha2562(sourceBuffer);
17267
17294
  const textLike = isTextLike(sourceBuffer, input.path);
17268
17295
  let storedBuffer = sourceBuffer;
@@ -17349,7 +17376,7 @@ function verifyStoredArtifact(input) {
17349
17376
  message: "stored artifact content is missing"
17350
17377
  };
17351
17378
  }
17352
- const buffer = readFileSync2(storedPath);
17379
+ const buffer = readFileSync3(storedPath);
17353
17380
  const actualSha = sha2562(buffer);
17354
17381
  const actualSize = buffer.length;
17355
17382
  const ok = actualSha === store.sha256 && actualSize === store.size_bytes;
@@ -17369,7 +17396,7 @@ function exportStoredArtifactContent(input) {
17369
17396
  const report = verifyStoredArtifact(input);
17370
17397
  if (report.status !== "ok" || !report.relative_path || !report.actual_sha256 || report.actual_size_bytes === null)
17371
17398
  return null;
17372
- const content = readFileSync2(artifactStorePath(report.relative_path));
17399
+ const content = readFileSync3(artifactStorePath(report.relative_path));
17373
17400
  return {
17374
17401
  artifact_id: input.id,
17375
17402
  sha256: report.actual_sha256,
@@ -20952,25 +20979,25 @@ var init_sqlite = __esm(() => {
20952
20979
  });
20953
20980
 
20954
20981
  // src/project-registration/authority.ts
20955
- import { createHash as createHash6 } from "crypto";
20982
+ import { createHash as createHash7 } from "crypto";
20956
20983
  function canonicalProjectRegistrationJson(value) {
20957
- return JSON.stringify(canonicalize(value));
20984
+ return JSON.stringify(canonicalize2(value));
20958
20985
  }
20959
- function canonicalize(value) {
20986
+ function canonicalize2(value) {
20960
20987
  if (Array.isArray(value))
20961
- return value.map(canonicalize);
20988
+ return value.map(canonicalize2);
20962
20989
  if (!value || typeof value !== "object")
20963
20990
  return value;
20964
20991
  const out = {};
20965
20992
  for (const key of Object.keys(value).sort()) {
20966
20993
  const entry2 = value[key];
20967
20994
  if (entry2 !== undefined)
20968
- out[key] = canonicalize(entry2);
20995
+ out[key] = canonicalize2(entry2);
20969
20996
  }
20970
20997
  return out;
20971
20998
  }
20972
20999
  function digestProjectRegistrationValue(value) {
20973
- return createHash6("sha256").update(canonicalProjectRegistrationJson(value)).digest("hex");
21000
+ return createHash7("sha256").update(canonicalProjectRegistrationJson(value)).digest("hex");
20974
21001
  }
20975
21002
  function deriveTodosProjectRegistrationIdempotencyKey(input) {
20976
21003
  return `prk_${digestProjectRegistrationValue({
@@ -21965,31 +21992,6 @@ var init_project_registration = __esm(() => {
21965
21992
  init_types3();
21966
21993
  });
21967
21994
 
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
21995
  // node_modules/.bun/zod@3.25.76/node_modules/zod/v3/helpers/util.js
21994
21996
  var util, objectUtil, ZodParsedType, getParsedType = (data) => {
21995
21997
  const t = typeof data;
@@ -29638,6 +29640,7 @@ function buildV1OpenApiDocument(version = getPackageVersion()) {
29638
29640
  plan_id: { type: "string" },
29639
29641
  assigned_to: { type: "string" },
29640
29642
  agent_id: { type: "string" },
29643
+ created_by: { type: "string" },
29641
29644
  tags: { type: "array", items: { type: "string" } }
29642
29645
  }
29643
29646
  },
@@ -31480,6 +31483,7 @@ var init_openapi = __esm(() => {
31480
31483
  parent_id: { type: "string", nullable: true },
31481
31484
  assigned_to: { type: "string", nullable: true },
31482
31485
  agent_id: { type: "string", nullable: true },
31486
+ created_by: { type: "string", nullable: true },
31483
31487
  reason: { type: "string", nullable: true },
31484
31488
  tags: { type: "array", items: { type: "string" } },
31485
31489
  version: { type: "number" },
@@ -51389,7 +51393,7 @@ var init_token_utils = __esm(() => {
51389
51393
  });
51390
51394
 
51391
51395
  // src/lib/assignee-validation.ts
51392
- import { readFileSync as readFileSync3 } from "fs";
51396
+ import { readFileSync as readFileSync4 } from "fs";
51393
51397
  import { homedir as homedir3 } from "os";
51394
51398
  import { join as join9 } from "path";
51395
51399
  function defaultSeatRosterPath() {
@@ -51397,7 +51401,7 @@ function defaultSeatRosterPath() {
51397
51401
  }
51398
51402
  function loadSeatSlugs(path = defaultSeatRosterPath()) {
51399
51403
  try {
51400
- const parsed = JSON.parse(readFileSync3(path, "utf8"));
51404
+ const parsed = JSON.parse(readFileSync4(path, "utf8"));
51401
51405
  const slugs = new Set;
51402
51406
  for (const agent of parsed.agents ?? []) {
51403
51407
  if (typeof agent?.slug === "string" && agent.slug.trim()) {
@@ -65030,8 +65034,12 @@ async function cloudGetTask(client, id) {
65030
65034
  const raw = await client.get("tasks", id);
65031
65035
  return raw == null ? null : unwrapTask(raw);
65032
65036
  }
65033
- async function cloudCreateTask(client, input) {
65037
+ async function cloudCreateTask(client, input, verification2 = {}) {
65034
65038
  const expectedParentId = typeof input["parent_id"] === "string" ? input["parent_id"] : null;
65039
+ const expectedCreatedBy = typeof verification2.expectedCreatedBy === "string" && verification2.expectedCreatedBy.trim() ? verification2.expectedCreatedBy : null;
65040
+ if (expectedCreatedBy !== null) {
65041
+ await requireTaskCreatorCapability(client);
65042
+ }
65035
65043
  const created = unwrapTask(await requiredRemoteRoute(client, "/v1/tasks", () => client.transport.post("/tasks", input, {
65036
65044
  idempotencyKey: randomUUID4(),
65037
65045
  retry: false
@@ -65040,8 +65048,9 @@ async function cloudCreateTask(client, input) {
65040
65048
  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
65049
  }
65042
65050
  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");
65051
+ if (!persisted || persisted.id !== created.id || (persisted.parent_id ?? null) !== expectedParentId || expectedCreatedBy !== null && persisted.created_by !== expectedCreatedBy) {
65052
+ const creatorDetail = expectedCreatedBy === null ? "" : ` and explicit created_by=${JSON.stringify(expectedCreatedBy)} ` + `(readback ${JSON.stringify(persisted?.created_by ?? null)})`;
65053
+ 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
65054
  }
65046
65055
  return persisted;
65047
65056
  }
@@ -65062,6 +65071,51 @@ async function cloudTaskAction(client, id, action, body2 = {}) {
65062
65071
  const raw = await client.transport.post(`/tasks/${encodeURIComponent(id)}/${action}`, body2);
65063
65072
  return unwrapTask(raw);
65064
65073
  }
65074
+ function resolveOpenApiSchema(document, schema2) {
65075
+ if (!schema2 || typeof schema2 !== "object" || Array.isArray(schema2))
65076
+ return null;
65077
+ const value = schema2;
65078
+ if (typeof value["$ref"] !== "string")
65079
+ return value;
65080
+ const reference = value["$ref"];
65081
+ if (!reference.startsWith("#/"))
65082
+ return null;
65083
+ let current = document;
65084
+ for (const segment of reference.slice(2).split("/")) {
65085
+ const key2 = segment.replace(/~1/g, "/").replace(/~0/g, "~");
65086
+ if (!current || typeof current !== "object" || Array.isArray(current))
65087
+ return null;
65088
+ current = current[key2];
65089
+ }
65090
+ return current && typeof current === "object" && !Array.isArray(current) ? current : null;
65091
+ }
65092
+ function openApiSchemaProperty(document, schemaName, propertyName) {
65093
+ const schema2 = resolveOpenApiSchema(document, {
65094
+ $ref: `#/components/schemas/${schemaName}`
65095
+ });
65096
+ const properties = schema2?.["properties"];
65097
+ if (!properties || typeof properties !== "object" || Array.isArray(properties))
65098
+ return null;
65099
+ const property = properties[propertyName];
65100
+ return property && typeof property === "object" && !Array.isArray(property) ? property : null;
65101
+ }
65102
+ async function fetchTaskCreatorCapability(client) {
65103
+ const document = await requiredRemoteRoute(client, "/v1/openapi.json", () => client.transport.get("/openapi.json"));
65104
+ const inputProperty = openApiSchemaProperty(document, "CreateTaskInput", "created_by");
65105
+ const outputProperty = openApiSchemaProperty(document, "Task", "created_by");
65106
+ return inputProperty?.["type"] === "string" && outputProperty?.["type"] === "string" && outputProperty?.["nullable"] === true;
65107
+ }
65108
+ async function requireTaskCreatorCapability(client) {
65109
+ const authority = remoteAuthorityBase(client);
65110
+ let capability = taskCreatorCapabilityCache.get(authority);
65111
+ if (!capability) {
65112
+ capability = fetchTaskCreatorCapability(client);
65113
+ taskCreatorCapabilityCache.set(authority, capability);
65114
+ }
65115
+ if (!await capability) {
65116
+ 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");
65117
+ }
65118
+ }
65065
65119
  async function cloudGetStats(client) {
65066
65120
  const raw = await requiredRemoteRoute(client, "/v1/stats", () => client.transport.get("/stats"));
65067
65121
  return raw ?? {};
@@ -65257,7 +65311,7 @@ async function cloudResolveTaskListRef(client, ref, projectId) {
65257
65311
  return input.toLowerCase();
65258
65312
  return (await cloudResolveTaskList(client, ref, projectId)).id;
65259
65313
  }
65260
- var UUID_RE, TRANSPORT_TOKENS, completionCapabilityCache, retryCapabilityCache, gitRefCapabilityCache, SERVER_MODE_CANDIDATES, cachedServerMode = null, PRIORITY_RANK, listTagsCapabilityCache;
65314
+ var UUID_RE, TRANSPORT_TOKENS, completionCapabilityCache, retryCapabilityCache, taskCreatorCapabilityCache, gitRefCapabilityCache, remoteCommandCapabilityCache, SERVER_MODE_CANDIDATES, cachedServerMode = null, PRIORITY_RANK, listTagsCapabilityCache;
65261
65315
  var init_cloud_router = __esm(() => {
65262
65316
  init_storage();
65263
65317
  init_mode();
@@ -65277,7 +65331,9 @@ var init_cloud_router = __esm(() => {
65277
65331
  };
65278
65332
  completionCapabilityCache = new Map;
65279
65333
  retryCapabilityCache = new Map;
65334
+ taskCreatorCapabilityCache = new Map;
65280
65335
  gitRefCapabilityCache = new Map;
65336
+ remoteCommandCapabilityCache = new Map;
65281
65337
  SERVER_MODE_CANDIDATES = ["postgres", "cloud", "self_hosted"];
65282
65338
  PRIORITY_RANK = { critical: 0, high: 1, medium: 2, low: 3 };
65283
65339
  listTagsCapabilityCache = new Map;
@@ -65673,7 +65729,7 @@ var init_task_crud2 = __esm(() => {
65673
65729
  });
65674
65730
 
65675
65731
  // src/lib/project-bootstrap.ts
65676
- import { existsSync as existsSync9, readFileSync as readFileSync4, statSync as statSync4 } from "fs";
65732
+ import { existsSync as existsSync9, readFileSync as readFileSync5, statSync as statSync4 } from "fs";
65677
65733
  import { basename as basename3, dirname as dirname6, resolve as resolve9 } from "path";
65678
65734
  function safeStat(path) {
65679
65735
  try {
@@ -65707,7 +65763,7 @@ function readPackageJson(path) {
65707
65763
  if (!existsSync9(file))
65708
65764
  return null;
65709
65765
  try {
65710
- const parsed = JSON.parse(readFileSync4(file, "utf-8"));
65766
+ const parsed = JSON.parse(readFileSync5(file, "utf-8"));
65711
65767
  return parsed && typeof parsed === "object" ? parsed : null;
65712
65768
  } catch {
65713
65769
  return null;
@@ -66269,7 +66325,7 @@ var init_retention_cleanup = __esm(() => {
66269
66325
  });
66270
66326
 
66271
66327
  // src/lib/mention-resolver.ts
66272
- import { existsSync as existsSync11, readdirSync as readdirSync2, readFileSync as readFileSync5, statSync as statSync5 } from "fs";
66328
+ import { existsSync as existsSync11, readdirSync as readdirSync2, readFileSync as readFileSync6, statSync as statSync5 } from "fs";
66273
66329
  import { basename as basename4, isAbsolute, join as join10, relative as relative3, resolve as resolve10, sep as sep3 } from "path";
66274
66330
  function blankResolution(parsed) {
66275
66331
  return {
@@ -66378,7 +66434,7 @@ function resolveFile(parsed, workspace) {
66378
66434
  return resolution;
66379
66435
  }
66380
66436
  if (parsed.line !== undefined) {
66381
- const lineCount = readFileSync5(absolutePath, "utf-8").split(/\r?\n/).length;
66437
+ const lineCount = readFileSync6(absolutePath, "utf-8").split(/\r?\n/).length;
66382
66438
  if (parsed.line < 1 || parsed.line > lineCount) {
66383
66439
  resolution.warnings.push(`line ${parsed.line} is outside the file range 1-${lineCount}`);
66384
66440
  return resolution;
@@ -66431,7 +66487,7 @@ function resolveSymbol(parsed, workspace, maxMatches) {
66431
66487
  const pattern = symbolPattern(name);
66432
66488
  const matches = [];
66433
66489
  for (const file of walkSourceFiles(workspace)) {
66434
- const lines = readFileSync5(file, "utf-8").split(/\r?\n/);
66490
+ const lines = readFileSync6(file, "utf-8").split(/\r?\n/);
66435
66491
  for (let index = 0;index < lines.length; index += 1) {
66436
66492
  const line = lines[index];
66437
66493
  const found = pattern.exec(line);
@@ -70098,7 +70154,7 @@ var init_audit_ledger = __esm(() => {
70098
70154
  });
70099
70155
 
70100
70156
  // src/lib/release-compatibility.ts
70101
- import { readFileSync as readFileSync6 } from "fs";
70157
+ import { readFileSync as readFileSync7 } from "fs";
70102
70158
  import { join as join11, resolve as resolve12 } from "path";
70103
70159
  import { Database as Database2 } from "bun:sqlite";
70104
70160
  function pass(id, message, details) {
@@ -70111,7 +70167,7 @@ function warn(id, message, details) {
70111
70167
  return { id, status: "warning", message, details };
70112
70168
  }
70113
70169
  function readPackageJson2(root) {
70114
- return JSON.parse(readFileSync6(join11(root, "package.json"), "utf8"));
70170
+ return JSON.parse(readFileSync7(join11(root, "package.json"), "utf8"));
70115
70171
  }
70116
70172
  function sortedKeys(value) {
70117
70173
  return Object.keys(value ?? {}).sort((left, right) => left.localeCompare(right));
@@ -70492,6 +70548,8 @@ function searchTaskEntities(filters, db) {
70492
70548
  return tasks.filter((task2) => taskMatchesSavedFilters(task2, filters, db)).slice(0, normalizeLimit(filters.limit));
70493
70549
  }
70494
70550
  function searchProjects(filters, db) {
70551
+ if (filters.agent_id)
70552
+ return [];
70495
70553
  const params = [];
70496
70554
  let sql = "SELECT * FROM projects WHERE 1=1";
70497
70555
  if (filters.project_id) {
@@ -100034,7 +100092,7 @@ var init_agent_run_dispatcher = __esm(() => {
100034
100092
  });
100035
100093
 
100036
100094
  // src/lib/verification-providers.ts
100037
- import { existsSync as existsSync12, readFileSync as readFileSync7 } from "fs";
100095
+ import { existsSync as existsSync12, readFileSync as readFileSync8 } from "fs";
100038
100096
  function normalizeName5(name) {
100039
100097
  const normalized = name.trim().toLowerCase();
100040
100098
  if (!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(normalized)) {
@@ -100186,7 +100244,7 @@ Timed out after ${provider.timeout_ms}ms`);
100186
100244
  };
100187
100245
  }
100188
100246
  function runCiLogProvider(input) {
100189
- const text = input.log_text ?? (input.log_path && existsSync12(input.log_path) ? readFileSync7(input.log_path, "utf-8") : "");
100247
+ const text = input.log_text ?? (input.log_path && existsSync12(input.log_path) ? readFileSync8(input.log_path, "utf-8") : "");
100190
100248
  return {
100191
100249
  status: classifyLog(text),
100192
100250
  attempts: 1,
@@ -102927,7 +102985,7 @@ var init_local_bridge = __esm(() => {
102927
102985
 
102928
102986
  // src/lib/local-backups.ts
102929
102987
  import { createHash as createHash12 } from "crypto";
102930
- import { readFileSync as readFileSync8, writeFileSync as writeFileSync3 } from "fs";
102988
+ import { readFileSync as readFileSync9, writeFileSync as writeFileSync3 } from "fs";
102931
102989
  import { dirname as dirname7, resolve as resolve13 } from "path";
102932
102990
  import { mkdirSync as mkdirSync6 } from "fs";
102933
102991
  function stableJson2(value) {
@@ -103037,7 +103095,7 @@ function writeLocalBackupFile(backup, outputPath) {
103037
103095
  return path;
103038
103096
  }
103039
103097
  function readLocalBackupFile(path) {
103040
- return JSON.parse(readFileSync8(resolve13(path), "utf-8"));
103098
+ return JSON.parse(readFileSync9(resolve13(path), "utf-8"));
103041
103099
  }
103042
103100
  function verifyLocalBackup(value, options = {}, db) {
103043
103101
  const verifiedAt = options.verified_at ?? now();
@@ -104488,7 +104546,7 @@ __export(exports_local_extensions, {
104488
104546
  discoverLocalExtensions: () => discoverLocalExtensions
104489
104547
  });
104490
104548
  import { createHash as createHash15, createVerify } from "crypto";
104491
- import { existsSync as existsSync13, readdirSync as readdirSync3, readFileSync as readFileSync9, statSync as statSync6 } from "fs";
104549
+ import { existsSync as existsSync13, readdirSync as readdirSync3, readFileSync as readFileSync10, statSync as statSync6 } from "fs";
104492
104550
  import { basename as basename5, join as join12, resolve as resolve14 } from "path";
104493
104551
  function isObject3(value) {
104494
104552
  return Boolean(value && typeof value === "object" && !Array.isArray(value));
@@ -104570,7 +104628,7 @@ function normalizeManifest(input) {
104570
104628
  };
104571
104629
  }
104572
104630
  function parseJson2(path) {
104573
- return JSON.parse(readFileSync9(path, "utf8"));
104631
+ return JSON.parse(readFileSync10(path, "utf8"));
104574
104632
  }
104575
104633
  function sha2566(bytes) {
104576
104634
  return `sha256:${createHash15("sha256").update(bytes).digest("hex")}`;
@@ -104754,7 +104812,7 @@ function inspectExtensionSource(source3) {
104754
104812
  const manifestPath = stat.isDirectory() ? [join12(resolved, "todos.extension.json"), join12(resolved, "extension.json")].find(existsSync13) : resolved;
104755
104813
  if (!manifestPath)
104756
104814
  throw new Error(`extension directory ${source3} is missing todos.extension.json`);
104757
- const raw = readFileSync9(manifestPath);
104815
+ const raw = readFileSync10(manifestPath);
104758
104816
  const parsed = parseJson2(manifestPath);
104759
104817
  const bundle = isObject3(parsed) && isObject3(parsed["manifest"]);
104760
104818
  const manifest = normalizeManifest(bundle ? parsed["manifest"] : parsed);
@@ -109267,7 +109325,7 @@ __export(exports_extract, {
109267
109325
  buildCodebaseIndex: () => buildCodebaseIndex,
109268
109326
  EXTRACT_TAGS: () => EXTRACT_TAGS
109269
109327
  });
109270
- import { existsSync as existsSync14, readFileSync as readFileSync10, statSync as statSync7 } from "fs";
109328
+ import { existsSync as existsSync14, readFileSync as readFileSync11, statSync as statSync7 } from "fs";
109271
109329
  import { createHash as createHash17 } from "crypto";
109272
109330
  import { relative as relative5, resolve as resolve15, join as join13 } from "path";
109273
109331
  function stableHash(value) {
@@ -109282,7 +109340,7 @@ function readGitignorePatterns(basePath) {
109282
109340
  if (!existsSync14(gitignorePath))
109283
109341
  return [];
109284
109342
  try {
109285
- return readFileSync10(gitignorePath, "utf-8").split(`
109343
+ return readFileSync11(gitignorePath, "utf-8").split(`
109286
109344
  `).map((line) => line.trim()).filter((line) => line && !line.startsWith("#") && !line.startsWith("!"));
109287
109345
  } catch {
109288
109346
  return [];
@@ -109423,7 +109481,7 @@ function buildCodebaseIndex(options) {
109423
109481
  for (const file of files) {
109424
109482
  const fullPath = statSync7(basePath).isFile() ? basePath : join13(basePath, file);
109425
109483
  try {
109426
- const source3 = readFileSync10(fullPath, "utf-8");
109484
+ const source3 = readFileSync11(fullPath, "utf-8");
109427
109485
  const relPath = statSync7(basePath).isFile() ? relative5(resolve15(basePath, ".."), fullPath) : file;
109428
109486
  indexed.push({
109429
109487
  file: relPath,
@@ -109454,7 +109512,7 @@ function extractTodos(options, db) {
109454
109512
  for (const file of files) {
109455
109513
  const fullPath = statSync7(basePath).isFile() ? basePath : join13(basePath, file);
109456
109514
  try {
109457
- const source3 = readFileSync10(fullPath, "utf-8");
109515
+ const source3 = readFileSync11(fullPath, "utf-8");
109458
109516
  const relPath = statSync7(basePath).isFile() ? relative5(resolve15(basePath, ".."), fullPath) : file;
109459
109517
  const comments = extractFromSource(source3, relPath, tags);
109460
109518
  allComments.push(...comments);
@@ -110996,7 +111054,7 @@ __export(exports_environment_snapshots, {
110996
111054
  captureEnvironmentSnapshot: () => captureEnvironmentSnapshot
110997
111055
  });
110998
111056
  import { createHash as createHash18 } from "crypto";
110999
- import { existsSync as existsSync15, readFileSync as readFileSync11, statSync as statSync8 } from "fs";
111057
+ import { existsSync as existsSync15, readFileSync as readFileSync12, statSync as statSync8 } from "fs";
111000
111058
  import { hostname as hostname3, platform, arch } from "os";
111001
111059
  import { dirname as dirname8, join as join15, resolve as resolve16 } from "path";
111002
111060
  import { tmpdir as tmpdir3 } from "os";
@@ -111010,7 +111068,7 @@ function fileRecord(root, relativePath) {
111010
111068
  const stat = statSync8(path);
111011
111069
  if (!stat.isFile())
111012
111070
  return null;
111013
- const content = readFileSync11(path);
111071
+ const content = readFileSync12(path);
111014
111072
  return { path: relativePath, sha256: sha2567(content), size_bytes: content.length };
111015
111073
  }
111016
111074
  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"}