@hasna/todos 0.9.17 → 0.9.19

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/cli/index.js CHANGED
@@ -2138,29 +2138,123 @@ function runMigrations(db) {
2138
2138
  const result = db.query("SELECT MAX(id) as max_id FROM _migrations").get();
2139
2139
  const currentLevel = result?.max_id ?? 0;
2140
2140
  for (let i = currentLevel;i < MIGRATIONS.length; i++) {
2141
- db.exec(MIGRATIONS[i]);
2141
+ try {
2142
+ db.exec(MIGRATIONS[i]);
2143
+ } catch {}
2142
2144
  }
2143
2145
  } catch {
2144
2146
  for (const migration of MIGRATIONS) {
2145
- db.exec(migration);
2147
+ try {
2148
+ db.exec(migration);
2149
+ } catch {}
2146
2150
  }
2147
2151
  }
2148
- ensureTableMigrations(db);
2152
+ ensureSchema(db);
2149
2153
  }
2150
- function ensureTableMigrations(db) {
2151
- try {
2152
- const hasAgents = db.query("SELECT name FROM sqlite_master WHERE type='table' AND name='agents'").get();
2153
- if (!hasAgents) {
2154
- db.exec(MIGRATIONS[4]);
2154
+ function ensureSchema(db) {
2155
+ const ensureColumn = (table, column, type) => {
2156
+ try {
2157
+ db.query(`SELECT ${column} FROM ${table} LIMIT 0`).get();
2158
+ } catch {
2159
+ try {
2160
+ db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${type}`);
2161
+ } catch {}
2155
2162
  }
2156
- } catch {}
2157
- try {
2158
- db.query("SELECT task_prefix FROM projects LIMIT 0").get();
2159
- } catch {
2163
+ };
2164
+ const ensureTable = (name, sql) => {
2160
2165
  try {
2161
- db.exec(MIGRATIONS[5]);
2166
+ const exists = db.query("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(name);
2167
+ if (!exists)
2168
+ db.exec(sql);
2162
2169
  } catch {}
2163
- }
2170
+ };
2171
+ const ensureIndex = (sql) => {
2172
+ try {
2173
+ db.exec(sql);
2174
+ } catch {}
2175
+ };
2176
+ ensureTable("agents", `
2177
+ CREATE TABLE agents (
2178
+ id TEXT PRIMARY KEY, name TEXT NOT NULL UNIQUE, description TEXT,
2179
+ role TEXT DEFAULT 'agent', permissions TEXT DEFAULT '["*"]',
2180
+ metadata TEXT DEFAULT '{}',
2181
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
2182
+ last_seen_at TEXT NOT NULL DEFAULT (datetime('now'))
2183
+ )`);
2184
+ ensureTable("task_lists", `
2185
+ CREATE TABLE task_lists (
2186
+ id TEXT PRIMARY KEY, project_id TEXT REFERENCES projects(id) ON DELETE SET NULL,
2187
+ slug TEXT NOT NULL, name TEXT NOT NULL, description TEXT,
2188
+ metadata TEXT DEFAULT '{}',
2189
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
2190
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
2191
+ UNIQUE(project_id, slug)
2192
+ )`);
2193
+ ensureTable("plans", `
2194
+ CREATE TABLE plans (
2195
+ id TEXT PRIMARY KEY, project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
2196
+ task_list_id TEXT, agent_id TEXT,
2197
+ name TEXT NOT NULL, description TEXT,
2198
+ status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'completed', 'archived')),
2199
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
2200
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
2201
+ )`);
2202
+ ensureTable("task_tags", `
2203
+ CREATE TABLE task_tags (
2204
+ task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
2205
+ tag TEXT NOT NULL, PRIMARY KEY (task_id, tag)
2206
+ )`);
2207
+ ensureTable("task_history", `
2208
+ CREATE TABLE task_history (
2209
+ id TEXT PRIMARY KEY, task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
2210
+ action TEXT NOT NULL, field TEXT, old_value TEXT, new_value TEXT, agent_id TEXT,
2211
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
2212
+ )`);
2213
+ ensureTable("webhooks", `
2214
+ CREATE TABLE webhooks (
2215
+ id TEXT PRIMARY KEY, url TEXT NOT NULL, events TEXT NOT NULL DEFAULT '[]',
2216
+ secret TEXT, active INTEGER NOT NULL DEFAULT 1,
2217
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
2218
+ )`);
2219
+ ensureTable("task_templates", `
2220
+ CREATE TABLE task_templates (
2221
+ id TEXT PRIMARY KEY, name TEXT NOT NULL, title_pattern TEXT NOT NULL,
2222
+ description TEXT, priority TEXT DEFAULT 'medium', tags TEXT DEFAULT '[]',
2223
+ project_id TEXT REFERENCES projects(id) ON DELETE SET NULL,
2224
+ plan_id TEXT REFERENCES plans(id) ON DELETE SET NULL,
2225
+ metadata TEXT DEFAULT '{}',
2226
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
2227
+ )`);
2228
+ ensureColumn("projects", "task_list_id", "TEXT");
2229
+ ensureColumn("projects", "task_prefix", "TEXT");
2230
+ ensureColumn("projects", "task_counter", "INTEGER NOT NULL DEFAULT 0");
2231
+ ensureColumn("tasks", "plan_id", "TEXT REFERENCES plans(id) ON DELETE SET NULL");
2232
+ ensureColumn("tasks", "task_list_id", "TEXT REFERENCES task_lists(id) ON DELETE SET NULL");
2233
+ ensureColumn("tasks", "short_id", "TEXT");
2234
+ ensureColumn("tasks", "due_at", "TEXT");
2235
+ ensureColumn("tasks", "estimated_minutes", "INTEGER");
2236
+ ensureColumn("tasks", "requires_approval", "INTEGER NOT NULL DEFAULT 0");
2237
+ ensureColumn("tasks", "approved_by", "TEXT");
2238
+ ensureColumn("tasks", "approved_at", "TEXT");
2239
+ ensureColumn("agents", "role", "TEXT DEFAULT 'agent'");
2240
+ ensureColumn("agents", "permissions", `TEXT DEFAULT '["*"]'`);
2241
+ ensureColumn("plans", "task_list_id", "TEXT");
2242
+ ensureColumn("plans", "agent_id", "TEXT");
2243
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_tasks_plan ON tasks(plan_id)");
2244
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_tasks_task_list ON tasks(task_list_id)");
2245
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_tasks_due_at ON tasks(due_at)");
2246
+ ensureIndex("CREATE UNIQUE INDEX IF NOT EXISTS idx_tasks_short_id ON tasks(short_id) WHERE short_id IS NOT NULL");
2247
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_agents_name ON agents(name)");
2248
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_task_lists_project ON task_lists(project_id)");
2249
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_task_lists_slug ON task_lists(slug)");
2250
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_task_tags_tag ON task_tags(tag)");
2251
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_task_tags_task ON task_tags(task_id)");
2252
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_project ON plans(project_id)");
2253
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_status ON plans(status)");
2254
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_task_list ON plans(task_list_id)");
2255
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_plans_agent ON plans(agent_id)");
2256
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_task_history_task ON task_history(task_id)");
2257
+ ensureIndex("CREATE INDEX IF NOT EXISTS idx_task_history_agent ON task_history(agent_id)");
2164
2258
  }
2165
2259
  function backfillTaskTags(db) {
2166
2260
  try {
@@ -2390,6 +2484,51 @@ var init_database = __esm(() => {
2390
2484
  CREATE INDEX IF NOT EXISTS idx_plans_task_list ON plans(task_list_id);
2391
2485
  CREATE INDEX IF NOT EXISTS idx_plans_agent ON plans(agent_id);
2392
2486
  INSERT OR IGNORE INTO _migrations (id) VALUES (9);
2487
+ `,
2488
+ `
2489
+ CREATE TABLE IF NOT EXISTS task_history (
2490
+ id TEXT PRIMARY KEY,
2491
+ task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
2492
+ action TEXT NOT NULL,
2493
+ field TEXT,
2494
+ old_value TEXT,
2495
+ new_value TEXT,
2496
+ agent_id TEXT,
2497
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
2498
+ );
2499
+ CREATE INDEX IF NOT EXISTS idx_task_history_task ON task_history(task_id);
2500
+ CREATE INDEX IF NOT EXISTS idx_task_history_agent ON task_history(agent_id);
2501
+
2502
+ CREATE TABLE IF NOT EXISTS webhooks (
2503
+ id TEXT PRIMARY KEY,
2504
+ url TEXT NOT NULL,
2505
+ events TEXT NOT NULL DEFAULT '[]',
2506
+ secret TEXT,
2507
+ active INTEGER NOT NULL DEFAULT 1,
2508
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
2509
+ );
2510
+
2511
+ CREATE TABLE IF NOT EXISTS task_templates (
2512
+ id TEXT PRIMARY KEY,
2513
+ name TEXT NOT NULL,
2514
+ title_pattern TEXT NOT NULL,
2515
+ description TEXT,
2516
+ priority TEXT DEFAULT 'medium',
2517
+ tags TEXT DEFAULT '[]',
2518
+ project_id TEXT REFERENCES projects(id) ON DELETE SET NULL,
2519
+ plan_id TEXT REFERENCES plans(id) ON DELETE SET NULL,
2520
+ metadata TEXT DEFAULT '{}',
2521
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
2522
+ );
2523
+
2524
+ ALTER TABLE tasks ADD COLUMN estimated_minutes INTEGER;
2525
+ ALTER TABLE tasks ADD COLUMN requires_approval INTEGER NOT NULL DEFAULT 0;
2526
+ ALTER TABLE tasks ADD COLUMN approved_by TEXT;
2527
+ ALTER TABLE tasks ADD COLUMN approved_at TEXT;
2528
+
2529
+ ALTER TABLE agents ADD COLUMN permissions TEXT DEFAULT '["*"]';
2530
+
2531
+ INSERT OR IGNORE INTO _migrations (id) VALUES (10);
2393
2532
  `
2394
2533
  ];
2395
2534
  });
@@ -2763,7 +2902,8 @@ function rowToTask(row) {
2763
2902
  tags: JSON.parse(row.tags || "[]"),
2764
2903
  metadata: JSON.parse(row.metadata || "{}"),
2765
2904
  status: row.status,
2766
- priority: row.priority
2905
+ priority: row.priority,
2906
+ requires_approval: !!row.requires_approval
2767
2907
  };
2768
2908
  }
2769
2909
  function insertTaskTags(taskId, tags, db) {
@@ -2786,8 +2926,8 @@ function createTask(input, db) {
2786
2926
  const tags = input.tags || [];
2787
2927
  const shortId = input.project_id ? nextTaskShortId(input.project_id, d) : null;
2788
2928
  const title = shortId ? `${shortId}: ${input.title}` : input.title;
2789
- d.run(`INSERT INTO tasks (id, short_id, project_id, parent_id, plan_id, task_list_id, title, description, status, priority, agent_id, assigned_to, session_id, working_dir, tags, metadata, version, created_at, updated_at, due_at)
2790
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?, ?, ?)`, [
2929
+ d.run(`INSERT INTO tasks (id, short_id, project_id, parent_id, plan_id, task_list_id, title, description, status, priority, agent_id, assigned_to, session_id, working_dir, tags, metadata, version, created_at, updated_at, due_at, estimated_minutes, requires_approval, approved_by, approved_at)
2930
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?, ?, ?, ?, ?, ?, ?)`, [
2791
2931
  id,
2792
2932
  shortId,
2793
2933
  input.project_id || null,
@@ -2806,7 +2946,11 @@ function createTask(input, db) {
2806
2946
  JSON.stringify(input.metadata || {}),
2807
2947
  timestamp,
2808
2948
  timestamp,
2809
- input.due_at || null
2949
+ input.due_at || null,
2950
+ input.estimated_minutes || null,
2951
+ input.requires_approval ? 1 : 0,
2952
+ null,
2953
+ null
2810
2954
  ]);
2811
2955
  if (tags.length > 0) {
2812
2956
  insertTaskTags(id, tags, d);
@@ -2978,6 +3122,20 @@ function updateTask(id, input, db) {
2978
3122
  sets.push("due_at = ?");
2979
3123
  params.push(input.due_at);
2980
3124
  }
3125
+ if (input.estimated_minutes !== undefined) {
3126
+ sets.push("estimated_minutes = ?");
3127
+ params.push(input.estimated_minutes);
3128
+ }
3129
+ if (input.requires_approval !== undefined) {
3130
+ sets.push("requires_approval = ?");
3131
+ params.push(input.requires_approval ? 1 : 0);
3132
+ }
3133
+ if (input.approved_by !== undefined) {
3134
+ sets.push("approved_by = ?");
3135
+ params.push(input.approved_by);
3136
+ sets.push("approved_at = ?");
3137
+ params.push(now());
3138
+ }
2981
3139
  params.push(id, input.version);
2982
3140
  const result = d.run(`UPDATE tasks SET ${sets.join(", ")} WHERE id = ? AND version = ?`, params);
2983
3141
  if (result.changes === 0) {
@@ -3121,6 +3279,7 @@ function shortUuid() {
3121
3279
  function rowToAgent(row) {
3122
3280
  return {
3123
3281
  ...row,
3282
+ permissions: JSON.parse(row.permissions || '["*"]'),
3124
3283
  metadata: JSON.parse(row.metadata || "{}")
3125
3284
  };
3126
3285
  }
@@ -3133,8 +3292,17 @@ function registerAgent(input, db) {
3133
3292
  }
3134
3293
  const id = shortUuid();
3135
3294
  const timestamp = now();
3136
- d.run(`INSERT INTO agents (id, name, description, role, metadata, created_at, last_seen_at)
3137
- VALUES (?, ?, ?, ?, ?, ?, ?)`, [id, input.name, input.description || null, input.role || "agent", JSON.stringify(input.metadata || {}), timestamp, timestamp]);
3295
+ d.run(`INSERT INTO agents (id, name, description, role, permissions, metadata, created_at, last_seen_at)
3296
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [
3297
+ id,
3298
+ input.name,
3299
+ input.description || null,
3300
+ input.role || "agent",
3301
+ JSON.stringify(input.permissions || ["*"]),
3302
+ JSON.stringify(input.metadata || {}),
3303
+ timestamp,
3304
+ timestamp
3305
+ ]);
3138
3306
  return getAgent(id, d);
3139
3307
  }
3140
3308
  function getAgent(id, db) {
@@ -3174,6 +3342,10 @@ function updateAgent(id, input, db) {
3174
3342
  sets.push("role = ?");
3175
3343
  params.push(input.role);
3176
3344
  }
3345
+ if (input.permissions !== undefined) {
3346
+ sets.push("permissions = ?");
3347
+ params.push(JSON.stringify(input.permissions));
3348
+ }
3177
3349
  if (input.metadata !== undefined) {
3178
3350
  sets.push("metadata = ?");
3179
3351
  params.push(JSON.stringify(input.metadata));
@@ -9,5 +9,11 @@ export declare function getAgent(id: string, db?: Database): Agent | null;
9
9
  export declare function getAgentByName(name: string, db?: Database): Agent | null;
10
10
  export declare function listAgents(db?: Database): Agent[];
11
11
  export declare function updateAgentActivity(id: string, db?: Database): void;
12
+ export declare function updateAgent(id: string, input: {
13
+ name?: string;
14
+ description?: string;
15
+ role?: string;
16
+ metadata?: Record<string, unknown>;
17
+ }, db?: Database): Agent;
12
18
  export declare function deleteAgent(id: string, db?: Database): boolean;
13
19
  //# sourceMappingURL=agents.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/db/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAY,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAc7E;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,KAAK,CAmB7E;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,IAAI,CAIhE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,IAAI,CAIxE;AAED,wBAAgB,UAAU,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,CAGjD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAGnE;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAG9D"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/db/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAY,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAc7E;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,KAAK,CAmB7E;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,IAAI,CAIhE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,IAAI,CAIxE;AAED,wBAAgB,UAAU,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,CAGjD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAGnE;AAED,wBAAgB,WAAW,CACzB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EACjG,EAAE,CAAC,EAAE,QAAQ,GACZ,KAAK,CA4BP;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAG9D"}
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAgNtC,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAkBrD;AAiDD,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,GAAG,IAAI,MAAM,CAE5B;AAED,wBAAgB,IAAI,IAAI,MAAM,CAE7B;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAK9D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,SAAa,GAAG,MAAM,CAG3D;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAGpD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB9F"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AA2RtC,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAkBrD;AA6ED,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,GAAG,IAAI,MAAM,CAE5B;AAED,wBAAgB,IAAI,IAAI,MAAM,CAE7B;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAK9D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,SAAa,GAAG,MAAM,CAG3D;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAGpD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB9F"}
@@ -1 +1 @@
1
- {"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../../src/db/plans.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIhF,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAoBtE;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAI9D;AAED,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,EAAE,CAUnE;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,eAAe,EACtB,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,CAyBN;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAI7D"}
1
+ {"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../../src/db/plans.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIhF,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAsBtE;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAI9D;AAED,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,EAAE,CAUnE;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,eAAe,EACtB,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,CAiCN;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAI7D"}
@@ -7,5 +7,6 @@ export declare function getProjectByPath(path: string, db?: Database): Project |
7
7
  export declare function listProjects(db?: Database): Project[];
8
8
  export declare function updateProject(id: string, input: Partial<Pick<Project, "name" | "description" | "task_list_id">>, db?: Database): Project;
9
9
  export declare function deleteProject(id: string, db?: Database): boolean;
10
+ export declare function nextTaskShortId(projectId: string, db?: Database): string | null;
10
11
  export declare function ensureProject(name: string, path: string, db?: Database): Project;
11
12
  //# sourceMappingURL=projects.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/db/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAIrE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,kBAAkB,EACzB,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAaT;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CAIpE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CAM5E;AAED,wBAAgB,YAAY,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,EAAE,CAKrD;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,cAAc,CAAC,CAAC,EACtE,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAyBT;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAIhE;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAKT"}
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/db/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAIrE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAyBD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,kBAAkB,EACzB,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAcT;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CAIpE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CAM5E;AAED,wBAAgB,YAAY,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,EAAE,CAKrD;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,cAAc,CAAC,CAAC,EACtE,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAyBT;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAIhE;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAS/E;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAaT"}
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/db/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,IAAI,EACJ,cAAc,EACd,UAAU,EAEV,iBAAiB,EACjB,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAgC3B,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAmCtE;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAK9D;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,MAAM,EACV,EAAE,CAAC,EAAE,QAAQ,GACZ,iBAAiB,GAAG,IAAI,CAiD1B;AAED,wBAAgB,SAAS,CAAC,MAAM,GAAE,UAAe,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,EAAE,CAwFxE;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,eAAe,EACtB,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,CA4EN;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAI7D;AAED,wBAAgB,SAAS,CACvB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,CAmBN;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,EAChB,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,CAuBN;AAED,wBAAgB,QAAQ,CACtB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,EAAE,CAAC,EAAE,QAAQ,GACZ,UAAU,CAiCZ;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,EAChB,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAkBT;AAID,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,CAgBN;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAOT;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,EAAE,CAAC,EAAE,QAAQ,GACZ,cAAc,EAAE,CAKlB;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,EAAE,CAAC,EAAE,QAAQ,GACZ,cAAc,EAAE,CAKlB"}
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/db/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,IAAI,EACJ,cAAc,EACd,UAAU,EAEV,iBAAiB,EACjB,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAkC3B,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CA2CtE;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAK9D;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,MAAM,EACV,EAAE,CAAC,EAAE,QAAQ,GACZ,iBAAiB,GAAG,IAAI,CAiD1B;AAED,wBAAgB,SAAS,CAAC,MAAM,GAAE,UAAe,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,EAAE,CA8FxE;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,eAAe,EACtB,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,CAoFN;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAI7D;AAED,wBAAgB,SAAS,CACvB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,CAmBN;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,EAChB,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,CA0BN;AAED,wBAAgB,QAAQ,CACtB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,EAAE,CAAC,EAAE,QAAQ,GACZ,UAAU,CAiCZ;AAED,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,EAChB,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAkBT;AAID,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,CAgBN;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAOT;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,EAAE,CAAC,EAAE,QAAQ,GACZ,cAAc,EAAE,CAKlB;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,EAAE,CAAC,EAAE,QAAQ,GACZ,cAAc,EAAE,CAKlB"}
package/dist/index.d.ts CHANGED
@@ -1,16 +1,17 @@
1
1
  export { getDatabase, closeDatabase, resetDatabase, resolvePartialId, now, uuid } from "./db/database.js";
2
2
  export { createTask, getTask, getTaskWithRelations, listTasks, updateTask, deleteTask, startTask, completeTask, lockTask, unlockTask, addDependency, removeDependency, getTaskDependencies, getTaskDependents, } from "./db/tasks.js";
3
- export { createProject, getProject, getProjectByPath, listProjects, updateProject, deleteProject, ensureProject, slugify, } from "./db/projects.js";
3
+ export { createProject, getProject, getProjectByPath, listProjects, updateProject, deleteProject, ensureProject, nextTaskShortId, slugify, } from "./db/projects.js";
4
4
  export { createPlan, getPlan, listPlans, updatePlan, deletePlan, } from "./db/plans.js";
5
5
  export { addComment, getComment, listComments, deleteComment, } from "./db/comments.js";
6
- export { registerAgent, getAgent, getAgentByName, listAgents, updateAgentActivity, deleteAgent, } from "./db/agents.js";
6
+ export { registerAgent, getAgent, getAgentByName, listAgents, updateAgent, updateAgentActivity, deleteAgent, } from "./db/agents.js";
7
7
  export { createTaskList, getTaskList, getTaskListBySlug, listTaskLists, updateTaskList, deleteTaskList, ensureTaskList, } from "./db/task-lists.js";
8
8
  export { createSession, getSession, listSessions, updateSessionActivity, deleteSession, } from "./db/sessions.js";
9
9
  export { searchTasks } from "./lib/search.js";
10
10
  export { defaultSyncAgents, syncWithAgent, syncWithAgents } from "./lib/sync.js";
11
11
  export type { SyncResult } from "./lib/sync-types.js";
12
- export { loadConfig } from "./lib/config.js";
13
- export type { TodosConfig, AgentConfig } from "./lib/config.js";
12
+ export { loadConfig, getCompletionGuardConfig } from "./lib/config.js";
13
+ export type { TodosConfig, AgentConfig, CompletionGuardConfig } from "./lib/config.js";
14
+ export { checkCompletionGuard } from "./lib/completion-guard.js";
14
15
  export type { Task, TaskWithRelations, CreateTaskInput, UpdateTaskInput, TaskFilter, TaskStatus, TaskPriority, TaskDependency, TaskComment, CreateCommentInput, Project, CreateProjectInput, Plan, CreatePlanInput, UpdatePlanInput, PlanStatus, Session, CreateSessionInput, Agent, AgentRow, RegisterAgentInput, TaskList, TaskListRow, CreateTaskListInput, UpdateTaskListInput, LockResult, TaskRow, SessionRow, } from "./types/index.js";
15
- export { TASK_STATUSES, TASK_PRIORITIES, PLAN_STATUSES, VersionConflictError, TaskNotFoundError, ProjectNotFoundError, PlanNotFoundError, LockError, DependencyCycleError, AgentNotFoundError, TaskListNotFoundError, } from "./types/index.js";
16
+ export { TASK_STATUSES, TASK_PRIORITIES, PLAN_STATUSES, VersionConflictError, TaskNotFoundError, ProjectNotFoundError, PlanNotFoundError, LockError, DependencyCycleError, AgentNotFoundError, TaskListNotFoundError, CompletionGuardError, } from "./types/index.js";
16
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG1G,OAAO,EACL,UAAU,EACV,OAAO,EACP,oBAAoB,EACpB,SAAS,EACT,UAAU,EACV,UAAU,EACV,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,aAAa,EACb,OAAO,GACR,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,UAAU,EACV,OAAO,EACP,SAAS,EACT,UAAU,EACV,UAAU,GACX,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,aAAa,GACd,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,aAAa,EACb,QAAQ,EACR,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,cAAc,EACd,cAAc,GACf,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,aAAa,EACb,UAAU,EACV,YAAY,EACZ,qBAAqB,EACrB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACjF,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGhE,YAAY,EACV,IAAI,EACJ,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,UAAU,EACV,UAAU,EACV,YAAY,EACZ,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,kBAAkB,EAClB,IAAI,EACJ,eAAe,EACf,eAAe,EACf,UAAU,EACV,OAAO,EACP,kBAAkB,EAClB,KAAK,EACL,QAAQ,EACR,kBAAkB,EAClB,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,UAAU,EACV,OAAO,EACP,UAAU,GACX,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,aAAa,EACb,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,SAAS,EACT,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG1G,OAAO,EACL,UAAU,EACV,OAAO,EACP,oBAAoB,EACpB,SAAS,EACT,UAAU,EACV,UAAU,EACV,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,EACf,OAAO,GACR,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,UAAU,EACV,OAAO,EACP,SAAS,EACT,UAAU,EACV,UAAU,GACX,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,aAAa,GACd,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,aAAa,EACb,QAAQ,EACR,cAAc,EACd,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,cAAc,EACd,cAAc,GACf,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,aAAa,EACb,UAAU,EACV,YAAY,EACZ,qBAAqB,EACrB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACjF,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AACvE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGjE,YAAY,EACV,IAAI,EACJ,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,UAAU,EACV,UAAU,EACV,YAAY,EACZ,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,kBAAkB,EAClB,IAAI,EACJ,eAAe,EACf,eAAe,EACf,UAAU,EACV,OAAO,EACP,kBAAkB,EAClB,KAAK,EACL,QAAQ,EACR,kBAAkB,EAClB,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,UAAU,EACV,OAAO,EACP,UAAU,GACX,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,aAAa,EACb,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,SAAS,EACT,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC"}