@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/index.js CHANGED
@@ -1884,6 +1884,10 @@ var init_migrations = __esm(() => {
1884
1884
  );
1885
1885
  INSERT OR IGNORE INTO _migrations (id) VALUES (70);
1886
1886
  COMMIT;
1887
+ `,
1888
+ `BEGIN;
1889
+ INSERT OR IGNORE INTO _migrations (id) VALUES (71);
1890
+ COMMIT;
1887
1891
  `
1888
1892
  ];
1889
1893
  });
@@ -2557,6 +2561,8 @@ function ensureSchema(db) {
2557
2561
  ensureColumn("projects", "task_list_id", "TEXT");
2558
2562
  ensureColumn("projects", "task_prefix", "TEXT");
2559
2563
  ensureColumn("projects", "task_counter", "INTEGER NOT NULL DEFAULT 0");
2564
+ ensureColumn("projects", "parent_id", "TEXT REFERENCES projects(id) ON DELETE SET NULL");
2565
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_projects_parent_id ON projects(parent_id)");
2560
2566
  ensureColumn("tasks", "plan_id", "TEXT REFERENCES plans(id) ON DELETE SET NULL");
2561
2567
  ensureColumn("tasks", "task_list_id", "TEXT REFERENCES task_lists(id) ON DELETE SET NULL");
2562
2568
  ensureColumn("tasks", "short_id", "TEXT");
@@ -5045,17 +5051,24 @@ function createProject(input, db) {
5045
5051
  const id = uuid();
5046
5052
  const timestamp2 = now();
5047
5053
  const derivedSlug = slugify(input.name);
5048
- const taskListId = input.task_list_id === undefined ? `todos-${derivedSlug}` : slugify(input.task_list_id);
5054
+ const taskListId = input.task_list_id === undefined ? derivedSlug : slugify(input.task_list_id);
5049
5055
  if (!derivedSlug || !taskListId)
5050
5056
  throw new Error("Project name and task-list slug must be non-empty");
5051
5057
  const slugConflict = d.query("SELECT id FROM projects WHERE task_list_id = ? LIMIT 1").get(taskListId);
5052
5058
  if (slugConflict || !claimCanonicalSlug("project", "global", taskListId, id, d)) {
5053
5059
  throw new ResourceConflictError("PROJECT_SLUG_CONFLICT", `Project slug "${taskListId}" already exists`);
5054
5060
  }
5061
+ const parentId = input.parent_id ?? null;
5062
+ if (parentId !== null) {
5063
+ const parent = getProject(parentId, d);
5064
+ if (!parent)
5065
+ throw new ProjectNotFoundError(parentId);
5066
+ assertNotProjectAncestor(id, parentId, d);
5067
+ }
5055
5068
  const taskPrefix = input.task_prefix || generatePrefix(input.name, d);
5056
5069
  const machineId = currentStorageMachineId(d);
5057
- d.run(`INSERT INTO projects (id, name, path, description, task_list_id, task_prefix, task_counter, created_at, updated_at, machine_id)
5058
- VALUES (?, ?, ?, ?, ?, ?, 0, ?, ?, ?)`, [id, input.name, input.path, input.description || null, taskListId, taskPrefix, timestamp2, timestamp2, machineId]);
5070
+ d.run(`INSERT INTO projects (id, name, path, description, task_list_id, task_prefix, task_counter, parent_id, created_at, updated_at, machine_id)
5071
+ VALUES (?, ?, ?, ?, ?, ?, 0, ?, ?, ?, ?)`, [id, input.name, input.path, input.description || null, taskListId, taskPrefix, parentId, timestamp2, timestamp2, machineId]);
5059
5072
  return getProject(id, d);
5060
5073
  })();
5061
5074
  }
@@ -5080,6 +5093,60 @@ function listProjects(db) {
5080
5093
  const d = db || getDatabase();
5081
5094
  return d.query("SELECT * FROM projects ORDER BY name").all();
5082
5095
  }
5096
+ function orderProjectsParentFirst(projects) {
5097
+ const projectId = (project) => {
5098
+ const id = project.id;
5099
+ return typeof id === "string" && id.length > 0 ? id : null;
5100
+ };
5101
+ const parentId = (project) => {
5102
+ const parent = project.parent_id;
5103
+ return parent == null ? null : String(parent);
5104
+ };
5105
+ const byId = new Set;
5106
+ for (const project of projects) {
5107
+ const id = projectId(project);
5108
+ if (id !== null)
5109
+ byId.add(id);
5110
+ }
5111
+ const ordered = [];
5112
+ const emitted = new Set;
5113
+ let remaining = [...projects];
5114
+ let progress = true;
5115
+ while (progress && remaining.length > 0) {
5116
+ progress = false;
5117
+ const deferred = [];
5118
+ for (const project of remaining) {
5119
+ const parent = parentId(project);
5120
+ if (parent === null || emitted.has(parent) || !byId.has(parent)) {
5121
+ ordered.push(project);
5122
+ const id = projectId(project);
5123
+ if (id !== null)
5124
+ emitted.add(id);
5125
+ progress = true;
5126
+ } else {
5127
+ deferred.push(project);
5128
+ }
5129
+ }
5130
+ remaining = deferred;
5131
+ }
5132
+ ordered.push(...remaining);
5133
+ return ordered;
5134
+ }
5135
+ function assertNotProjectAncestor(projectId, ancestorId, db) {
5136
+ const d = db || getDatabase();
5137
+ let cursor = ancestorId;
5138
+ const seen = new Set;
5139
+ while (cursor !== null) {
5140
+ if (cursor === projectId) {
5141
+ throw new ResourceConflictError("PROJECT_PARENT_CYCLE", `Project "${projectId}" cannot be placed under its own descendant`);
5142
+ }
5143
+ if (seen.has(cursor))
5144
+ break;
5145
+ seen.add(cursor);
5146
+ const row = d.query("SELECT parent_id FROM projects WHERE id = ?").get(cursor);
5147
+ cursor = row?.parent_id ?? null;
5148
+ }
5149
+ }
5083
5150
  function updateProject(id, input, db) {
5084
5151
  const d = db || getDatabase();
5085
5152
  const project = getProject(id, d);
@@ -5102,6 +5169,16 @@ function updateProject(id, input, db) {
5102
5169
  sets.push("path = ?");
5103
5170
  params.push(input.path);
5104
5171
  }
5172
+ if (input.parent_id !== undefined) {
5173
+ if (input.parent_id !== null) {
5174
+ const parent = getProject(input.parent_id, d);
5175
+ if (!parent)
5176
+ throw new ProjectNotFoundError(input.parent_id);
5177
+ assertNotProjectAncestor(id, input.parent_id, d);
5178
+ }
5179
+ sets.push("parent_id = ?");
5180
+ params.push(input.parent_id);
5181
+ }
5105
5182
  params.push(id);
5106
5183
  d.run(`UPDATE projects SET ${sets.join(", ")} WHERE id = ?`, params);
5107
5184
  return getProject(id, d);
@@ -12841,7 +12918,7 @@ var init_dispatches = __esm(() => {
12841
12918
  // package.json
12842
12919
  var package_default = {
12843
12920
  name: "@hasna/todos",
12844
- version: "0.15.34",
12921
+ version: "0.15.35",
12845
12922
  description: "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
12846
12923
  type: "module",
12847
12924
  main: "dist/index.js",
@@ -12916,6 +12993,9 @@ var package_default = {
12916
12993
  "verify:release-review": "bun run scripts/verify-npm-release-agent-review.ts",
12917
12994
  "verify:attested-container-candidate": "bun run scripts/attested-container-candidate.ts verify",
12918
12995
  "test:attested-container-candidate": "bun test scripts/attested-container-candidate.test.ts",
12996
+ "emit:iapp-deployment-compatibility-vector": "bun run scripts/attested-container-compatibility-vector.ts emit",
12997
+ "verify:iapp-deployment-compatibility-vector": "bun run scripts/attested-container-compatibility-vector.ts verify",
12998
+ "test:attested-container-compatibility-vector": "bun test scripts/attested-container-compatibility-vector.test.ts",
12919
12999
  "issue:release-review": "bun run scripts/issue-npm-release-agent-review.ts",
12920
13000
  prepublishOnly: "bun run scripts/verify-public-release.ts --mode=publish",
12921
13001
  postinstall: "mkdir -p $HOME/.hasna/todos $HOME/.hasna/todos/training 2>/dev/null || true"
@@ -13604,6 +13684,7 @@ var TODOS_JSON_CONTRACTS = [
13604
13684
  task_list_id: nullableIdField,
13605
13685
  task_prefix: field(["string", "null"], "Optional task prefix.", true),
13606
13686
  task_counter: field("integer", "Monotonic project task counter."),
13687
+ parent_id: field(["string", "null"], "Optional parent project id; null means top-level.", true),
13607
13688
  created_at: isoDateField,
13608
13689
  updated_at: isoDateField
13609
13690
  },
@@ -16889,6 +16970,7 @@ function createAgentProjectDemoBundle() {
16889
16970
  task_list_id: ids.list,
16890
16971
  task_prefix: "DEMO",
16891
16972
  task_counter: 4,
16973
+ parent_id: null,
16892
16974
  created_at: createdAt,
16893
16975
  updated_at: completedAt
16894
16976
  });
@@ -26529,6 +26611,7 @@ var PROJECT_COLUMNS = [
26529
26611
  "task_list_id",
26530
26612
  "task_prefix",
26531
26613
  "task_counter",
26614
+ "parent_id",
26532
26615
  "created_at",
26533
26616
  "updated_at",
26534
26617
  "machine_id",
@@ -26748,7 +26831,7 @@ function importSqliteTodosStorageSnapshot(snapshot, db) {
26748
26831
  }
26749
26832
  }
26750
26833
  };
26751
- applyRows("projects", "projects", PROJECT_COLUMNS, snapshot.projects, "updated_at");
26834
+ applyRows("projects", "projects", PROJECT_COLUMNS, orderProjectsParentFirst(snapshot.projects), "updated_at");
26752
26835
  applyRows("project_machine_paths", "project_machine_paths", PROJECT_MACHINE_PATH_COLUMNS, snapshot.projectMachinePaths ?? [], "updated_at");
26753
26836
  applyRows("agents", "agents", AGENT_COLUMNS, snapshot.agents, "last_seen_at");
26754
26837
  applyRows("task_lists", "task_lists", TASK_LIST_COLUMNS, snapshot.taskLists, "updated_at");
@@ -28203,8 +28286,12 @@ class PostgresJsonRecordStore {
28203
28286
  OR ($11::text <> $2
28204
28287
  AND NOT EXISTS (SELECT 1 FROM parent_chain WHERE object_id = $2)
28205
28288
  AND NOT EXISTS (SELECT 1 FROM parent_chain WHERE cycle))) AS parent_acyclic,
28206
- (SELECT count(*) FROM locked_plans) = jsonb_array_length($7::jsonb) AS all_plans_found,
28207
- ($8::text IS NULL OR EXISTS (SELECT 1 FROM locked_plans WHERE object_id = $8)) AS target_plan_found,
28289
+ (COALESCE((SELECT payload->>'plan_id' FROM locked_task), '')
28290
+ IS DISTINCT FROM COALESCE($3::jsonb->>'plan_id', '')) AS membership_changed,
28291
+ (NOT (COALESCE((SELECT payload->>'plan_id' FROM locked_task), '')
28292
+ IS DISTINCT FROM COALESCE($3::jsonb->>'plan_id', ''))
28293
+ OR $8::text IS NULL
28294
+ OR EXISTS (SELECT 1 FROM locked_plans WHERE object_id = $8)) AS target_plan_found,
28208
28295
  (SELECT payload->>'project_id' FROM locked_plans WHERE object_id = $8) AS target_project_id
28209
28296
  ), guarded AS (
28210
28297
  SELECT
@@ -28227,7 +28314,6 @@ class PostgresJsonRecordStore {
28227
28314
  AND guarded.version_matches
28228
28315
  AND guarded.parent_found
28229
28316
  AND guarded.parent_acyclic
28230
- AND guarded.all_plans_found
28231
28317
  AND guarded.target_plan_found
28232
28318
  AND NOT guarded.project_conflict
28233
28319
  ON CONFLICT (service, object_type, object_id) DO UPDATE SET
@@ -28243,7 +28329,7 @@ class PostgresJsonRecordStore {
28243
28329
  RETURNING payload
28244
28330
  )
28245
28331
  SELECT guarded.task_found, guarded.version_matches, guarded.parent_found, guarded.parent_acyclic,
28246
- guarded.all_plans_found, guarded.target_plan_found, guarded.project_conflict,
28332
+ guarded.membership_changed, guarded.target_plan_found, guarded.project_conflict,
28247
28333
  (SELECT payload FROM stored) AS payload,
28248
28334
  (SELECT payload FROM locked_task) AS current_payload
28249
28335
  FROM guarded`, [
@@ -28275,7 +28361,7 @@ class PostgresJsonRecordStore {
28275
28361
  if (parentGuard && !row?.parent_acyclic && parentGuard.parentId) {
28276
28362
  throw new ResourceConflictError("TASK_PARENT_CYCLE", `TASK_PARENT_CYCLE: assigning parent ${parentGuard.parentId} to task ${value.id} would create or retain a parent cycle`);
28277
28363
  }
28278
- if (!row?.all_plans_found || !row.target_plan_found) {
28364
+ if (!row?.target_plan_found) {
28279
28365
  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 });
28280
28366
  }
28281
28367
  if (row.project_conflict) {
@@ -29487,17 +29573,26 @@ async function getChangedSince(since, filters, store) {
29487
29573
  async function createProject2(input, store, context) {
29488
29574
  const timestamp3 = new Date().toISOString();
29489
29575
  const derivedSlug = slugifyRaw(input.name);
29490
- const taskListId = input.task_list_id === undefined ? `todos-${derivedSlug}` : slugifyRaw(input.task_list_id);
29576
+ const taskListId = input.task_list_id === undefined ? derivedSlug : slugifyRaw(input.task_list_id);
29491
29577
  if (!derivedSlug || !taskListId)
29492
29578
  throw new Error("Project name and task-list slug must be non-empty");
29579
+ const parentId = input.parent_id ?? null;
29580
+ const id = randomUUID3();
29581
+ if (parentId !== null) {
29582
+ const parent = await store.get("projects", parentId);
29583
+ if (!parent)
29584
+ throw new ProjectNotFoundError(parentId);
29585
+ await assertNotProjectAncestorPostgres(id, parentId, store);
29586
+ }
29493
29587
  const project = {
29494
- id: randomUUID3(),
29588
+ id,
29495
29589
  name: input.name,
29496
29590
  path: input.path,
29497
29591
  description: input.description ?? null,
29498
29592
  task_list_id: taskListId,
29499
29593
  task_prefix: input.task_prefix ?? await generateProjectPrefix(input.name, store),
29500
29594
  task_counter: 0,
29595
+ parent_id: parentId,
29501
29596
  created_at: timestamp3,
29502
29597
  updated_at: timestamp3,
29503
29598
  machine_id: store.machineId(context),
@@ -29505,12 +29600,38 @@ async function createProject2(input, store, context) {
29505
29600
  };
29506
29601
  return store.upsert("projects", project, context);
29507
29602
  }
29603
+ async function assertNotProjectAncestorPostgres(projectId, candidateParentId, store) {
29604
+ const all = await store.list("projects");
29605
+ const byId = new Map(all.map((project) => [project.id, project.parent_id ?? null]));
29606
+ let cursor = candidateParentId;
29607
+ const seen = new Set;
29608
+ while (cursor !== null) {
29609
+ if (cursor === projectId) {
29610
+ throw new ResourceConflictError("PROJECT_PARENT_CYCLE", `Project "${projectId}" cannot be placed under its own descendant`);
29611
+ }
29612
+ if (seen.has(cursor))
29613
+ break;
29614
+ seen.add(cursor);
29615
+ cursor = byId.get(cursor) ?? null;
29616
+ }
29617
+ }
29508
29618
  async function updateProject2(id, input, store) {
29509
29619
  if ("task_list_id" in input) {
29510
29620
  throw new Error("task_list_id cannot be changed by updateProject; use renameProject for an atomic canonical rename");
29511
29621
  }
29512
29622
  const project = await requireRecord("projects", id, store);
29513
- const updated = { ...project, ...definedPatch(input), updated_at: new Date().toISOString() };
29623
+ if (input.parent_id !== undefined && input.parent_id !== null) {
29624
+ const parent = await store.get("projects", input.parent_id);
29625
+ if (!parent)
29626
+ throw new ProjectNotFoundError(input.parent_id);
29627
+ await assertNotProjectAncestorPostgres(id, input.parent_id, store);
29628
+ }
29629
+ const updated = {
29630
+ ...project,
29631
+ ...definedPatch(input),
29632
+ ...input.parent_id !== undefined ? { parent_id: input.parent_id } : {},
29633
+ updated_at: new Date().toISOString()
29634
+ };
29514
29635
  return store.upsert("projects", updated);
29515
29636
  }
29516
29637
  async function createPlan2(input, store, context) {
@@ -35340,7 +35461,7 @@ class StagedSqliteTodosProjectRegistrationTransaction {
35340
35461
  }
35341
35462
  async createProject(input) {
35342
35463
  const derivedSlug = normalizeSlug(input.name);
35343
- const taskListId = input.task_list_id === undefined ? `todos-${derivedSlug}` : normalizeSlug(input.task_list_id);
35464
+ const taskListId = input.task_list_id === undefined ? derivedSlug : normalizeSlug(input.task_list_id);
35344
35465
  if (!derivedSlug || !taskListId) {
35345
35466
  throw new Error("Project name and task-list slug must be non-empty");
35346
35467
  }
@@ -35352,6 +35473,7 @@ class StagedSqliteTodosProjectRegistrationTransaction {
35352
35473
  task_list_id: taskListId,
35353
35474
  task_prefix: input.task_prefix ?? this.availableProjectPrefix(input.name),
35354
35475
  task_counter: 0,
35476
+ parent_id: input.parent_id ?? null,
35355
35477
  created_at: now(),
35356
35478
  updated_at: now(),
35357
35479
  machine_id: currentStorageMachineId(this.db)
@@ -35362,14 +35484,15 @@ class StagedSqliteTodosProjectRegistrationTransaction {
35362
35484
  try {
35363
35485
  const result = this.db.run(`INSERT INTO projects (
35364
35486
  id, name, path, description, task_list_id, task_prefix,
35365
- task_counter, created_at, updated_at, machine_id
35366
- ) VALUES (?, ?, ?, ?, ?, ?, 0, ?, ?, ?)`, [
35487
+ task_counter, parent_id, created_at, updated_at, machine_id
35488
+ ) VALUES (?, ?, ?, ?, ?, ?, 0, ?, ?, ?, ?)`, [
35367
35489
  project.id,
35368
35490
  project.name,
35369
35491
  project.path,
35370
35492
  project.description,
35371
35493
  project.task_list_id,
35372
35494
  project.task_prefix,
35495
+ project.parent_id,
35373
35496
  project.created_at,
35374
35497
  project.updated_at,
35375
35498
  project.machine_id ?? null
@@ -35765,7 +35888,10 @@ function taskListSlug(projectSlug) {
35765
35888
  if (!slug || slug !== projectSlug) {
35766
35889
  throw new TodosProjectRegistrationError("TODOS_PROJECT_REGISTRATION_INVALID_INPUT", "project_slug must be canonical kebab-case");
35767
35890
  }
35768
- return `todos-${slug}`;
35891
+ return slug;
35892
+ }
35893
+ function legacyTaskListSlug(projectSlug) {
35894
+ return `todos-${normalizeSlug(projectSlug)}`;
35769
35895
  }
35770
35896
  function deterministicTaskPrefix(projectSlug) {
35771
35897
  const letters = projectSlug.replace(/[^a-z0-9]/gi, "").toUpperCase();
@@ -36284,6 +36410,12 @@ class PackageOwnedTodosProjectRegistrationAuthority {
36284
36410
  created_by_operation: false
36285
36411
  };
36286
36412
  }
36413
+ if (request.bind_existing === true && conflict2.path === path && conflict2.task_list_id === legacyTaskListSlug(request.project_slug)) {
36414
+ return {
36415
+ record: boundExistingProjectRecord(conflict2),
36416
+ created_by_operation: false
36417
+ };
36418
+ }
36287
36419
  return this.terminalFor(transaction, request, normalizedCallDigest(request), "target_already_exists", { targetId: conflict2.id });
36288
36420
  }
36289
36421
  await this.fault("before_object_write", request);
@@ -36320,6 +36452,15 @@ class PackageOwnedTodosProjectRegistrationAuthority {
36320
36452
  }
36321
36453
  return this.terminalFor(transaction, request, normalizedCallDigest(request), "target_already_exists", { targetId: conflict.id });
36322
36454
  }
36455
+ if (request.bind_existing === true) {
36456
+ const legacy = await transaction.findTaskListConflict(todosProjectId, legacyTaskListSlug(request.project_slug));
36457
+ if (legacy && legacy.project_id === todosProjectId) {
36458
+ return {
36459
+ record: boundExistingTaskListRecord(legacy),
36460
+ created_by_operation: false
36461
+ };
36462
+ }
36463
+ }
36323
36464
  await this.fault("before_object_write", request);
36324
36465
  const taskList = await transaction.createTaskList({
36325
36466
  name: request.project_name,
@@ -43662,7 +43803,32 @@ function classifyRemoteRequestError(baseUrl, route, error) {
43662
43803
  }
43663
43804
  throw error;
43664
43805
  }
43665
- function protectRemoteClient(client) {
43806
+ var REMOTE_REQUEST_TIMEOUT_MS = 1e4;
43807
+ function withBoundedRemoteRequest(options, requestTimeoutMs, run) {
43808
+ const controller = new AbortController;
43809
+ const onBaseAbort = () => controller.abort();
43810
+ if (options?.signal) {
43811
+ if (options.signal.aborted)
43812
+ controller.abort();
43813
+ else
43814
+ options.signal.addEventListener("abort", onBaseAbort, { once: true });
43815
+ }
43816
+ let timer;
43817
+ const deadline = new Promise((_, reject) => {
43818
+ timer = setTimeout(() => {
43819
+ controller.abort();
43820
+ reject(new DOMException(`Todos remote request exceeded the ${requestTimeoutMs}ms bounded request timeout`, "AbortError"));
43821
+ }, requestTimeoutMs);
43822
+ });
43823
+ const attempt = run({ ...options, signal: controller.signal });
43824
+ attempt.catch(() => {});
43825
+ return Promise.race([attempt, deadline]).finally(() => {
43826
+ if (timer)
43827
+ clearTimeout(timer);
43828
+ options?.signal?.removeEventListener("abort", onBaseAbort);
43829
+ });
43830
+ }
43831
+ function protectRemoteClient(client, requestTimeoutMs) {
43666
43832
  const baseUrl = remoteAuthorityBase(client);
43667
43833
  const protect = async (route, request) => {
43668
43834
  try {
@@ -43671,25 +43837,26 @@ function protectRemoteClient(client) {
43671
43837
  return classifyRemoteRequestError(baseUrl, route, error);
43672
43838
  }
43673
43839
  };
43840
+ const bounded = (options, run) => withBoundedRemoteRequest(options, requestTimeoutMs, run);
43674
43841
  const transport = client.transport;
43675
43842
  const protectedTransport = {
43676
43843
  baseUrl: transport.baseUrl,
43677
- request: (method, path, body2, options) => protect(path, () => transport.request(method, path, body2, options)),
43678
- get: (path, options) => protect(path, () => transport.get(path, options)),
43679
- post: (path, body2, options) => protect(path, () => transport.post(path, body2, options)),
43680
- put: (path, body2, options) => protect(path, () => transport.put(path, body2, options)),
43681
- patch: (path, body2, options) => protect(path, () => transport.patch(path, body2, options)),
43682
- del: (path, body2, options) => protect(path, () => transport.del(path, body2, options))
43844
+ request: (method, path, body2, options) => protect(path, () => bounded(options, (opts) => transport.request(method, path, body2, opts))),
43845
+ get: (path, options) => protect(path, () => bounded(options, (opts) => transport.get(path, opts))),
43846
+ post: (path, body2, options) => protect(path, () => bounded(options, (opts) => transport.post(path, body2, opts))),
43847
+ put: (path, body2, options) => protect(path, () => bounded(options, (opts) => transport.put(path, body2, opts))),
43848
+ patch: (path, body2, options) => protect(path, () => bounded(options, (opts) => transport.patch(path, body2, opts))),
43849
+ del: (path, body2, options) => protect(path, () => bounded(options, (opts) => transport.del(path, body2, opts)))
43683
43850
  };
43684
43851
  return {
43685
43852
  name: client.name,
43686
43853
  baseUrl: client.baseUrl,
43687
43854
  transport: protectedTransport,
43688
- list: (resource, options) => protect(`/${resource}`, () => client.list(resource, options)),
43689
- get: (resource, id, options) => protect(`/${resource}/${encodeURIComponent(id)}`, () => client.get(resource, id, options)),
43690
- create: (resource, body2, options) => protect(`/${resource}`, () => client.create(resource, body2, options)),
43691
- update: (resource, id, patch, options) => protect(`/${resource}/${encodeURIComponent(id)}`, () => client.update(resource, id, patch, options)),
43692
- delete: (resource, id, options) => protect(`/${resource}/${encodeURIComponent(id)}`, () => client.delete(resource, id, options))
43855
+ list: (resource, options) => protect(`/${resource}`, () => bounded(options, (opts) => client.list(resource, opts))),
43856
+ get: (resource, id, options) => protect(`/${resource}/${encodeURIComponent(id)}`, () => bounded(options, (opts) => client.get(resource, id, opts))),
43857
+ create: (resource, body2, options) => protect(`/${resource}`, () => bounded(options, (opts) => client.create(resource, body2, opts))),
43858
+ update: (resource, id, patch, options) => protect(`/${resource}/${encodeURIComponent(id)}`, () => bounded(options, (opts) => client.update(resource, id, patch, opts))),
43859
+ delete: (resource, id, options) => protect(`/${resource}/${encodeURIComponent(id)}`, () => bounded(options, (opts) => client.delete(resource, id, opts)))
43693
43860
  };
43694
43861
  }
43695
43862
  function remoteAuthorityBase(client) {
@@ -43710,17 +43877,18 @@ async function requiredRemoteRoute(client, route, request, recognized404Codes =
43710
43877
  throw error;
43711
43878
  }
43712
43879
  }
43713
- function getTodosCloudClient(env = process.env) {
43880
+ function getTodosCloudClient(env = process.env, requestTimeoutMs = REMOTE_REQUEST_TIMEOUT_MS) {
43714
43881
  if (requestedTransport(env) !== "http")
43715
43882
  return null;
43716
43883
  const resolved = resolveStorageClient("todos", requireTodosRemoteAuthorityEnv(env), {
43717
- fetchImpl: (input, init) => globalThis.fetch(input, { ...init, redirect: "manual" })
43884
+ fetchImpl: (input, init) => globalThis.fetch(input, { ...init, redirect: "manual" }),
43885
+ timeoutMs: requestTimeoutMs
43718
43886
  });
43719
43887
  if (resolved.transport === "cloud-http")
43720
- return protectRemoteClient(resolved.client);
43888
+ return protectRemoteClient(resolved.client, requestTimeoutMs);
43721
43889
  const transportName = resolved.transport;
43722
43890
  if (transportName === "http")
43723
- return protectRemoteClient(resolved.client);
43891
+ return protectRemoteClient(resolved.client, requestTimeoutMs);
43724
43892
  return null;
43725
43893
  }
43726
43894
  function unwrapTask(raw) {
@@ -47793,7 +47961,7 @@ function addSourceOnce(projectId, type, name, uri, metadata, db) {
47793
47961
  function bootstrapProject(options = {}, db) {
47794
47962
  const d = db || getDatabase();
47795
47963
  const discovery = discoverProjectWorkspace(options.path);
47796
- const taskListSlug2 = options.taskListSlug || `todos-${slugify(options.name || discovery.projectName)}`;
47964
+ const taskListSlug2 = options.taskListSlug || slugify(options.name || discovery.projectName);
47797
47965
  if (options.dryRun) {
47798
47966
  return {
47799
47967
  dryRun: true,
@@ -55211,21 +55379,22 @@ function upsertProject(raw, d) {
55211
55379
  const existing = getProject(id, d);
55212
55380
  const ts = now();
55213
55381
  if (!existing) {
55214
- d.run(`INSERT INTO projects (id, name, path, description, task_list_id, task_prefix, task_counter, created_at, updated_at)
55215
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
55382
+ d.run(`INSERT INTO projects (id, name, path, description, task_list_id, task_prefix, task_counter, parent_id, created_at, updated_at)
55383
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
55216
55384
  id,
55217
55385
  raw.name,
55218
55386
  raw.path,
55219
55387
  raw.description ?? null,
55220
- raw.task_list_id ?? `todos-${String(raw.name).toLowerCase().replace(/\s+/g, "-")}`,
55388
+ raw.task_list_id ?? String(raw.name).toLowerCase().replace(/\s+/g, "-"),
55221
55389
  raw.task_prefix ?? "TSK",
55222
55390
  raw.task_counter ?? 0,
55391
+ raw.parent_id ?? null,
55223
55392
  raw.created_at ?? ts,
55224
55393
  raw.updated_at ?? ts
55225
55394
  ].map(sqlValue));
55226
55395
  return "created";
55227
55396
  }
55228
- d.run(`UPDATE projects SET name = ?, path = ?, description = ?, task_list_id = ?, task_prefix = ?, task_counter = ?, updated_at = ?
55397
+ d.run(`UPDATE projects SET name = ?, path = ?, description = ?, task_list_id = ?, task_prefix = ?, task_counter = ?, parent_id = ?, updated_at = ?
55229
55398
  WHERE id = ?`, [
55230
55399
  raw.name ?? existing.name,
55231
55400
  raw.path ?? existing.path,
@@ -55233,6 +55402,7 @@ function upsertProject(raw, d) {
55233
55402
  raw.task_list_id ?? existing.task_list_id,
55234
55403
  raw.task_prefix ?? existing.task_prefix,
55235
55404
  raw.task_counter ?? existing.task_counter,
55405
+ raw.parent_id ?? existing.parent_id,
55236
55406
  raw.updated_at ?? ts,
55237
55407
  id
55238
55408
  ].map(sqlValue));
@@ -55313,7 +55483,7 @@ function importBundle(bundle, options = {}, db) {
55313
55483
  };
55314
55484
  if (options.dry_run)
55315
55485
  return result;
55316
- for (const raw of bundle.projects) {
55486
+ for (const raw of orderProjectsParentFirst(bundle.projects)) {
55317
55487
  try {
55318
55488
  const id = raw.id;
55319
55489
  const local = getProject(id, d);
@@ -1 +1 @@
1
- {"version":3,"file":"json-contracts.d.ts","sourceRoot":"","sources":["../src/json-contracts.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAC7D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,cAAc,CAAC;AAC3D,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3G,MAAM,WAAW,kCAAkC;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,8BAA8B;IAC7C,WAAW,EAAE,cAAc,CAAC;IAC5B,UAAU,EAAE,aAAa,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,kBAAkB,GAAG,SAAS,kBAAkB,EAAE,CAAC;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,SAAS,EAAE,kBAAkB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACjD,oBAAoB,EAAE,OAAO,CAAC;IAC9B,SAAS,EAAE;QACT,gBAAgB,EAAE,SAAS,GAAG,WAAW,CAAC;QAC1C,sBAAsB,EAAE,UAAU,CAAC;QACnC,0BAA0B,EAAE,UAAU,CAAC;QACvC,qBAAqB,EAAE,UAAU,CAAC;KACnC,CAAC;CACH;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,CAAC,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,8BAA8B,CAAC;IACxC,SAAS,EAAE,uBAAuB,EAAE,CAAC;IACrC,wBAAwB,EAAE,uBAAuB,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,2BAA2B,EAAE,CAAC;CAC/C;AAqDD,eAAO,MAAM,oCAAoC,EAAE,uBAAuB,EAyCzE,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,uBAAuB,EAs8DzD,CAAC;AAyBF,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,uBAAuB,GAAG,IAAI,CAGlF;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,4BAA4B,CAmCrG;AAED,wBAAgB,2BAA2B,CACzC,OAAO,GAAE,kCAAuC,GAC/C,0BAA0B,CAS5B;AAED,eAAO,MAAM,6BAA6B,4BAExC,CAAC"}
1
+ {"version":3,"file":"json-contracts.d.ts","sourceRoot":"","sources":["../src/json-contracts.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAC7D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,cAAc,CAAC;AAC3D,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3G,MAAM,WAAW,kCAAkC;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,8BAA8B;IAC7C,WAAW,EAAE,cAAc,CAAC;IAC5B,UAAU,EAAE,aAAa,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,kBAAkB,GAAG,SAAS,kBAAkB,EAAE,CAAC;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,SAAS,EAAE,kBAAkB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACjD,oBAAoB,EAAE,OAAO,CAAC;IAC9B,SAAS,EAAE;QACT,gBAAgB,EAAE,SAAS,GAAG,WAAW,CAAC;QAC1C,sBAAsB,EAAE,UAAU,CAAC;QACnC,0BAA0B,EAAE,UAAU,CAAC;QACvC,qBAAqB,EAAE,UAAU,CAAC;KACnC,CAAC;CACH;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,CAAC,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,8BAA8B,CAAC;IACxC,SAAS,EAAE,uBAAuB,EAAE,CAAC;IACrC,wBAAwB,EAAE,uBAAuB,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,2BAA2B,EAAE,CAAC;CAC/C;AAqDD,eAAO,MAAM,oCAAoC,EAAE,uBAAuB,EAyCzE,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,uBAAuB,EAu8DzD,CAAC;AAyBF,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,uBAAuB,GAAG,IAAI,CAGlF;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,4BAA4B,CAmCrG;AAED,wBAAgB,2BAA2B,CACzC,OAAO,GAAE,kCAAuC,GAC/C,0BAA0B,CAS5B;AAED,eAAO,MAAM,6BAA6B,4BAExC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"import-export-bridge.d.ts","sourceRoot":"","sources":["../../src/lib/import-export-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"import-export-bridge.d.ts","sourceRoot":"","sources":["../../src/lib/import-export-bridge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAS7D,OAAO,EAAkD,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3G,OAAO,KAAK,EAAoC,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE1F,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAE/C,eAAO,MAAM,YAAY,8CAA+C,CAAC;AACzE,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,eAAO,MAAM,gBAAgB,wEAAyE,CAAC;AACvG,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,cAAc,uIAOjB,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,OAAO,aAAa,CAAC;IACrC,WAAW,EAAE,UAAU,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE;QACP,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACjC,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACpC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,YAAY,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,oBAAoB,EAAE,aAAa,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,OAAO,aAAa,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,OAAO,aAAa,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AA6DD,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAiBpF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,kBAAkB,CA8E3G;AAuDD,wBAAgB,WAAW,CAAC,MAAM,EAAE,kBAAkB,EAAE,QAAQ,GAAE,aAA6B,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,WAAW,CAuC3H;AA+GD,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,EAAE,OAAO,GAAE,mBAAwB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,YAAY,CAoFvH;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAG9E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAK/D;AAED,wBAAgB,aAAa,IAAI,MAAM,CAuBtC"}
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding-fixtures.d.ts","sourceRoot":"","sources":["../../src/lib/onboarding-fixtures.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,wCAAwC,eAAe,CAAC;AACrE,eAAO,MAAM,+BAA+B,sCAAsC,CAAC;AAEnF,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,EAAE,IAAI,CAAC;IACjB,QAAQ,EAAE,IAAI,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,oBAAoB,EAAE,MAAM,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,EAAE,sBAAsB,CAAC;CAChC;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,8BAA+B,SAAQ,wBAAwB;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAqXD,wBAAgB,sBAAsB,IAAI,wBAAwB,EAAE,CAMnE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,SAAuB,GAAG,iBAAiB,CAUnF;AAED,wBAAgB,0BAA0B,CAAC,IAAI,SAAuB,GAAG,sBAAsB,CAE9F;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,4BAA4B,CAS3F;AAED,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,8BAAmC,GAC3C,uBAAuB,CAMzB"}
1
+ {"version":3,"file":"onboarding-fixtures.d.ts","sourceRoot":"","sources":["../../src/lib/onboarding-fixtures.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,wCAAwC,eAAe,CAAC;AACrE,eAAO,MAAM,+BAA+B,sCAAsC,CAAC;AAEnF,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,EAAE,IAAI,CAAC;IACjB,QAAQ,EAAE,IAAI,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,oBAAoB,EAAE,MAAM,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,EAAE,sBAAsB,CAAC;CAChC;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,8BAA+B,SAAQ,wBAAwB;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAsXD,wBAAgB,sBAAsB,IAAI,wBAAwB,EAAE,CAMnE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,SAAuB,GAAG,iBAAiB,CAUnF;AAED,wBAAgB,0BAA0B,CAAC,IAAI,SAAuB,GAAG,sBAAsB,CAE9F;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,4BAA4B,CAS3F;AAED,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,8BAAmC,GAC3C,uBAAuB,CAMzB"}