@hasna/todos 0.15.34 → 0.15.35

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/mcp/index.js CHANGED
@@ -2096,6 +2096,10 @@ var init_migrations = __esm(() => {
2096
2096
  );
2097
2097
  INSERT OR IGNORE INTO _migrations (id) VALUES (70);
2098
2098
  COMMIT;
2099
+ `,
2100
+ `BEGIN;
2101
+ INSERT OR IGNORE INTO _migrations (id) VALUES (71);
2102
+ COMMIT;
2099
2103
  `
2100
2104
  ];
2101
2105
  });
@@ -2769,6 +2773,8 @@ function ensureSchema(db) {
2769
2773
  ensureColumn("projects", "task_list_id", "TEXT");
2770
2774
  ensureColumn("projects", "task_prefix", "TEXT");
2771
2775
  ensureColumn("projects", "task_counter", "INTEGER NOT NULL DEFAULT 0");
2776
+ ensureColumn("projects", "parent_id", "TEXT REFERENCES projects(id) ON DELETE SET NULL");
2777
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_projects_parent_id ON projects(parent_id)");
2772
2778
  ensureColumn("tasks", "plan_id", "TEXT REFERENCES plans(id) ON DELETE SET NULL");
2773
2779
  ensureColumn("tasks", "task_list_id", "TEXT REFERENCES task_lists(id) ON DELETE SET NULL");
2774
2780
  ensureColumn("tasks", "short_id", "TEXT");
@@ -10005,10 +10011,12 @@ __export(exports_projects, {
10005
10011
  renameProject: () => renameProject,
10006
10012
  removeProjectSource: () => removeProjectSource,
10007
10013
  removeMachineLocalPath: () => removeMachineLocalPath,
10014
+ orderProjectsParentFirst: () => orderProjectsParentFirst,
10008
10015
  nextTaskShortId: () => nextTaskShortId,
10009
10016
  listProjects: () => listProjects,
10010
10017
  listProjectSources: () => listProjectSources,
10011
10018
  listMachineLocalPaths: () => listMachineLocalPaths,
10019
+ listChildProjects: () => listChildProjects,
10012
10020
  getProjectWithSources: () => getProjectWithSources,
10013
10021
  getProjectByPath: () => getProjectByPath,
10014
10022
  getProject: () => getProject,
@@ -10016,6 +10024,7 @@ __export(exports_projects, {
10016
10024
  ensureProject: () => ensureProject,
10017
10025
  deleteProject: () => deleteProject,
10018
10026
  createProject: () => createProject,
10027
+ assertNotProjectAncestor: () => assertNotProjectAncestor,
10019
10028
  addProjectSource: () => addProjectSource
10020
10029
  });
10021
10030
  function slugify(name) {
@@ -10047,17 +10056,24 @@ function createProject(input, db) {
10047
10056
  const id = uuid();
10048
10057
  const timestamp2 = now();
10049
10058
  const derivedSlug = slugify(input.name);
10050
- const taskListId = input.task_list_id === undefined ? `todos-${derivedSlug}` : slugify(input.task_list_id);
10059
+ const taskListId = input.task_list_id === undefined ? derivedSlug : slugify(input.task_list_id);
10051
10060
  if (!derivedSlug || !taskListId)
10052
10061
  throw new Error("Project name and task-list slug must be non-empty");
10053
10062
  const slugConflict = d.query("SELECT id FROM projects WHERE task_list_id = ? LIMIT 1").get(taskListId);
10054
10063
  if (slugConflict || !claimCanonicalSlug("project", "global", taskListId, id, d)) {
10055
10064
  throw new ResourceConflictError("PROJECT_SLUG_CONFLICT", `Project slug "${taskListId}" already exists`);
10056
10065
  }
10066
+ const parentId = input.parent_id ?? null;
10067
+ if (parentId !== null) {
10068
+ const parent = getProject(parentId, d);
10069
+ if (!parent)
10070
+ throw new ProjectNotFoundError(parentId);
10071
+ assertNotProjectAncestor(id, parentId, d);
10072
+ }
10057
10073
  const taskPrefix = input.task_prefix || generatePrefix(input.name, d);
10058
10074
  const machineId = currentStorageMachineId(d);
10059
- d.run(`INSERT INTO projects (id, name, path, description, task_list_id, task_prefix, task_counter, created_at, updated_at, machine_id)
10060
- VALUES (?, ?, ?, ?, ?, ?, 0, ?, ?, ?)`, [id, input.name, input.path, input.description || null, taskListId, taskPrefix, timestamp2, timestamp2, machineId]);
10075
+ d.run(`INSERT INTO projects (id, name, path, description, task_list_id, task_prefix, task_counter, parent_id, created_at, updated_at, machine_id)
10076
+ VALUES (?, ?, ?, ?, ?, ?, 0, ?, ?, ?, ?)`, [id, input.name, input.path, input.description || null, taskListId, taskPrefix, parentId, timestamp2, timestamp2, machineId]);
10061
10077
  return getProject(id, d);
10062
10078
  })();
10063
10079
  }
@@ -10082,6 +10098,64 @@ function listProjects(db) {
10082
10098
  const d = db || getDatabase();
10083
10099
  return d.query("SELECT * FROM projects ORDER BY name").all();
10084
10100
  }
10101
+ function listChildProjects(parentId, db) {
10102
+ const d = db || getDatabase();
10103
+ return d.query("SELECT * FROM projects WHERE parent_id = ? ORDER BY name").all(parentId);
10104
+ }
10105
+ function orderProjectsParentFirst(projects) {
10106
+ const projectId = (project) => {
10107
+ const id = project.id;
10108
+ return typeof id === "string" && id.length > 0 ? id : null;
10109
+ };
10110
+ const parentId = (project) => {
10111
+ const parent = project.parent_id;
10112
+ return parent == null ? null : String(parent);
10113
+ };
10114
+ const byId = new Set;
10115
+ for (const project of projects) {
10116
+ const id = projectId(project);
10117
+ if (id !== null)
10118
+ byId.add(id);
10119
+ }
10120
+ const ordered = [];
10121
+ const emitted = new Set;
10122
+ let remaining = [...projects];
10123
+ let progress = true;
10124
+ while (progress && remaining.length > 0) {
10125
+ progress = false;
10126
+ const deferred = [];
10127
+ for (const project of remaining) {
10128
+ const parent = parentId(project);
10129
+ if (parent === null || emitted.has(parent) || !byId.has(parent)) {
10130
+ ordered.push(project);
10131
+ const id = projectId(project);
10132
+ if (id !== null)
10133
+ emitted.add(id);
10134
+ progress = true;
10135
+ } else {
10136
+ deferred.push(project);
10137
+ }
10138
+ }
10139
+ remaining = deferred;
10140
+ }
10141
+ ordered.push(...remaining);
10142
+ return ordered;
10143
+ }
10144
+ function assertNotProjectAncestor(projectId, ancestorId, db) {
10145
+ const d = db || getDatabase();
10146
+ let cursor = ancestorId;
10147
+ const seen = new Set;
10148
+ while (cursor !== null) {
10149
+ if (cursor === projectId) {
10150
+ throw new ResourceConflictError("PROJECT_PARENT_CYCLE", `Project "${projectId}" cannot be placed under its own descendant`);
10151
+ }
10152
+ if (seen.has(cursor))
10153
+ break;
10154
+ seen.add(cursor);
10155
+ const row = d.query("SELECT parent_id FROM projects WHERE id = ?").get(cursor);
10156
+ cursor = row?.parent_id ?? null;
10157
+ }
10158
+ }
10085
10159
  function updateProject(id, input, db) {
10086
10160
  const d = db || getDatabase();
10087
10161
  const project = getProject(id, d);
@@ -10104,6 +10178,16 @@ function updateProject(id, input, db) {
10104
10178
  sets.push("path = ?");
10105
10179
  params.push(input.path);
10106
10180
  }
10181
+ if (input.parent_id !== undefined) {
10182
+ if (input.parent_id !== null) {
10183
+ const parent = getProject(input.parent_id, d);
10184
+ if (!parent)
10185
+ throw new ProjectNotFoundError(input.parent_id);
10186
+ assertNotProjectAncestor(id, input.parent_id, d);
10187
+ }
10188
+ sets.push("parent_id = ?");
10189
+ params.push(input.parent_id);
10190
+ }
10107
10191
  params.push(id);
10108
10192
  d.run(`UPDATE projects SET ${sets.join(", ")} WHERE id = ?`, params);
10109
10193
  return getProject(id, d);
@@ -21265,7 +21349,31 @@ function classifyRemoteRequestError(baseUrl, route, error) {
21265
21349
  }
21266
21350
  throw error;
21267
21351
  }
21268
- function protectRemoteClient(client) {
21352
+ function withBoundedRemoteRequest(options, requestTimeoutMs, run) {
21353
+ const controller = new AbortController;
21354
+ const onBaseAbort = () => controller.abort();
21355
+ if (options?.signal) {
21356
+ if (options.signal.aborted)
21357
+ controller.abort();
21358
+ else
21359
+ options.signal.addEventListener("abort", onBaseAbort, { once: true });
21360
+ }
21361
+ let timer;
21362
+ const deadline = new Promise((_, reject) => {
21363
+ timer = setTimeout(() => {
21364
+ controller.abort();
21365
+ reject(new DOMException(`Todos remote request exceeded the ${requestTimeoutMs}ms bounded request timeout`, "AbortError"));
21366
+ }, requestTimeoutMs);
21367
+ });
21368
+ const attempt = run({ ...options, signal: controller.signal });
21369
+ attempt.catch(() => {});
21370
+ return Promise.race([attempt, deadline]).finally(() => {
21371
+ if (timer)
21372
+ clearTimeout(timer);
21373
+ options?.signal?.removeEventListener("abort", onBaseAbort);
21374
+ });
21375
+ }
21376
+ function protectRemoteClient(client, requestTimeoutMs) {
21269
21377
  const baseUrl = remoteAuthorityBase(client);
21270
21378
  const protect = async (route, request) => {
21271
21379
  try {
@@ -21274,25 +21382,26 @@ function protectRemoteClient(client) {
21274
21382
  return classifyRemoteRequestError(baseUrl, route, error);
21275
21383
  }
21276
21384
  };
21385
+ const bounded = (options, run) => withBoundedRemoteRequest(options, requestTimeoutMs, run);
21277
21386
  const transport = client.transport;
21278
21387
  const protectedTransport = {
21279
21388
  baseUrl: transport.baseUrl,
21280
- request: (method, path, body, options) => protect(path, () => transport.request(method, path, body, options)),
21281
- get: (path, options) => protect(path, () => transport.get(path, options)),
21282
- post: (path, body, options) => protect(path, () => transport.post(path, body, options)),
21283
- put: (path, body, options) => protect(path, () => transport.put(path, body, options)),
21284
- patch: (path, body, options) => protect(path, () => transport.patch(path, body, options)),
21285
- del: (path, body, options) => protect(path, () => transport.del(path, body, options))
21389
+ request: (method, path, body, options) => protect(path, () => bounded(options, (opts) => transport.request(method, path, body, opts))),
21390
+ get: (path, options) => protect(path, () => bounded(options, (opts) => transport.get(path, opts))),
21391
+ post: (path, body, options) => protect(path, () => bounded(options, (opts) => transport.post(path, body, opts))),
21392
+ put: (path, body, options) => protect(path, () => bounded(options, (opts) => transport.put(path, body, opts))),
21393
+ patch: (path, body, options) => protect(path, () => bounded(options, (opts) => transport.patch(path, body, opts))),
21394
+ del: (path, body, options) => protect(path, () => bounded(options, (opts) => transport.del(path, body, opts)))
21286
21395
  };
21287
21396
  return {
21288
21397
  name: client.name,
21289
21398
  baseUrl: client.baseUrl,
21290
21399
  transport: protectedTransport,
21291
- list: (resource, options) => protect(`/${resource}`, () => client.list(resource, options)),
21292
- get: (resource, id, options) => protect(`/${resource}/${encodeURIComponent(id)}`, () => client.get(resource, id, options)),
21293
- create: (resource, body, options) => protect(`/${resource}`, () => client.create(resource, body, options)),
21294
- update: (resource, id, patch, options) => protect(`/${resource}/${encodeURIComponent(id)}`, () => client.update(resource, id, patch, options)),
21295
- delete: (resource, id, options) => protect(`/${resource}/${encodeURIComponent(id)}`, () => client.delete(resource, id, options))
21400
+ list: (resource, options) => protect(`/${resource}`, () => bounded(options, (opts) => client.list(resource, opts))),
21401
+ get: (resource, id, options) => protect(`/${resource}/${encodeURIComponent(id)}`, () => bounded(options, (opts) => client.get(resource, id, opts))),
21402
+ create: (resource, body, options) => protect(`/${resource}`, () => bounded(options, (opts) => client.create(resource, body, opts))),
21403
+ update: (resource, id, patch, options) => protect(`/${resource}/${encodeURIComponent(id)}`, () => bounded(options, (opts) => client.update(resource, id, patch, opts))),
21404
+ delete: (resource, id, options) => protect(`/${resource}/${encodeURIComponent(id)}`, () => bounded(options, (opts) => client.delete(resource, id, opts)))
21296
21405
  };
21297
21406
  }
21298
21407
  function remoteAuthorityBase(client) {
@@ -21313,17 +21422,18 @@ async function requiredRemoteRoute(client, route, request, recognized404Codes =
21313
21422
  throw error;
21314
21423
  }
21315
21424
  }
21316
- function getTodosCloudClient(env = process.env) {
21425
+ function getTodosCloudClient(env = process.env, requestTimeoutMs = REMOTE_REQUEST_TIMEOUT_MS) {
21317
21426
  if (requestedTransport(env) !== "http")
21318
21427
  return null;
21319
21428
  const resolved = resolveStorageClient("todos", requireTodosRemoteAuthorityEnv(env), {
21320
- fetchImpl: (input, init) => globalThis.fetch(input, { ...init, redirect: "manual" })
21429
+ fetchImpl: (input, init) => globalThis.fetch(input, { ...init, redirect: "manual" }),
21430
+ timeoutMs: requestTimeoutMs
21321
21431
  });
21322
21432
  if (resolved.transport === "cloud-http")
21323
- return protectRemoteClient(resolved.client);
21433
+ return protectRemoteClient(resolved.client, requestTimeoutMs);
21324
21434
  const transportName = resolved.transport;
21325
21435
  if (transportName === "http")
21326
- return protectRemoteClient(resolved.client);
21436
+ return protectRemoteClient(resolved.client, requestTimeoutMs);
21327
21437
  return null;
21328
21438
  }
21329
21439
  function unwrapTask(raw) {
@@ -21795,7 +21905,7 @@ async function cloudResolveTaskListRef(client, ref, projectId) {
21795
21905
  return input.toLowerCase();
21796
21906
  return (await cloudResolveTaskList(client, ref, projectId)).id;
21797
21907
  }
21798
- var UUID_RE, completionCapabilityCache, retryCapabilityCache, taskCreatorCapabilityCache, gitRefCapabilityCache, remoteCommandCapabilityCache, LEGACY_STORAGE_MODE_KEYS, PRIORITY_RANK, listTagsCapabilityCache;
21908
+ var UUID_RE, completionCapabilityCache, retryCapabilityCache, taskCreatorCapabilityCache, gitRefCapabilityCache, remoteCommandCapabilityCache, LEGACY_STORAGE_MODE_KEYS, REMOTE_REQUEST_TIMEOUT_MS = 1e4, PRIORITY_RANK, listTagsCapabilityCache;
21799
21909
  var init_cloud_router = __esm(() => {
21800
21910
  init_types();
21801
21911
  init_redaction();
@@ -22322,7 +22432,7 @@ function addSourceOnce(projectId, type, name, uri, metadata, db) {
22322
22432
  function bootstrapProject(options = {}, db) {
22323
22433
  const d = db || getDatabase();
22324
22434
  const discovery = discoverProjectWorkspace(options.path);
22325
- const taskListSlug = options.taskListSlug || `todos-${slugify(options.name || discovery.projectName)}`;
22435
+ const taskListSlug = options.taskListSlug || slugify(options.name || discovery.projectName);
22326
22436
  if (options.dryRun) {
22327
22437
  return {
22328
22438
  dryRun: true,
@@ -28449,6 +28559,7 @@ function registerTaskProjectTools(server, ctx) {
28449
28559
  name: exports_external.string().describe("Project name"),
28450
28560
  path: exports_external.string().describe("Unique filesystem path for the project"),
28451
28561
  description: exports_external.string().optional(),
28562
+ parent_id: exports_external.string().optional().describe("Optional parent project id to create this as a sub-project"),
28452
28563
  status: exports_external.enum(["active", "completed", "on_hold", "archived"]).optional(),
28453
28564
  short_id: exports_external.string().nullable().optional().describe("Short ID (auto-generated if omitted)"),
28454
28565
  metadata: exports_external.record(exports_external.unknown()).optional()
@@ -35931,7 +36042,7 @@ var package_default;
35931
36042
  var init_package = __esm(() => {
35932
36043
  package_default = {
35933
36044
  name: "@hasna/todos",
35934
- version: "0.15.34",
36045
+ version: "0.15.35",
35935
36046
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
35936
36047
  type: "module",
35937
36048
  main: "dist/index.js",
@@ -36006,6 +36117,9 @@ var init_package = __esm(() => {
36006
36117
  "verify:release-review": "bun run scripts/verify-npm-release-agent-review.ts",
36007
36118
  "verify:attested-container-candidate": "bun run scripts/attested-container-candidate.ts verify",
36008
36119
  "test:attested-container-candidate": "bun test scripts/attested-container-candidate.test.ts",
36120
+ "emit:iapp-deployment-compatibility-vector": "bun run scripts/attested-container-compatibility-vector.ts emit",
36121
+ "verify:iapp-deployment-compatibility-vector": "bun run scripts/attested-container-compatibility-vector.ts verify",
36122
+ "test:attested-container-compatibility-vector": "bun test scripts/attested-container-compatibility-vector.test.ts",
36009
36123
  "issue:release-review": "bun run scripts/issue-npm-release-agent-review.ts",
36010
36124
  prepublishOnly: "bun run scripts/verify-public-release.ts --mode=publish",
36011
36125
  postinstall: "mkdir -p $HOME/.hasna/todos $HOME/.hasna/todos/training 2>/dev/null || true"
@@ -37045,6 +37159,7 @@ function createAgentProjectDemoBundle() {
37045
37159
  task_list_id: ids.list,
37046
37160
  task_prefix: "DEMO",
37047
37161
  task_counter: 4,
37162
+ parent_id: null,
37048
37163
  created_at: createdAt,
37049
37164
  updated_at: completedAt
37050
37165
  });
@@ -45611,7 +45726,7 @@ function importSqliteTodosStorageSnapshot(snapshot, db) {
45611
45726
  }
45612
45727
  }
45613
45728
  };
45614
- applyRows("projects", "projects", PROJECT_COLUMNS, snapshot.projects, "updated_at");
45729
+ applyRows("projects", "projects", PROJECT_COLUMNS, orderProjectsParentFirst(snapshot.projects), "updated_at");
45615
45730
  applyRows("project_machine_paths", "project_machine_paths", PROJECT_MACHINE_PATH_COLUMNS, snapshot.projectMachinePaths ?? [], "updated_at");
45616
45731
  applyRows("agents", "agents", AGENT_COLUMNS, snapshot.agents, "last_seen_at");
45617
45732
  applyRows("task_lists", "task_lists", TASK_LIST_COLUMNS, snapshot.taskLists, "updated_at");
@@ -45842,6 +45957,7 @@ var init_sqlite_snapshot = __esm(() => {
45842
45957
  "task_list_id",
45843
45958
  "task_prefix",
45844
45959
  "task_counter",
45960
+ "parent_id",
45845
45961
  "created_at",
45846
45962
  "updated_at",
45847
45963
  "machine_id",
@@ -47659,8 +47775,12 @@ class PostgresJsonRecordStore {
47659
47775
  OR ($11::text <> $2
47660
47776
  AND NOT EXISTS (SELECT 1 FROM parent_chain WHERE object_id = $2)
47661
47777
  AND NOT EXISTS (SELECT 1 FROM parent_chain WHERE cycle))) AS parent_acyclic,
47662
- (SELECT count(*) FROM locked_plans) = jsonb_array_length($7::jsonb) AS all_plans_found,
47663
- ($8::text IS NULL OR EXISTS (SELECT 1 FROM locked_plans WHERE object_id = $8)) AS target_plan_found,
47778
+ (COALESCE((SELECT payload->>'plan_id' FROM locked_task), '')
47779
+ IS DISTINCT FROM COALESCE($3::jsonb->>'plan_id', '')) AS membership_changed,
47780
+ (NOT (COALESCE((SELECT payload->>'plan_id' FROM locked_task), '')
47781
+ IS DISTINCT FROM COALESCE($3::jsonb->>'plan_id', ''))
47782
+ OR $8::text IS NULL
47783
+ OR EXISTS (SELECT 1 FROM locked_plans WHERE object_id = $8)) AS target_plan_found,
47664
47784
  (SELECT payload->>'project_id' FROM locked_plans WHERE object_id = $8) AS target_project_id
47665
47785
  ), guarded AS (
47666
47786
  SELECT
@@ -47683,7 +47803,6 @@ class PostgresJsonRecordStore {
47683
47803
  AND guarded.version_matches
47684
47804
  AND guarded.parent_found
47685
47805
  AND guarded.parent_acyclic
47686
- AND guarded.all_plans_found
47687
47806
  AND guarded.target_plan_found
47688
47807
  AND NOT guarded.project_conflict
47689
47808
  ON CONFLICT (service, object_type, object_id) DO UPDATE SET
@@ -47699,7 +47818,7 @@ class PostgresJsonRecordStore {
47699
47818
  RETURNING payload
47700
47819
  )
47701
47820
  SELECT guarded.task_found, guarded.version_matches, guarded.parent_found, guarded.parent_acyclic,
47702
- guarded.all_plans_found, guarded.target_plan_found, guarded.project_conflict,
47821
+ guarded.membership_changed, guarded.target_plan_found, guarded.project_conflict,
47703
47822
  (SELECT payload FROM stored) AS payload,
47704
47823
  (SELECT payload FROM locked_task) AS current_payload
47705
47824
  FROM guarded`, [
@@ -47731,7 +47850,7 @@ class PostgresJsonRecordStore {
47731
47850
  if (parentGuard && !row?.parent_acyclic && parentGuard.parentId) {
47732
47851
  throw new ResourceConflictError("TASK_PARENT_CYCLE", `TASK_PARENT_CYCLE: assigning parent ${parentGuard.parentId} to task ${value.id} would create or retain a parent cycle`);
47733
47852
  }
47734
- if (!row?.all_plans_found || !row.target_plan_found) {
47853
+ if (!row?.target_plan_found) {
47735
47854
  throw new PlanProjectLinkError("PLAN_PROJECT_LINK_PLAN_NOT_FOUND", `Plan membership changed through a missing plan: ${targetPlanId ?? planIds.join(", ")}`, { plan_ids: planIds, target_plan_id: targetPlanId });
47736
47855
  }
47737
47856
  if (row.project_conflict) {
@@ -48940,17 +49059,26 @@ async function getChangedSince(since, filters, store) {
48940
49059
  async function createProject2(input, store, context) {
48941
49060
  const timestamp4 = new Date().toISOString();
48942
49061
  const derivedSlug = slugifyRaw(input.name);
48943
- const taskListId = input.task_list_id === undefined ? `todos-${derivedSlug}` : slugifyRaw(input.task_list_id);
49062
+ const taskListId = input.task_list_id === undefined ? derivedSlug : slugifyRaw(input.task_list_id);
48944
49063
  if (!derivedSlug || !taskListId)
48945
49064
  throw new Error("Project name and task-list slug must be non-empty");
49065
+ const parentId = input.parent_id ?? null;
49066
+ const id = randomUUID4();
49067
+ if (parentId !== null) {
49068
+ const parent = await store.get("projects", parentId);
49069
+ if (!parent)
49070
+ throw new ProjectNotFoundError(parentId);
49071
+ await assertNotProjectAncestorPostgres(id, parentId, store);
49072
+ }
48946
49073
  const project = {
48947
- id: randomUUID4(),
49074
+ id,
48948
49075
  name: input.name,
48949
49076
  path: input.path,
48950
49077
  description: input.description ?? null,
48951
49078
  task_list_id: taskListId,
48952
49079
  task_prefix: input.task_prefix ?? await generateProjectPrefix(input.name, store),
48953
49080
  task_counter: 0,
49081
+ parent_id: parentId,
48954
49082
  created_at: timestamp4,
48955
49083
  updated_at: timestamp4,
48956
49084
  machine_id: store.machineId(context),
@@ -48958,12 +49086,38 @@ async function createProject2(input, store, context) {
48958
49086
  };
48959
49087
  return store.upsert("projects", project, context);
48960
49088
  }
49089
+ async function assertNotProjectAncestorPostgres(projectId, candidateParentId, store) {
49090
+ const all = await store.list("projects");
49091
+ const byId = new Map(all.map((project) => [project.id, project.parent_id ?? null]));
49092
+ let cursor = candidateParentId;
49093
+ const seen = new Set;
49094
+ while (cursor !== null) {
49095
+ if (cursor === projectId) {
49096
+ throw new ResourceConflictError("PROJECT_PARENT_CYCLE", `Project "${projectId}" cannot be placed under its own descendant`);
49097
+ }
49098
+ if (seen.has(cursor))
49099
+ break;
49100
+ seen.add(cursor);
49101
+ cursor = byId.get(cursor) ?? null;
49102
+ }
49103
+ }
48961
49104
  async function updateProject2(id, input, store) {
48962
49105
  if ("task_list_id" in input) {
48963
49106
  throw new Error("task_list_id cannot be changed by updateProject; use renameProject for an atomic canonical rename");
48964
49107
  }
48965
49108
  const project = await requireRecord("projects", id, store);
48966
- const updated = { ...project, ...definedPatch(input), updated_at: new Date().toISOString() };
49109
+ if (input.parent_id !== undefined && input.parent_id !== null) {
49110
+ const parent = await store.get("projects", input.parent_id);
49111
+ if (!parent)
49112
+ throw new ProjectNotFoundError(input.parent_id);
49113
+ await assertNotProjectAncestorPostgres(id, input.parent_id, store);
49114
+ }
49115
+ const updated = {
49116
+ ...project,
49117
+ ...definedPatch(input),
49118
+ ...input.parent_id !== undefined ? { parent_id: input.parent_id } : {},
49119
+ updated_at: new Date().toISOString()
49120
+ };
48967
49121
  return store.upsert("projects", updated);
48968
49122
  }
48969
49123
  async function createPlan2(input, store, context) {
@@ -50834,7 +50988,7 @@ class StagedSqliteTodosProjectRegistrationTransaction {
50834
50988
  }
50835
50989
  async createProject(input) {
50836
50990
  const derivedSlug = normalizeSlug(input.name);
50837
- const taskListId = input.task_list_id === undefined ? `todos-${derivedSlug}` : normalizeSlug(input.task_list_id);
50991
+ const taskListId = input.task_list_id === undefined ? derivedSlug : normalizeSlug(input.task_list_id);
50838
50992
  if (!derivedSlug || !taskListId) {
50839
50993
  throw new Error("Project name and task-list slug must be non-empty");
50840
50994
  }
@@ -50846,6 +51000,7 @@ class StagedSqliteTodosProjectRegistrationTransaction {
50846
51000
  task_list_id: taskListId,
50847
51001
  task_prefix: input.task_prefix ?? this.availableProjectPrefix(input.name),
50848
51002
  task_counter: 0,
51003
+ parent_id: input.parent_id ?? null,
50849
51004
  created_at: now(),
50850
51005
  updated_at: now(),
50851
51006
  machine_id: currentStorageMachineId(this.db)
@@ -50856,14 +51011,15 @@ class StagedSqliteTodosProjectRegistrationTransaction {
50856
51011
  try {
50857
51012
  const result = this.db.run(`INSERT INTO projects (
50858
51013
  id, name, path, description, task_list_id, task_prefix,
50859
- task_counter, created_at, updated_at, machine_id
50860
- ) VALUES (?, ?, ?, ?, ?, ?, 0, ?, ?, ?)`, [
51014
+ task_counter, parent_id, created_at, updated_at, machine_id
51015
+ ) VALUES (?, ?, ?, ?, ?, ?, 0, ?, ?, ?, ?)`, [
50861
51016
  project.id,
50862
51017
  project.name,
50863
51018
  project.path,
50864
51019
  project.description,
50865
51020
  project.task_list_id,
50866
51021
  project.task_prefix,
51022
+ project.parent_id,
50867
51023
  project.created_at,
50868
51024
  project.updated_at,
50869
51025
  project.machine_id ?? null
@@ -51147,7 +51303,10 @@ function taskListSlug(projectSlug) {
51147
51303
  if (!slug || slug !== projectSlug) {
51148
51304
  throw new TodosProjectRegistrationError("TODOS_PROJECT_REGISTRATION_INVALID_INPUT", "project_slug must be canonical kebab-case");
51149
51305
  }
51150
- return `todos-${slug}`;
51306
+ return slug;
51307
+ }
51308
+ function legacyTaskListSlug(projectSlug) {
51309
+ return `todos-${normalizeSlug(projectSlug)}`;
51151
51310
  }
51152
51311
  function deterministicTaskPrefix(projectSlug) {
51153
51312
  const letters = projectSlug.replace(/[^a-z0-9]/gi, "").toUpperCase();
@@ -51666,6 +51825,12 @@ class PackageOwnedTodosProjectRegistrationAuthority {
51666
51825
  created_by_operation: false
51667
51826
  };
51668
51827
  }
51828
+ if (request.bind_existing === true && conflict2.path === path && conflict2.task_list_id === legacyTaskListSlug(request.project_slug)) {
51829
+ return {
51830
+ record: boundExistingProjectRecord(conflict2),
51831
+ created_by_operation: false
51832
+ };
51833
+ }
51669
51834
  return this.terminalFor(transaction, request, normalizedCallDigest(request), "target_already_exists", { targetId: conflict2.id });
51670
51835
  }
51671
51836
  await this.fault("before_object_write", request);
@@ -51702,6 +51867,15 @@ class PackageOwnedTodosProjectRegistrationAuthority {
51702
51867
  }
51703
51868
  return this.terminalFor(transaction, request, normalizedCallDigest(request), "target_already_exists", { targetId: conflict.id });
51704
51869
  }
51870
+ if (request.bind_existing === true) {
51871
+ const legacy = await transaction.findTaskListConflict(todosProjectId, legacyTaskListSlug(request.project_slug));
51872
+ if (legacy && legacy.project_id === todosProjectId) {
51873
+ return {
51874
+ record: boundExistingTaskListRecord(legacy),
51875
+ created_by_operation: false
51876
+ };
51877
+ }
51878
+ }
51705
51879
  await this.fault("before_object_write", request);
51706
51880
  const taskList = await transaction.createTaskList({
51707
51881
  name: request.project_name,
@@ -55631,7 +55805,8 @@ function buildV1OpenApiDocument(version = getPackageVersion()) {
55631
55805
  path: { type: "string", minLength: 1 },
55632
55806
  description: { type: "string" },
55633
55807
  task_list_id: { type: "string", minLength: 1, pattern: "^[a-z0-9]+(?:-[a-z0-9]+)*$" },
55634
- task_prefix: { type: "string", minLength: 1 }
55808
+ task_prefix: { type: "string", minLength: 1 },
55809
+ parent_id: { type: "string", minLength: 1 }
55635
55810
  }
55636
55811
  },
55637
55812
  UpdateProjectInput: {
@@ -55641,7 +55816,8 @@ function buildV1OpenApiDocument(version = getPackageVersion()) {
55641
55816
  properties: {
55642
55817
  name: { type: "string", minLength: 1 },
55643
55818
  path: { type: "string", minLength: 1 },
55644
- description: { type: "string", nullable: true }
55819
+ description: { type: "string", nullable: true },
55820
+ parent_id: { type: "string", minLength: 1, nullable: true }
55645
55821
  }
55646
55822
  },
55647
55823
  RenameProjectInput: {
@@ -57940,6 +58116,7 @@ var init_openapi = __esm(() => {
57940
58116
  task_list_id: { type: "string", nullable: true },
57941
58117
  task_prefix: { type: "string", nullable: true },
57942
58118
  task_counter: { type: "number" },
58119
+ parent_id: { type: "string", nullable: true },
57943
58120
  created_at: { type: "string" },
57944
58121
  updated_at: { type: "string" }
57945
58122
  }
@@ -59357,7 +59534,7 @@ function validateProjectPatch(value) {
59357
59534
  if (!value || typeof value !== "object" || Array.isArray(value))
59358
59535
  return { ok: false, message: "project patch must be an object" };
59359
59536
  const body2 = value;
59360
- const allowed = new Set(["name", "path", "description"]);
59537
+ const allowed = new Set(["name", "path", "description", "parent_id"]);
59361
59538
  const unknown = Object.keys(body2).find((key2) => !allowed.has(key2));
59362
59539
  if (unknown)
59363
59540
  return { ok: false, message: `unknown project field: ${unknown}` };
@@ -59369,13 +59546,15 @@ function validateProjectPatch(value) {
59369
59546
  return { ok: false, message: "path must be a non-empty string" };
59370
59547
  if (body2["description"] !== undefined && body2["description"] !== null && typeof body2["description"] !== "string")
59371
59548
  return { ok: false, message: "description must be a string or null" };
59549
+ if (body2["parent_id"] !== undefined && body2["parent_id"] !== null && (typeof body2["parent_id"] !== "string" || !body2["parent_id"].trim()))
59550
+ return { ok: false, message: "parent_id must be a string or null" };
59372
59551
  return { ok: true, patch: body2 };
59373
59552
  }
59374
59553
  function validateProjectCreate(value) {
59375
59554
  if (!value || typeof value !== "object" || Array.isArray(value))
59376
59555
  return { ok: false, message: "project body must be an object" };
59377
59556
  const body2 = value;
59378
- const allowed = new Set(["name", "path", "description", "task_list_id", "task_prefix"]);
59557
+ const allowed = new Set(["name", "path", "description", "task_list_id", "task_prefix", "parent_id"]);
59379
59558
  const unknown = Object.keys(body2).find((key2) => !allowed.has(key2));
59380
59559
  if (unknown)
59381
59560
  return { ok: false, message: `unknown project field: ${unknown}` };
@@ -59393,6 +59572,9 @@ function validateProjectCreate(value) {
59393
59572
  if (body2["task_prefix"] !== undefined && (typeof body2["task_prefix"] !== "string" || !body2["task_prefix"].trim())) {
59394
59573
  return { ok: false, message: "task_prefix must be a non-empty string" };
59395
59574
  }
59575
+ if (body2["parent_id"] !== undefined && (typeof body2["parent_id"] !== "string" || !body2["parent_id"].trim())) {
59576
+ return { ok: false, message: "parent_id must be a non-empty string" };
59577
+ }
59396
59578
  return { ok: true, input: body2 };
59397
59579
  }
59398
59580
  function validatePlanCreate(value) {
@@ -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;AA2JjD,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,QAy7FlF"}
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;AA2JjD,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,QA07FlF"}
package/dist/mcp.js CHANGED
@@ -41,7 +41,7 @@ var __require = import.meta.require;
41
41
  // package.json
42
42
  var package_default = {
43
43
  name: "@hasna/todos",
44
- version: "0.15.34",
44
+ version: "0.15.35",
45
45
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
46
46
  type: "module",
47
47
  main: "dist/index.js",
@@ -116,6 +116,9 @@ var package_default = {
116
116
  "verify:release-review": "bun run scripts/verify-npm-release-agent-review.ts",
117
117
  "verify:attested-container-candidate": "bun run scripts/attested-container-candidate.ts verify",
118
118
  "test:attested-container-candidate": "bun test scripts/attested-container-candidate.test.ts",
119
+ "emit:iapp-deployment-compatibility-vector": "bun run scripts/attested-container-compatibility-vector.ts emit",
120
+ "verify:iapp-deployment-compatibility-vector": "bun run scripts/attested-container-compatibility-vector.ts verify",
121
+ "test:attested-container-compatibility-vector": "bun test scripts/attested-container-compatibility-vector.test.ts",
119
122
  "issue:release-review": "bun run scripts/issue-npm-release-agent-review.ts",
120
123
  prepublishOnly: "bun run scripts/verify-public-release.ts --mode=publish",
121
124
  postinstall: "mkdir -p $HOME/.hasna/todos $HOME/.hasna/todos/training 2>/dev/null || true"
@@ -1 +1 @@
1
- {"version":3,"file":"authority.d.ts","sourceRoot":"","sources":["../../src/project-registration/authority.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,OAAO,KAAK,EAEV,+BAA+B,EAMhC,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,KAAK,8CAA8C,EACnD,KAAK,sCAAsC,EAC5C,MAAM,eAAe,CAAC;AAEvB,OAAO,EAIL,KAAK,iCAAiC,EACtC,KAAK,wCAAwC,EAE7C,KAAK,kCAAkC,EACvC,KAAK,iCAAiC,EAEtC,KAAK,2CAA2C,EAChD,KAAK,qCAAqC,EAC1C,KAAK,oCAAoC,EACzC,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,KAAK,+BAA+B,EACpC,KAAK,oCAAoC,EACzC,KAAK,2CAA2C,EAChD,KAAK,wCAAwC,EAE7C,KAAK,wBAAwB,EAC7B,KAAK,+BAA+B,EACrC,MAAM,YAAY,CAAC;AAuBpB,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEvE;AAaD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIrE;AAED,wBAAgB,4CAA4C,CAAC,KAAK,EAAE;IAClE,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,iCAAiC,CAAC;IAC7C,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAKT;AA0zBD,qBAAa,6CACb,YAAW,iCAAiC;IAOxC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,QAAQ,CAAC,SAAS,EAAG,OAAO,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAA4D;gBAGxE,OAAO,EAAE,+BAA+B,EACzD,OAAO,GAAE,wCAA6C;IAyBlD,UAAU,IAAI,OAAO,CAAC,kCAAkC,CAAC;YAOjD,KAAK;YAiBL,WAAW;YASX,YAAY;YAgBZ,WAAW;YAuBX,yBAAyB;YA2DzB,YAAY;IAsHpB,MAAM,CACV,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,+BAA+B,CAAC;YAsG7B,kBAAkB;IAiE1B,SAAS,CAAC,OAAO,EAAE;QACvB,aAAa,EAAE,oCAAoC,CAAC;QACpD,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,8BAA8B,CAAC;IA0BrC,aAAa,CACjB,OAAO,EAAE,qCAAqC,GAC7C,OAAO,CAAC,oCAAoC,CAAC;IAkF1C,oBAAoB,CACxB,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,wBAAwB,CAAC;IA2I9B,iCAAiC,CACrC,aAAa,EAAE,+BAA+B,EAC9C,aAAa,EAAE,+BAA+B,EAC9C,aAAa,EAAE,2CAA2C,GACzD,OAAO,CAAC,wCAAwC,CAAC;YAwMtC,qBAAqB;IAgC7B,UAAU,CACd,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,+BAA+B,CAAC;IAqLrC,aAAa,CACjB,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,2CAA2C,CAAC;CAuDxD;AAED,wBAAgB,4CAA4C,CAC1D,EAAE,EAAE,QAAQ,EACZ,OAAO,GAAE,wCAA6C,GACrD,iCAAiC,CAKnC;AAED,wBAAgB,+CAA+C,CAC7D,MAAM,EAAE,sCAAsC,EAC9C,OAAO,GAAE,wCAAwC,GAC7C,8CAAmD,GACtD,iCAAiC,CAenC"}
1
+ {"version":3,"file":"authority.d.ts","sourceRoot":"","sources":["../../src/project-registration/authority.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,OAAO,KAAK,EAEV,+BAA+B,EAMhC,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,KAAK,8CAA8C,EACnD,KAAK,sCAAsC,EAC5C,MAAM,eAAe,CAAC;AAEvB,OAAO,EAIL,KAAK,iCAAiC,EACtC,KAAK,wCAAwC,EAE7C,KAAK,kCAAkC,EACvC,KAAK,iCAAiC,EAEtC,KAAK,2CAA2C,EAChD,KAAK,qCAAqC,EAC1C,KAAK,oCAAoC,EACzC,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,KAAK,+BAA+B,EACpC,KAAK,oCAAoC,EACzC,KAAK,2CAA2C,EAChD,KAAK,wCAAwC,EAE7C,KAAK,wBAAwB,EAC7B,KAAK,+BAA+B,EACrC,MAAM,YAAY,CAAC;AAuBpB,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEvE;AAaD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIrE;AAED,wBAAgB,4CAA4C,CAAC,KAAK,EAAE;IAClE,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,iCAAiC,CAAC;IAC7C,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAKT;AAk0BD,qBAAa,6CACb,YAAW,iCAAiC;IAOxC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,QAAQ,CAAC,SAAS,EAAG,OAAO,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAA4D;gBAGxE,OAAO,EAAE,+BAA+B,EACzD,OAAO,GAAE,wCAA6C;IAyBlD,UAAU,IAAI,OAAO,CAAC,kCAAkC,CAAC;YAOjD,KAAK;YAiBL,WAAW;YASX,YAAY;YAgBZ,WAAW;YAuBX,yBAAyB;YA2DzB,YAAY;IAiJpB,MAAM,CACV,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,+BAA+B,CAAC;YAsG7B,kBAAkB;IAiE1B,SAAS,CAAC,OAAO,EAAE;QACvB,aAAa,EAAE,oCAAoC,CAAC;QACpD,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,8BAA8B,CAAC;IA0BrC,aAAa,CACjB,OAAO,EAAE,qCAAqC,GAC7C,OAAO,CAAC,oCAAoC,CAAC;IAkF1C,oBAAoB,CACxB,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,wBAAwB,CAAC;IA2I9B,iCAAiC,CACrC,aAAa,EAAE,+BAA+B,EAC9C,aAAa,EAAE,+BAA+B,EAC9C,aAAa,EAAE,2CAA2C,GACzD,OAAO,CAAC,wCAAwC,CAAC;YAwMtC,qBAAqB;IAgC7B,UAAU,CACd,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,+BAA+B,CAAC;IAqLrC,aAAa,CACjB,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,2CAA2C,CAAC;CAuDxD;AAED,wBAAgB,4CAA4C,CAC1D,EAAE,EAAE,QAAQ,EACZ,OAAO,GAAE,wCAA6C,GACrD,iCAAiC,CAKnC;AAED,wBAAgB,+CAA+C,CAC7D,MAAM,EAAE,sCAAsC,EAC9C,OAAO,GAAE,wCAAwC,GAC7C,8CAAmD,GACtD,iCAAiC,CAenC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/project-registration/sqlite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQ3C,OAAO,KAAK,EAGV,OAAO,EACP,QAAQ,EAET,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,+BAA+B,EAC/B,0CAA0C,EAC1C,sCAAsC,EACtC,kCAAkC,EAClC,oCAAoC,EACpC,kCAAkC,EAElC,6BAA6B,EAC7B,0BAA0B,EAC3B,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAigCvE,qBAAa,qCACb,YAAW,+BAA+B;IAI5B,OAAO,CAAC,QAAQ,CAAC,EAAE;IAH/B,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;gBAEtC,EAAE,EAAE,QAAQ;IAKnC,WAAW,CAAC,CAAC,EACjB,EAAE,EAAE,CAAC,WAAW,EAAE,0CAA0C,KAAK,OAAO,CAAC,CAAC,CAAC,GAC1E,OAAO,CAAC,CAAC,CAAC;IAmCb,mBAAmB,CACjB,QAAQ,EAAE,oCAAoC,GAC7C,OAAO,CAAC,kCAAkC,GAAG,IAAI,CAAC;IAIrD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kCAAkC,GAAG,IAAI,CAAC;IAIrF,UAAU,CACR,KAAK,EAAE,sCAAsC,EAC7C,YAAY,EAAE,oCAAoC,EAClD,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,kCAAkC,GAAG,IAAI,CAAC;IAIrD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAI/C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAI3C,oCAAoC,CAAC,KAAK,EAAE;QAChD,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,OAAO,CAAC;KAC1B,GAAG,OAAO,CAAC,MAAM,CAAC;IAsCb,6BAA6B,CAAC,KAAK,EAAE;QACzC,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,OAAO,CAAC;QACzB,KAAK,EAAE,0BAA0B,GAAG,IAAI,CAAC;QACzC,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC;CAwC7C"}
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/project-registration/sqlite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQ3C,OAAO,KAAK,EAGV,OAAO,EACP,QAAQ,EAET,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,+BAA+B,EAC/B,0CAA0C,EAC1C,sCAAsC,EACtC,kCAAkC,EAClC,oCAAoC,EACpC,kCAAkC,EAElC,6BAA6B,EAC7B,0BAA0B,EAC3B,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAmgCvE,qBAAa,qCACb,YAAW,+BAA+B;IAI5B,OAAO,CAAC,QAAQ,CAAC,EAAE;IAH/B,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;gBAEtC,EAAE,EAAE,QAAQ;IAKnC,WAAW,CAAC,CAAC,EACjB,EAAE,EAAE,CAAC,WAAW,EAAE,0CAA0C,KAAK,OAAO,CAAC,CAAC,CAAC,GAC1E,OAAO,CAAC,CAAC,CAAC;IAmCb,mBAAmB,CACjB,QAAQ,EAAE,oCAAoC,GAC7C,OAAO,CAAC,kCAAkC,GAAG,IAAI,CAAC;IAIrD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kCAAkC,GAAG,IAAI,CAAC;IAIrF,UAAU,CACR,KAAK,EAAE,sCAAsC,EAC7C,YAAY,EAAE,oCAAoC,EAClD,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,kCAAkC,GAAG,IAAI,CAAC;IAIrD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAI/C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAI3C,oCAAoC,CAAC,KAAK,EAAE;QAChD,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,OAAO,CAAC;KAC1B,GAAG,OAAO,CAAC,MAAM,CAAC;IAsCb,6BAA6B,CAAC,KAAK,EAAE;QACzC,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,OAAO,CAAC;QACzB,KAAK,EAAE,0BAA0B,GAAG,IAAI,CAAC;QACzC,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC;CAwC7C"}