@hasna/todos 0.11.75 → 0.11.82
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/README.md +8 -0
- package/dist/cli/cloud-router.d.ts +90 -0
- package/dist/cli/cloud-router.d.ts.map +1 -0
- package/dist/cli/commands/agent-commands.d.ts.map +1 -1
- package/dist/cli/commands/plan-template-commands.d.ts.map +1 -1
- package/dist/cli/commands/project-commands.d.ts.map +1 -1
- package/dist/cli/commands/query-commands.d.ts.map +1 -1
- package/dist/cli/commands/storage-commands.d.ts.map +1 -1
- package/dist/cli/commands/task-commands.d.ts.map +1 -1
- package/dist/cli/helpers.d.ts +22 -0
- package/dist/cli/helpers.d.ts.map +1 -1
- package/dist/cli/index.js +72556 -62360
- package/dist/contracts.js +314 -14
- package/dist/db/database.d.ts.map +1 -1
- package/dist/index.js +1160 -236
- package/dist/lib/shadow-status.d.ts +38 -0
- package/dist/lib/shadow-status.d.ts.map +1 -0
- package/dist/mcp/index.js +10378 -341
- package/dist/mcp/tools/agents.d.ts.map +1 -1
- package/dist/mcp/tools/task-adv-tools.d.ts.map +1 -1
- package/dist/mcp/tools/task-auto-tools.d.ts.map +1 -1
- package/dist/mcp/tools/task-crud.d.ts.map +1 -1
- package/dist/mcp/tools/task-project-tools.d.ts.map +1 -1
- package/dist/mcp/tools/task-workflow-tools.d.ts.map +1 -1
- package/dist/registry.js +314 -14
- package/dist/release-provenance.json +3 -3
- package/dist/sdk/index.d.ts +2 -0
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +135 -0
- package/dist/sdk/v1.generated.d.ts +124 -0
- package/dist/sdk/v1.generated.d.ts.map +1 -0
- package/dist/server/cloud.d.ts +50 -0
- package/dist/server/cloud.d.ts.map +1 -0
- package/dist/server/index.js +12073 -2013
- package/dist/server/openapi.d.ts +628 -0
- package/dist/server/openapi.d.ts.map +1 -0
- package/dist/server/serve.d.ts.map +1 -1
- package/dist/server/v1.d.ts +19 -0
- package/dist/server/v1.d.ts.map +1 -0
- package/dist/storage/cloud-client.d.ts +30 -0
- package/dist/storage/cloud-client.d.ts.map +1 -0
- package/dist/storage/config.d.ts +12 -0
- package/dist/storage/config.d.ts.map +1 -1
- package/dist/storage/factory.d.ts +2 -0
- package/dist/storage/factory.d.ts.map +1 -1
- package/dist/storage/index.d.ts +8 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/interfaces.d.ts +1 -0
- package/dist/storage/interfaces.d.ts.map +1 -1
- package/dist/storage/local-sqlite.d.ts.map +1 -1
- package/dist/storage/postgres-adapter.d.ts.map +1 -1
- package/dist/storage/postgres-sync.d.ts.map +1 -1
- package/dist/storage/shadow-outbox-schema.d.ts +21 -0
- package/dist/storage/shadow-outbox-schema.d.ts.map +1 -0
- package/dist/storage/shadow-outbox.d.ts +125 -0
- package/dist/storage/shadow-outbox.d.ts.map +1 -0
- package/dist/storage/shadow-runtime.d.ts +29 -0
- package/dist/storage/shadow-runtime.d.ts.map +1 -0
- package/dist/storage/shadow.d.ts +118 -0
- package/dist/storage/shadow.d.ts.map +1 -0
- package/dist/storage.d.ts +2 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +1159 -220
- package/package.json +6 -2
- package/vendor/hasna-contracts-0.5.1.tgz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,KAAK,OAAO,GAAG;IACb,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD,WAAW,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;IACpC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;CAC5D,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,kBAAkB,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,OAAO,GAAG,IAAI,CA6bjJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-adv-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-adv-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"task-adv-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-adv-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAIjD,UAAU,cAAc;IACtB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,cAAc,QAunB1E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-auto-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-auto-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"task-auto-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-auto-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAGjD,UAAU,eAAe;IACvB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QAoX5E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-crud.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-crud.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"task-crud.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-crud.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAajD,UAAU,eAAe;IACvB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,QAqV5E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-project-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-project-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"task-project-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-project-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAmJjD,UAAU,kBAAkB;IAC1B,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,kBAAkB,QAo4FlF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-workflow-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-workflow-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"task-workflow-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-workflow-tools.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAKjD,UAAU,mBAAmB;IAC3B,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3F;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,mBAAmB,QAkZpF"}
|
package/dist/registry.js
CHANGED
|
@@ -2643,6 +2643,294 @@ var init_machines = __esm(() => {
|
|
|
2643
2643
|
];
|
|
2644
2644
|
});
|
|
2645
2645
|
|
|
2646
|
+
// src/storage/config.ts
|
|
2647
|
+
var exports_config = {};
|
|
2648
|
+
__export(exports_config, {
|
|
2649
|
+
parseStorageMode: () => parseStorageMode,
|
|
2650
|
+
loadTodosStorageConfig: () => loadTodosStorageConfig,
|
|
2651
|
+
loadStorageConfig: () => loadStorageConfig,
|
|
2652
|
+
isTodosShadowEnabled: () => isTodosShadowEnabled,
|
|
2653
|
+
isTodosRemoteStorageEnabled: () => isTodosRemoteStorageEnabled,
|
|
2654
|
+
getTodosStorageShadowEnvName: () => getTodosStorageShadowEnvName,
|
|
2655
|
+
getTodosStorageMode: () => getTodosStorageMode,
|
|
2656
|
+
getTodosStorageEnvName: () => getTodosStorageEnvName,
|
|
2657
|
+
getTodosStorageDatabaseUrl: () => getTodosStorageDatabaseUrl,
|
|
2658
|
+
getTodosStorageDatabaseEnv: () => getTodosStorageDatabaseEnv,
|
|
2659
|
+
getStorageMode: () => getStorageMode,
|
|
2660
|
+
getStorageDatabaseUrl: () => getStorageDatabaseUrl,
|
|
2661
|
+
getStorageDatabaseEnv: () => getStorageDatabaseEnv,
|
|
2662
|
+
getCanonicalTodosRdsConfig: () => getCanonicalTodosRdsConfig,
|
|
2663
|
+
assertTodosShadowConfig: () => assertTodosShadowConfig,
|
|
2664
|
+
assertTodosRemoteStorageConfig: () => assertTodosRemoteStorageConfig,
|
|
2665
|
+
TODOS_STORAGE_TABLES: () => TODOS_STORAGE_TABLES,
|
|
2666
|
+
TODOS_STORAGE_FALLBACK_ENV: () => TODOS_STORAGE_FALLBACK_ENV,
|
|
2667
|
+
TODOS_STORAGE_ENV: () => TODOS_STORAGE_ENV,
|
|
2668
|
+
STORAGE_TABLES: () => STORAGE_TABLES,
|
|
2669
|
+
CANONICAL_TODOS_RDS_RUNTIME_PATH: () => CANONICAL_TODOS_RDS_RUNTIME_PATH,
|
|
2670
|
+
CANONICAL_TODOS_RDS_DATABASE: () => CANONICAL_TODOS_RDS_DATABASE,
|
|
2671
|
+
CANONICAL_TODOS_RDS_CLUSTER: () => CANONICAL_TODOS_RDS_CLUSTER
|
|
2672
|
+
});
|
|
2673
|
+
function getCanonicalTodosRdsConfig() {
|
|
2674
|
+
return {
|
|
2675
|
+
cluster: CANONICAL_TODOS_RDS_CLUSTER,
|
|
2676
|
+
database: CANONICAL_TODOS_RDS_DATABASE,
|
|
2677
|
+
runtimeSecretPath: CANONICAL_TODOS_RDS_RUNTIME_PATH,
|
|
2678
|
+
primaryEnv: TODOS_STORAGE_ENV.databaseUrl,
|
|
2679
|
+
fallbackEnv: TODOS_STORAGE_FALLBACK_ENV.databaseUrl
|
|
2680
|
+
};
|
|
2681
|
+
}
|
|
2682
|
+
function loadTodosStorageConfig(env = process.env) {
|
|
2683
|
+
const mode = getTodosStorageMode(env);
|
|
2684
|
+
const databaseUrl = getTodosStorageDatabaseUrl(env);
|
|
2685
|
+
const bucket = readStorageEnv(env, "s3Bucket").value;
|
|
2686
|
+
const prefix = readStorageEnv(env, "s3Prefix").value ?? "todos/";
|
|
2687
|
+
const region = readStorageEnv(env, "awsRegion").value;
|
|
2688
|
+
const endpoint = readStorageEnv(env, "s3Endpoint").value;
|
|
2689
|
+
const schema = readStorageEnv(env, "databaseSchema").value;
|
|
2690
|
+
return {
|
|
2691
|
+
service: "todos",
|
|
2692
|
+
mode,
|
|
2693
|
+
...databaseUrl ? {
|
|
2694
|
+
database: {
|
|
2695
|
+
provider: "postgres",
|
|
2696
|
+
url: databaseUrl,
|
|
2697
|
+
ssl: parseBoolean(readStorageEnv(env, "databaseSsl").value, true),
|
|
2698
|
+
...schema ? { schema } : {}
|
|
2699
|
+
}
|
|
2700
|
+
} : {},
|
|
2701
|
+
...bucket ? {
|
|
2702
|
+
objectStorage: {
|
|
2703
|
+
provider: "s3",
|
|
2704
|
+
bucket,
|
|
2705
|
+
prefix,
|
|
2706
|
+
...region ? { region } : {},
|
|
2707
|
+
...endpoint ? { endpoint } : {},
|
|
2708
|
+
forcePathStyle: parseBoolean(readStorageEnv(env, "s3ForcePathStyle").value, false)
|
|
2709
|
+
}
|
|
2710
|
+
} : {},
|
|
2711
|
+
sync: {
|
|
2712
|
+
batchSize: parsePositiveInteger(readStorageEnv(env, "syncBatchSize").value, 500),
|
|
2713
|
+
dryRun: parseBoolean(readStorageEnv(env, "syncDryRun").value, false)
|
|
2714
|
+
}
|
|
2715
|
+
};
|
|
2716
|
+
}
|
|
2717
|
+
function loadStorageConfig(env = process.env) {
|
|
2718
|
+
return loadTodosStorageConfig(env);
|
|
2719
|
+
}
|
|
2720
|
+
function isTodosRemoteStorageEnabled(config) {
|
|
2721
|
+
return config.mode === "remote" || config.mode === "hybrid";
|
|
2722
|
+
}
|
|
2723
|
+
function assertTodosRemoteStorageConfig(config) {
|
|
2724
|
+
if (!isTodosRemoteStorageEnabled(config))
|
|
2725
|
+
return;
|
|
2726
|
+
if (!config.database?.url) {
|
|
2727
|
+
throw new Error(`${TODOS_STORAGE_ENV.databaseUrl} is required when ${TODOS_STORAGE_ENV.mode}=${config.mode}`);
|
|
2728
|
+
}
|
|
2729
|
+
}
|
|
2730
|
+
function parseStorageMode(value) {
|
|
2731
|
+
const normalized = clean(value)?.toLowerCase();
|
|
2732
|
+
if (!normalized)
|
|
2733
|
+
return "local";
|
|
2734
|
+
if (normalized === "local" || normalized === "remote" || normalized === "hybrid")
|
|
2735
|
+
return normalized;
|
|
2736
|
+
throw new Error(`${TODOS_STORAGE_ENV.mode} must be local, remote, or hybrid`);
|
|
2737
|
+
}
|
|
2738
|
+
function getTodosStorageMode(env = process.env) {
|
|
2739
|
+
return parseStorageMode(readStorageEnv(env, "mode").value);
|
|
2740
|
+
}
|
|
2741
|
+
function getStorageMode(env = process.env) {
|
|
2742
|
+
return getTodosStorageMode(env);
|
|
2743
|
+
}
|
|
2744
|
+
function isTodosShadowEnabled(env = process.env) {
|
|
2745
|
+
return parseBoolean(readStorageEnv(env, "shadow").value, false);
|
|
2746
|
+
}
|
|
2747
|
+
function getTodosStorageShadowEnvName(env = process.env) {
|
|
2748
|
+
return readStorageEnv(env, "shadow").name;
|
|
2749
|
+
}
|
|
2750
|
+
function assertTodosShadowConfig(config, env = process.env) {
|
|
2751
|
+
if (!isTodosShadowEnabled(env))
|
|
2752
|
+
return;
|
|
2753
|
+
if (config.mode !== "local") {
|
|
2754
|
+
throw new Error(`${readStorageEnv(env, "shadow").name} shadow mirror requires ${TODOS_STORAGE_ENV.mode}=local (got ${config.mode})`);
|
|
2755
|
+
}
|
|
2756
|
+
if (!config.database?.url) {
|
|
2757
|
+
throw new Error(`${TODOS_STORAGE_ENV.databaseUrl} is required when ${readStorageEnv(env, "shadow").name} is enabled`);
|
|
2758
|
+
}
|
|
2759
|
+
}
|
|
2760
|
+
function getTodosStorageDatabaseEnv(env = process.env) {
|
|
2761
|
+
return readStorageEnv(env, "databaseUrl").name;
|
|
2762
|
+
}
|
|
2763
|
+
function getStorageDatabaseEnv(env = process.env) {
|
|
2764
|
+
return getTodosStorageDatabaseEnv(env);
|
|
2765
|
+
}
|
|
2766
|
+
function getTodosStorageDatabaseUrl(env = process.env) {
|
|
2767
|
+
return readStorageEnv(env, "databaseUrl").value;
|
|
2768
|
+
}
|
|
2769
|
+
function getStorageDatabaseUrl(env = process.env) {
|
|
2770
|
+
return getTodosStorageDatabaseUrl(env);
|
|
2771
|
+
}
|
|
2772
|
+
function getTodosStorageEnvName(env, key) {
|
|
2773
|
+
return readStorageEnv(env, key).name;
|
|
2774
|
+
}
|
|
2775
|
+
function readStorageEnv(env, key) {
|
|
2776
|
+
const primaryName = TODOS_STORAGE_ENV[key];
|
|
2777
|
+
const primaryValue = clean(env[primaryName]);
|
|
2778
|
+
if (primaryValue !== undefined)
|
|
2779
|
+
return { name: primaryName, value: primaryValue };
|
|
2780
|
+
const fallbackName = TODOS_STORAGE_FALLBACK_ENV[key];
|
|
2781
|
+
const fallbackValue = clean(env[fallbackName]);
|
|
2782
|
+
if (fallbackValue !== undefined)
|
|
2783
|
+
return { name: fallbackName, value: fallbackValue };
|
|
2784
|
+
return { name: primaryName };
|
|
2785
|
+
}
|
|
2786
|
+
function clean(value) {
|
|
2787
|
+
const trimmed = value?.trim();
|
|
2788
|
+
return trimmed ? trimmed : undefined;
|
|
2789
|
+
}
|
|
2790
|
+
function parseBoolean(value, fallback) {
|
|
2791
|
+
const normalized = clean(value)?.toLowerCase();
|
|
2792
|
+
if (!normalized)
|
|
2793
|
+
return fallback;
|
|
2794
|
+
if (["1", "true", "yes", "on"].includes(normalized))
|
|
2795
|
+
return true;
|
|
2796
|
+
if (["0", "false", "no", "off"].includes(normalized))
|
|
2797
|
+
return false;
|
|
2798
|
+
throw new Error(`Expected boolean env value, got ${value}`);
|
|
2799
|
+
}
|
|
2800
|
+
function parsePositiveInteger(value, fallback) {
|
|
2801
|
+
const normalized = clean(value);
|
|
2802
|
+
if (!normalized)
|
|
2803
|
+
return fallback;
|
|
2804
|
+
const parsed = Number.parseInt(normalized, 10);
|
|
2805
|
+
if (!Number.isSafeInteger(parsed) || parsed <= 0) {
|
|
2806
|
+
throw new Error(`${TODOS_STORAGE_ENV.syncBatchSize} must be a positive integer`);
|
|
2807
|
+
}
|
|
2808
|
+
return parsed;
|
|
2809
|
+
}
|
|
2810
|
+
var TODOS_STORAGE_TABLES, STORAGE_TABLES, TODOS_STORAGE_ENV, TODOS_STORAGE_FALLBACK_ENV, CANONICAL_TODOS_RDS_CLUSTER = "hasna-xyz-infra-apps-prod-postgres", CANONICAL_TODOS_RDS_DATABASE = "todos", CANONICAL_TODOS_RDS_RUNTIME_PATH = "hasna/xyz/opensource/todos/prod/rds";
|
|
2811
|
+
var init_config = __esm(() => {
|
|
2812
|
+
TODOS_STORAGE_TABLES = [
|
|
2813
|
+
"todos_sync_records",
|
|
2814
|
+
"todos_sync_cursors"
|
|
2815
|
+
];
|
|
2816
|
+
STORAGE_TABLES = TODOS_STORAGE_TABLES;
|
|
2817
|
+
TODOS_STORAGE_ENV = {
|
|
2818
|
+
mode: "HASNA_TODOS_STORAGE_MODE",
|
|
2819
|
+
shadow: "HASNA_TODOS_SHADOW",
|
|
2820
|
+
databaseUrl: "HASNA_TODOS_DATABASE_URL",
|
|
2821
|
+
databaseSsl: "HASNA_TODOS_DATABASE_SSL",
|
|
2822
|
+
databaseSchema: "HASNA_TODOS_DATABASE_SCHEMA",
|
|
2823
|
+
s3Bucket: "HASNA_TODOS_S3_BUCKET",
|
|
2824
|
+
s3Prefix: "HASNA_TODOS_S3_PREFIX",
|
|
2825
|
+
awsRegion: "HASNA_TODOS_AWS_REGION",
|
|
2826
|
+
s3Endpoint: "HASNA_TODOS_S3_ENDPOINT",
|
|
2827
|
+
s3ForcePathStyle: "HASNA_TODOS_S3_FORCE_PATH_STYLE",
|
|
2828
|
+
s3AccessKeyId: "HASNA_TODOS_S3_ACCESS_KEY_ID",
|
|
2829
|
+
s3SecretAccessKey: "HASNA_TODOS_S3_SECRET_ACCESS_KEY",
|
|
2830
|
+
s3SessionToken: "HASNA_TODOS_S3_SESSION_TOKEN",
|
|
2831
|
+
syncBatchSize: "HASNA_TODOS_SYNC_BATCH_SIZE",
|
|
2832
|
+
syncDryRun: "HASNA_TODOS_SYNC_DRY_RUN"
|
|
2833
|
+
};
|
|
2834
|
+
TODOS_STORAGE_FALLBACK_ENV = {
|
|
2835
|
+
mode: "TODOS_STORAGE_MODE",
|
|
2836
|
+
shadow: "TODOS_SHADOW",
|
|
2837
|
+
databaseUrl: "TODOS_DATABASE_URL",
|
|
2838
|
+
databaseSsl: "TODOS_DATABASE_SSL",
|
|
2839
|
+
databaseSchema: "TODOS_DATABASE_SCHEMA",
|
|
2840
|
+
s3Bucket: "TODOS_S3_BUCKET",
|
|
2841
|
+
s3Prefix: "TODOS_S3_PREFIX",
|
|
2842
|
+
awsRegion: "TODOS_AWS_REGION",
|
|
2843
|
+
s3Endpoint: "TODOS_S3_ENDPOINT",
|
|
2844
|
+
s3ForcePathStyle: "TODOS_S3_FORCE_PATH_STYLE",
|
|
2845
|
+
s3AccessKeyId: "TODOS_S3_ACCESS_KEY_ID",
|
|
2846
|
+
s3SecretAccessKey: "TODOS_S3_SECRET_ACCESS_KEY",
|
|
2847
|
+
s3SessionToken: "TODOS_S3_SESSION_TOKEN",
|
|
2848
|
+
syncBatchSize: "TODOS_SYNC_BATCH_SIZE",
|
|
2849
|
+
syncDryRun: "TODOS_SYNC_DRY_RUN"
|
|
2850
|
+
};
|
|
2851
|
+
});
|
|
2852
|
+
|
|
2853
|
+
// src/storage/shadow-outbox-schema.ts
|
|
2854
|
+
var exports_shadow_outbox_schema = {};
|
|
2855
|
+
__export(exports_shadow_outbox_schema, {
|
|
2856
|
+
installShadowOutboxSchema: () => installShadowOutboxSchema,
|
|
2857
|
+
SHADOW_TRIGGER_TABLES: () => SHADOW_TRIGGER_TABLES
|
|
2858
|
+
});
|
|
2859
|
+
function installShadowOutboxSchema(db) {
|
|
2860
|
+
db.run(`CREATE TABLE IF NOT EXISTS shadow_outbox (
|
|
2861
|
+
seq INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
2862
|
+
object_type TEXT NOT NULL,
|
|
2863
|
+
object_id TEXT NOT NULL,
|
|
2864
|
+
op TEXT NOT NULL,
|
|
2865
|
+
enqueued_at INTEGER NOT NULL,
|
|
2866
|
+
attempts INTEGER NOT NULL DEFAULT 0,
|
|
2867
|
+
next_attempt_at INTEGER NOT NULL DEFAULT 0,
|
|
2868
|
+
last_error TEXT,
|
|
2869
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
2870
|
+
revision INTEGER NOT NULL DEFAULT 0
|
|
2871
|
+
)`);
|
|
2872
|
+
ensureColumn(db, "shadow_outbox", "revision", "INTEGER NOT NULL DEFAULT 0");
|
|
2873
|
+
db.run(`CREATE UNIQUE INDEX IF NOT EXISTS shadow_outbox_pending_uq
|
|
2874
|
+
ON shadow_outbox(object_type, object_id) WHERE status='pending'`);
|
|
2875
|
+
db.run(`CREATE INDEX IF NOT EXISTS shadow_outbox_ready_idx
|
|
2876
|
+
ON shadow_outbox(status, next_attempt_at)`);
|
|
2877
|
+
for (const { table, objectType, deletes } of SHADOW_TRIGGER_TABLES) {
|
|
2878
|
+
const exists = db.query(`SELECT name FROM sqlite_master WHERE type='table' AND name=?`).get(table);
|
|
2879
|
+
if (!exists)
|
|
2880
|
+
continue;
|
|
2881
|
+
const insertTrigger = `shadow_ob_${table}_ai`;
|
|
2882
|
+
const updateTrigger = `shadow_ob_${table}_au`;
|
|
2883
|
+
db.run(`DROP TRIGGER IF EXISTS ${insertTrigger}`);
|
|
2884
|
+
db.run(`DROP TRIGGER IF EXISTS ${updateTrigger}`);
|
|
2885
|
+
db.run(upsertTriggerSql(insertTrigger, table, objectType, "INSERT", "NEW"));
|
|
2886
|
+
db.run(upsertTriggerSql(updateTrigger, table, objectType, "UPDATE", "NEW"));
|
|
2887
|
+
if (deletes) {
|
|
2888
|
+
const deleteTrigger = `shadow_ob_${table}_ad`;
|
|
2889
|
+
db.run(`DROP TRIGGER IF EXISTS ${deleteTrigger}`);
|
|
2890
|
+
db.run(deleteTriggerSql(deleteTrigger, table, objectType));
|
|
2891
|
+
}
|
|
2892
|
+
}
|
|
2893
|
+
}
|
|
2894
|
+
function ensureColumn(db, table, column, definition) {
|
|
2895
|
+
const rows = db.query(`PRAGMA table_info(${table})`).all();
|
|
2896
|
+
if (rows.some((row) => row.name === column))
|
|
2897
|
+
return;
|
|
2898
|
+
db.run(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
|
|
2899
|
+
}
|
|
2900
|
+
function upsertTriggerSql(name, table, objectType, event, row) {
|
|
2901
|
+
return `CREATE TRIGGER IF NOT EXISTS ${name}
|
|
2902
|
+
AFTER ${event} ON ${table}
|
|
2903
|
+
BEGIN
|
|
2904
|
+
INSERT INTO shadow_outbox(object_type, object_id, op, enqueued_at, attempts, next_attempt_at, last_error, status, revision)
|
|
2905
|
+
VALUES('${objectType}', ${row}.id, 'upsert', CAST(strftime('%s','now') AS INTEGER) * 1000, 0, 0, NULL, 'pending', 0)
|
|
2906
|
+
ON CONFLICT(object_type, object_id) WHERE status='pending'
|
|
2907
|
+
DO UPDATE SET op='upsert', enqueued_at=excluded.enqueued_at, attempts=0, next_attempt_at=0, last_error=NULL, revision=shadow_outbox.revision + 1;
|
|
2908
|
+
END`;
|
|
2909
|
+
}
|
|
2910
|
+
function deleteTriggerSql(name, table, objectType) {
|
|
2911
|
+
return `CREATE TRIGGER IF NOT EXISTS ${name}
|
|
2912
|
+
AFTER DELETE ON ${table}
|
|
2913
|
+
BEGIN
|
|
2914
|
+
INSERT INTO shadow_outbox(object_type, object_id, op, enqueued_at, attempts, next_attempt_at, last_error, status, revision)
|
|
2915
|
+
VALUES('${objectType}', OLD.id, 'delete', CAST(strftime('%s','now') AS INTEGER) * 1000, 0, 0, NULL, 'pending', 0)
|
|
2916
|
+
ON CONFLICT(object_type, object_id) WHERE status='pending'
|
|
2917
|
+
DO UPDATE SET op='delete', enqueued_at=excluded.enqueued_at, attempts=0, next_attempt_at=0, last_error=NULL, revision=shadow_outbox.revision + 1;
|
|
2918
|
+
END`;
|
|
2919
|
+
}
|
|
2920
|
+
var SHADOW_TRIGGER_TABLES;
|
|
2921
|
+
var init_shadow_outbox_schema = __esm(() => {
|
|
2922
|
+
SHADOW_TRIGGER_TABLES = [
|
|
2923
|
+
{ table: "tasks", objectType: "tasks", deletes: true },
|
|
2924
|
+
{ table: "projects", objectType: "projects", deletes: true },
|
|
2925
|
+
{ table: "project_machine_paths", objectType: "project_machine_paths", deletes: true },
|
|
2926
|
+
{ table: "plans", objectType: "plans", deletes: true },
|
|
2927
|
+
{ table: "agents", objectType: "agents", deletes: false },
|
|
2928
|
+
{ table: "task_lists", objectType: "task_lists", deletes: true },
|
|
2929
|
+
{ table: "task_templates", objectType: "templates", deletes: true },
|
|
2930
|
+
{ table: "task_history", objectType: "audit_history", deletes: false }
|
|
2931
|
+
];
|
|
2932
|
+
});
|
|
2933
|
+
|
|
2646
2934
|
// src/db/database.ts
|
|
2647
2935
|
var exports_database = {};
|
|
2648
2936
|
__export(exports_database, {
|
|
@@ -2733,8 +3021,20 @@ function openDatabase(path) {
|
|
|
2733
3021
|
runMigrations(db);
|
|
2734
3022
|
backfillTaskTags(db);
|
|
2735
3023
|
backfillMachineId(db);
|
|
3024
|
+
maybeInstallShadowCapture(db);
|
|
2736
3025
|
return db;
|
|
2737
3026
|
}
|
|
3027
|
+
function maybeInstallShadowCapture(db) {
|
|
3028
|
+
try {
|
|
3029
|
+
const { isTodosShadowEnabled: isTodosShadowEnabled2 } = (init_config(), __toCommonJS(exports_config));
|
|
3030
|
+
if (!isTodosShadowEnabled2())
|
|
3031
|
+
return;
|
|
3032
|
+
const { installShadowOutboxSchema: installShadowOutboxSchema2 } = (init_shadow_outbox_schema(), __toCommonJS(exports_shadow_outbox_schema));
|
|
3033
|
+
installShadowOutboxSchema2(db);
|
|
3034
|
+
} catch (error) {
|
|
3035
|
+
console.error(`[todos] shadow capture install failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
3036
|
+
}
|
|
3037
|
+
}
|
|
2738
3038
|
function getDatabase(dbPath) {
|
|
2739
3039
|
const path = dbPath || getDbPath();
|
|
2740
3040
|
if (_db && _dbPath === path)
|
|
@@ -3111,7 +3411,7 @@ function getCompletionGuardConfig(projectPath) {
|
|
|
3111
3411
|
return global;
|
|
3112
3412
|
}
|
|
3113
3413
|
var cached = null, GUARD_DEFAULTS;
|
|
3114
|
-
var
|
|
3414
|
+
var init_config2 = __esm(() => {
|
|
3115
3415
|
init_sync_utils();
|
|
3116
3416
|
GUARD_DEFAULTS = {
|
|
3117
3417
|
enabled: false,
|
|
@@ -3482,7 +3782,7 @@ function checkCompletionGuard(task, agentId, db, configOverride) {
|
|
|
3482
3782
|
}
|
|
3483
3783
|
var init_completion_guard = __esm(() => {
|
|
3484
3784
|
init_types();
|
|
3485
|
-
|
|
3785
|
+
init_config2();
|
|
3486
3786
|
init_projects();
|
|
3487
3787
|
});
|
|
3488
3788
|
|
|
@@ -3490,8 +3790,8 @@ var init_completion_guard = __esm(() => {
|
|
|
3490
3790
|
import { tmpdir } from "os";
|
|
3491
3791
|
import { resolve as resolve3, sep } from "path";
|
|
3492
3792
|
function envFlag(name) {
|
|
3493
|
-
const value = process.env[name];
|
|
3494
|
-
return value === "1" || value === "true" || value === "yes";
|
|
3793
|
+
const value = process.env[name]?.trim().toLowerCase();
|
|
3794
|
+
return value === "1" || value === "true" || value === "yes" || value === "on";
|
|
3495
3795
|
}
|
|
3496
3796
|
function isUnder(parent, child) {
|
|
3497
3797
|
const normalizedParent = resolve3(parent);
|
|
@@ -3517,7 +3817,7 @@ function usesIsolatedTodosHome() {
|
|
|
3517
3817
|
function shouldEmitSharedTaskEvents(dbPath) {
|
|
3518
3818
|
if (envFlag("TODOS_DISABLE_SHARED_EVENTS"))
|
|
3519
3819
|
return false;
|
|
3520
|
-
if (envFlag("TODOS_ALLOW_EPHEMERAL_SHARED_EVENTS"))
|
|
3820
|
+
if (envFlag("TODOS_ALLOW_EPHEMERAL_SHARED_EVENTS") || envFlag("HASNA_TODOS_ALLOW_GLOBAL_EVENTS_FROM_TEMP_DB"))
|
|
3521
3821
|
return true;
|
|
3522
3822
|
if (!isEphemeralTodosDatabase(dbPath))
|
|
3523
3823
|
return true;
|
|
@@ -3619,7 +3919,7 @@ function upsertSecretSafetyConfig(input) {
|
|
|
3619
3919
|
}
|
|
3620
3920
|
var DEFAULT_SECRET_PATTERNS, DEFAULT_SECRET_KEY_PATTERN, NON_SECRET_USAGE_KEYS;
|
|
3621
3921
|
var init_redaction = __esm(() => {
|
|
3622
|
-
|
|
3922
|
+
init_config2();
|
|
3623
3923
|
DEFAULT_SECRET_PATTERNS = [
|
|
3624
3924
|
{ name: "aws-access-key", regex: /\b(AKIA|ASIA)[0-9A-Z]{16}\b/g, replacement: "[REDACTED_AWS_KEY]" },
|
|
3625
3925
|
{ name: "private-key", regex: /-----BEGIN (?:RSA |EC |OPENSSH |)PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |)PRIVATE KEY-----/g, replacement: "[REDACTED_PRIVATE_KEY]" },
|
|
@@ -3776,7 +4076,7 @@ function checkWorkspacePermission(input = {}) {
|
|
|
3776
4076
|
}
|
|
3777
4077
|
var DEFAULT_DENYLIST, DEFAULT_ENV_REDACTIONS, PRESET_DEFAULTS;
|
|
3778
4078
|
var init_workspace_trust = __esm(() => {
|
|
3779
|
-
|
|
4079
|
+
init_config2();
|
|
3780
4080
|
DEFAULT_DENYLIST = ["rm -rf", "mkfs", "dd if=", "curl | sh", "wget | sh"];
|
|
3781
4081
|
DEFAULT_ENV_REDACTIONS = ["API_KEY", "TOKEN", "SECRET", "PASSWORD", "AUTH"];
|
|
3782
4082
|
PRESET_DEFAULTS = {
|
|
@@ -4010,7 +4310,7 @@ function explainRunnerSandbox(input = {}) {
|
|
|
4010
4310
|
}
|
|
4011
4311
|
var DEFAULT_COMMAND_DENYLIST, DEFAULT_ENV_REDACTIONS2;
|
|
4012
4312
|
var init_runner_sandbox = __esm(() => {
|
|
4013
|
-
|
|
4313
|
+
init_config2();
|
|
4014
4314
|
init_workspace_trust();
|
|
4015
4315
|
DEFAULT_COMMAND_DENYLIST = ["rm -rf", "mkfs", "dd if=", "curl | sh", "wget | sh"];
|
|
4016
4316
|
DEFAULT_ENV_REDACTIONS2 = ["API_KEY", "TOKEN", "SECRET", "PASSWORD", "AUTH"];
|
|
@@ -4246,7 +4546,7 @@ var LOCAL_EVENT_TYPES, VALID_TARGETS;
|
|
|
4246
4546
|
var init_event_hooks = __esm(() => {
|
|
4247
4547
|
init_redaction();
|
|
4248
4548
|
init_runner_sandbox();
|
|
4249
|
-
|
|
4549
|
+
init_config2();
|
|
4250
4550
|
init_event_emission_safety();
|
|
4251
4551
|
LOCAL_EVENT_TYPES = [
|
|
4252
4552
|
"task.created",
|
|
@@ -16531,7 +16831,7 @@ function writeSdkIntegrationFixtures(directory, options = {}) {
|
|
|
16531
16831
|
init_audit();
|
|
16532
16832
|
init_database();
|
|
16533
16833
|
init_tasks();
|
|
16534
|
-
|
|
16834
|
+
init_config2();
|
|
16535
16835
|
init_event_emission_safety();
|
|
16536
16836
|
init_event_hooks();
|
|
16537
16837
|
|
|
@@ -17155,7 +17455,7 @@ init_task_lifecycle();
|
|
|
17155
17455
|
init_tasks();
|
|
17156
17456
|
init_plans();
|
|
17157
17457
|
init_task_runs();
|
|
17158
|
-
|
|
17458
|
+
init_config2();
|
|
17159
17459
|
var LOCAL_ROADMAP_SCHEMA_VERSION = 1;
|
|
17160
17460
|
function timestamp() {
|
|
17161
17461
|
return new Date().toISOString();
|
|
@@ -17521,7 +17821,7 @@ function renderRoadmapMarkdown(idOrName, db) {
|
|
|
17521
17821
|
// src/lib/audit-ledger.ts
|
|
17522
17822
|
init_database();
|
|
17523
17823
|
init_task_runs();
|
|
17524
|
-
|
|
17824
|
+
init_config2();
|
|
17525
17825
|
init_redaction();
|
|
17526
17826
|
import { createHash as createHash5 } from "crypto";
|
|
17527
17827
|
var LOCAL_AUDIT_LEDGER_SCHEMA_VERSION = 1;
|
|
@@ -19738,7 +20038,7 @@ init_task_runs();
|
|
|
19738
20038
|
init_event_hooks();
|
|
19739
20039
|
|
|
19740
20040
|
// src/lib/terminal-notifications.ts
|
|
19741
|
-
|
|
20041
|
+
init_config2();
|
|
19742
20042
|
init_event_hooks();
|
|
19743
20043
|
init_redaction();
|
|
19744
20044
|
var SEVERITY_ORDER = {
|
|
@@ -20908,7 +21208,7 @@ function renderLocalReportMarkdown(report) {
|
|
|
20908
21208
|
`;
|
|
20909
21209
|
}
|
|
20910
21210
|
// src/lib/local-encryption.ts
|
|
20911
|
-
|
|
21211
|
+
init_config2();
|
|
20912
21212
|
init_redaction();
|
|
20913
21213
|
import { createCipheriv, createDecipheriv, createHash as createHash8, randomBytes, scryptSync, timingSafeEqual as timingSafeEqual2 } from "crypto";
|
|
20914
21214
|
var TODOS_ENCRYPTED_VALUE_KIND = "hasna.todos.encrypted-value";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"packageName": "@hasna/todos",
|
|
3
|
-
"packageVersion": "0.11.
|
|
3
|
+
"packageVersion": "0.11.82",
|
|
4
4
|
"repository": "https://github.com/hasna/todos.git",
|
|
5
|
-
"gitCommit": "
|
|
6
|
-
"generatedAt": "2026-07-
|
|
5
|
+
"gitCommit": "c6e5695eeb5700d03c6c7f70b722fdb18dc60e32",
|
|
6
|
+
"generatedAt": "2026-07-08T13:21:23.262Z"
|
|
7
7
|
}
|
package/dist/sdk/index.d.ts
CHANGED
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
*/
|
|
10
10
|
export { TodosClient, createClient } from "./client.js";
|
|
11
11
|
export type { TodosClientOptions } from "./client.js";
|
|
12
|
+
export { TodosV1Client, ApiError as TodosV1ApiError } from "./v1.generated.js";
|
|
13
|
+
export type { TodosV1ClientOptions, Task as TodosV1Task, Project as TodosV1Project, CreateTaskInput as TodosV1CreateTaskInput, UpdateTaskInput as TodosV1UpdateTaskInput, CreateProjectInput as TodosV1CreateProjectInput, } from "./v1.generated.js";
|
|
12
14
|
export { TodosAPIError, TodosNotFoundError, TodosConflictError, TodosUnauthorizedError, TodosRateLimitError, TodosTimeoutError, } from "./types.js";
|
|
13
15
|
export type { SSEEvent, CursorPage, ListOptions, TaskListResponse, TaskStatusResponse, TaskNextResponse, TaskActiveResponse, TaskStaleResponse, TaskChangedResponse, TaskContextResponse, TaskProgressResponse, TaskAttachmentsResponse, TaskFailResponse, TaskBulkResponse, AgentMeResponse, AgentQueueResponse, OrgNode, PlanWithTasks, ReportResponse, DoctorResponse, DoctorIssue, } from "./types.js";
|
|
14
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/sdk/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAItD,OAAO,EAAE,aAAa,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/E,YAAY,EACV,oBAAoB,EACpB,IAAI,IAAI,WAAW,EACnB,OAAO,IAAI,cAAc,EACzB,eAAe,IAAI,sBAAsB,EACzC,eAAe,IAAI,sBAAsB,EACzC,kBAAkB,IAAI,yBAAyB,GAChD,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,QAAQ,EACR,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,OAAO,EACP,aAAa,EACb,cAAc,EACd,cAAc,EACd,WAAW,GACZ,MAAM,YAAY,CAAC"}
|
package/dist/sdk/index.js
CHANGED
|
@@ -622,8 +622,143 @@ class TodosClient {
|
|
|
622
622
|
function createClient(options) {
|
|
623
623
|
return new TodosClient(options);
|
|
624
624
|
}
|
|
625
|
+
// src/sdk/v1.generated.ts
|
|
626
|
+
class ApiError extends Error {
|
|
627
|
+
status;
|
|
628
|
+
body;
|
|
629
|
+
constructor(status, message, body) {
|
|
630
|
+
super(message);
|
|
631
|
+
this.status = status;
|
|
632
|
+
this.body = body;
|
|
633
|
+
this.name = "ApiError";
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
class TodosV1Client {
|
|
638
|
+
baseUrl;
|
|
639
|
+
apiKey;
|
|
640
|
+
fetchImpl;
|
|
641
|
+
baseHeaders;
|
|
642
|
+
constructor(options) {
|
|
643
|
+
if (!options.baseUrl)
|
|
644
|
+
throw new Error("TodosV1Client requires a baseUrl.");
|
|
645
|
+
this.baseUrl = options.baseUrl.replace(/\/$/, "");
|
|
646
|
+
this.apiKey = options.apiKey;
|
|
647
|
+
this.fetchImpl = options.fetch ?? globalThis.fetch;
|
|
648
|
+
this.baseHeaders = options.headers ?? {};
|
|
649
|
+
}
|
|
650
|
+
async request(method, path, opts) {
|
|
651
|
+
const url = new URL(this.baseUrl + path);
|
|
652
|
+
if (opts.query) {
|
|
653
|
+
for (const [key, value] of Object.entries(opts.query)) {
|
|
654
|
+
if (value !== undefined && value !== null)
|
|
655
|
+
url.searchParams.set(key, String(value));
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
const headers = { Accept: "application/json", ...this.baseHeaders, ...opts.init?.headers };
|
|
659
|
+
if (this.apiKey)
|
|
660
|
+
headers["x-api-key"] = this.apiKey;
|
|
661
|
+
let payload;
|
|
662
|
+
if (opts.body !== undefined) {
|
|
663
|
+
headers["Content-Type"] = "application/json";
|
|
664
|
+
payload = JSON.stringify(opts.body);
|
|
665
|
+
}
|
|
666
|
+
const response = await this.fetchImpl(url.toString(), { ...opts.init, method, headers, body: payload });
|
|
667
|
+
const text = await response.text();
|
|
668
|
+
const data = text ? (() => {
|
|
669
|
+
try {
|
|
670
|
+
return JSON.parse(text);
|
|
671
|
+
} catch {
|
|
672
|
+
return text;
|
|
673
|
+
}
|
|
674
|
+
})() : undefined;
|
|
675
|
+
if (!response.ok) {
|
|
676
|
+
throw new ApiError(response.status, `${method} ${path} failed: ${response.status}`, data);
|
|
677
|
+
}
|
|
678
|
+
return data;
|
|
679
|
+
}
|
|
680
|
+
async listProjects(init) {
|
|
681
|
+
return this.request("GET", `/v1/projects`, {
|
|
682
|
+
body: undefined,
|
|
683
|
+
query: undefined,
|
|
684
|
+
init
|
|
685
|
+
});
|
|
686
|
+
}
|
|
687
|
+
async createProject(body, init) {
|
|
688
|
+
return this.request("POST", `/v1/projects`, {
|
|
689
|
+
body,
|
|
690
|
+
query: undefined,
|
|
691
|
+
init
|
|
692
|
+
});
|
|
693
|
+
}
|
|
694
|
+
async getProject(id, init) {
|
|
695
|
+
return this.request("GET", `/v1/projects/${encodeURIComponent(String(id))}`, {
|
|
696
|
+
body: undefined,
|
|
697
|
+
query: undefined,
|
|
698
|
+
init
|
|
699
|
+
});
|
|
700
|
+
}
|
|
701
|
+
async getStats(init) {
|
|
702
|
+
return this.request("GET", `/v1/stats`, {
|
|
703
|
+
body: undefined,
|
|
704
|
+
query: undefined,
|
|
705
|
+
init
|
|
706
|
+
});
|
|
707
|
+
}
|
|
708
|
+
async listTasks(query, init) {
|
|
709
|
+
return this.request("GET", `/v1/tasks`, {
|
|
710
|
+
body: undefined,
|
|
711
|
+
query,
|
|
712
|
+
init
|
|
713
|
+
});
|
|
714
|
+
}
|
|
715
|
+
async createTask(body, init) {
|
|
716
|
+
return this.request("POST", `/v1/tasks`, {
|
|
717
|
+
body,
|
|
718
|
+
query: undefined,
|
|
719
|
+
init
|
|
720
|
+
});
|
|
721
|
+
}
|
|
722
|
+
async getTask(id, init) {
|
|
723
|
+
return this.request("GET", `/v1/tasks/${encodeURIComponent(String(id))}`, {
|
|
724
|
+
body: undefined,
|
|
725
|
+
query: undefined,
|
|
726
|
+
init
|
|
727
|
+
});
|
|
728
|
+
}
|
|
729
|
+
async deleteTask(id, init) {
|
|
730
|
+
return this.request("DELETE", `/v1/tasks/${encodeURIComponent(String(id))}`, {
|
|
731
|
+
body: undefined,
|
|
732
|
+
query: undefined,
|
|
733
|
+
init
|
|
734
|
+
});
|
|
735
|
+
}
|
|
736
|
+
async updateTask(id, body, init) {
|
|
737
|
+
return this.request("PATCH", `/v1/tasks/${encodeURIComponent(String(id))}`, {
|
|
738
|
+
body,
|
|
739
|
+
query: undefined,
|
|
740
|
+
init
|
|
741
|
+
});
|
|
742
|
+
}
|
|
743
|
+
async completeTask(id, init) {
|
|
744
|
+
return this.request("POST", `/v1/tasks/${encodeURIComponent(String(id))}/complete`, {
|
|
745
|
+
body: undefined,
|
|
746
|
+
query: undefined,
|
|
747
|
+
init
|
|
748
|
+
});
|
|
749
|
+
}
|
|
750
|
+
async startTask(id, init) {
|
|
751
|
+
return this.request("POST", `/v1/tasks/${encodeURIComponent(String(id))}/start`, {
|
|
752
|
+
body: undefined,
|
|
753
|
+
query: undefined,
|
|
754
|
+
init
|
|
755
|
+
});
|
|
756
|
+
}
|
|
757
|
+
}
|
|
625
758
|
export {
|
|
626
759
|
createClient,
|
|
760
|
+
TodosV1Client,
|
|
761
|
+
ApiError as TodosV1ApiError,
|
|
627
762
|
TodosUnauthorizedError,
|
|
628
763
|
TodosTimeoutError,
|
|
629
764
|
TodosRateLimitError,
|