@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.
- package/dist/ai-tools.d.ts +80 -0
- package/dist/ai-tools.d.ts.map +1 -0
- package/dist/ai.d.ts +313 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/cli/cloud-router.d.ts +10 -1
- package/dist/cli/cloud-router.d.ts.map +1 -1
- package/dist/cli/commands/ai-commands.d.ts +3 -0
- package/dist/cli/commands/ai-commands.d.ts.map +1 -0
- package/dist/cli/commands/help-commands.d.ts +2 -1
- package/dist/cli/commands/help-commands.d.ts.map +1 -1
- package/dist/cli/commands/task-commands.d.ts.map +1 -1
- package/dist/cli/index.js +2862 -547
- package/dist/cli/stage-a.d.ts +27 -16
- package/dist/cli/stage-a.d.ts.map +1 -1
- package/dist/contracts.d.ts +1 -0
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +641 -18
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3148 -1089
- package/dist/lib/cli-help.d.ts +2 -2
- package/dist/lib/config.d.ts +4 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/saved-search-views.d.ts.map +1 -1
- package/dist/lib/stale-lock-handoff.d.ts.map +1 -1
- package/dist/mcp/index.js +130 -72
- package/dist/mcp.js +4 -1
- package/dist/project-registration.js +70 -29
- package/dist/registry.js +606 -18
- package/dist/release-provenance.json +5 -5
- package/dist/sdk/index.js +1 -1
- package/dist/sdk/v1.generated.d.ts +2 -0
- package/dist/sdk/v1.generated.d.ts.map +1 -1
- package/dist/server/index.js +136 -78
- package/dist/server/openapi.d.ts +7 -0
- package/dist/server/openapi.d.ts.map +1 -1
- package/dist/storage/postgres-adapter.d.ts.map +1 -1
- package/dist/storage.js +60 -20
- package/dist/task-manifest.js +19 -3
- package/package.json +4 -1
package/dist/server/index.js
CHANGED
|
@@ -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.
|
|
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
|
|
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:
|
|
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
|
|
4708
|
+
import { createHash as createHash4 } from "crypto";
|
|
4682
4709
|
function sha256(value) {
|
|
4683
|
-
return
|
|
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
|
|
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 =
|
|
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
|
|
17198
|
-
import { existsSync as existsSync7, mkdirSync as mkdirSync4, readFileSync as
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
20982
|
+
import { createHash as createHash7 } from "crypto";
|
|
20956
20983
|
function canonicalProjectRegistrationJson(value) {
|
|
20957
|
-
return JSON.stringify(
|
|
20984
|
+
return JSON.stringify(canonicalize2(value));
|
|
20958
20985
|
}
|
|
20959
|
-
function
|
|
20986
|
+
function canonicalize2(value) {
|
|
20960
20987
|
if (Array.isArray(value))
|
|
20961
|
-
return value.map(
|
|
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] =
|
|
20995
|
+
out[key] = canonicalize2(entry2);
|
|
20969
20996
|
}
|
|
20970
20997
|
return out;
|
|
20971
20998
|
}
|
|
20972
20999
|
function digestProjectRegistrationValue(value) {
|
|
20973
|
-
return
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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(
|
|
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
|
|
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) ?
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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) {
|
package/dist/server/openapi.d.ts
CHANGED
|
@@ -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":"
|
|
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;
|
|
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"}
|