@proletariat/cli 0.3.86 → 0.3.88

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.
Files changed (170) hide show
  1. package/dist/commands/config/index.js +42 -0
  2. package/dist/commands/config/index.js.map +1 -1
  3. package/dist/commands/init.d.ts +6 -1
  4. package/dist/commands/init.js +44 -89
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/commands/new.d.ts +30 -2
  7. package/dist/commands/new.js +141 -9
  8. package/dist/commands/new.js.map +1 -1
  9. package/dist/commands/session/poke.d.ts +3 -7
  10. package/dist/commands/session/poke.js +5 -7
  11. package/dist/commands/session/poke.js.map +1 -1
  12. package/dist/commands/ticket/cancel.js +2 -0
  13. package/dist/commands/ticket/cancel.js.map +1 -1
  14. package/dist/commands/ticket/complete.js +2 -0
  15. package/dist/commands/ticket/complete.js.map +1 -1
  16. package/dist/commands/ticket/delete.js +2 -0
  17. package/dist/commands/ticket/delete.js.map +1 -1
  18. package/dist/commands/ticket/edit.js +5 -0
  19. package/dist/commands/ticket/edit.js.map +1 -1
  20. package/dist/commands/ticket/move.js +2 -0
  21. package/dist/commands/ticket/move.js.map +1 -1
  22. package/dist/commands/ticket/project.js +2 -0
  23. package/dist/commands/ticket/project.js.map +1 -1
  24. package/dist/commands/ticket/reassign.js +2 -0
  25. package/dist/commands/ticket/reassign.js.map +1 -1
  26. package/dist/commands/ticket/resolve.js +2 -0
  27. package/dist/commands/ticket/resolve.js.map +1 -1
  28. package/dist/commands/ticket/update.js +5 -0
  29. package/dist/commands/ticket/update.js.map +1 -1
  30. package/dist/commands/work/complete.js +2 -0
  31. package/dist/commands/work/complete.js.map +1 -1
  32. package/dist/commands/work/peek.js +4 -0
  33. package/dist/commands/work/peek.js.map +1 -1
  34. package/dist/commands/work/poke.d.ts +3 -4
  35. package/dist/commands/work/poke.js +9 -4
  36. package/dist/commands/work/poke.js.map +1 -1
  37. package/dist/commands/work/ready.js +2 -0
  38. package/dist/commands/work/ready.js.map +1 -1
  39. package/dist/commands/work/start.d.ts +1 -0
  40. package/dist/commands/work/start.js +46 -2
  41. package/dist/commands/work/start.js.map +1 -1
  42. package/dist/commands/work/stop.js +5 -0
  43. package/dist/commands/work/stop.js.map +1 -1
  44. package/dist/hooks/init.js +6 -6
  45. package/dist/hooks/init.js.map +1 -1
  46. package/dist/hooks/postrun.js +3 -0
  47. package/dist/hooks/postrun.js.map +1 -1
  48. package/dist/lib/asana/config.d.ts +1 -1
  49. package/dist/lib/asana/config.js +18 -30
  50. package/dist/lib/asana/config.js.map +1 -1
  51. package/dist/lib/asana/mapper.d.ts +4 -3
  52. package/dist/lib/asana/mapper.js +17 -10
  53. package/dist/lib/asana/mapper.js.map +1 -1
  54. package/dist/lib/database/agents.d.ts +73 -0
  55. package/dist/lib/database/agents.js +341 -0
  56. package/dist/lib/database/agents.js.map +1 -0
  57. package/dist/lib/database/driver.d.ts +115 -0
  58. package/dist/lib/database/driver.js +109 -0
  59. package/dist/lib/database/driver.js.map +1 -0
  60. package/dist/lib/database/drizzle-schema.d.ts +1 -1
  61. package/dist/lib/database/index.d.ts +25 -287
  62. package/dist/lib/database/index.js +35 -1067
  63. package/dist/lib/database/index.js.map +1 -1
  64. package/dist/lib/database/media.d.ts +53 -0
  65. package/dist/lib/database/media.js +118 -0
  66. package/dist/lib/database/media.js.map +1 -0
  67. package/dist/lib/database/migrations/0011_add_review_gate.d.ts +8 -0
  68. package/dist/lib/database/migrations/0011_add_review_gate.js +21 -0
  69. package/dist/lib/database/migrations/0011_add_review_gate.js.map +1 -0
  70. package/dist/lib/database/migrations/index.js +2 -0
  71. package/dist/lib/database/migrations/index.js.map +1 -1
  72. package/dist/lib/database/pmo-bootstrap.d.ts +30 -0
  73. package/dist/lib/database/pmo-bootstrap.js +105 -0
  74. package/dist/lib/database/pmo-bootstrap.js.map +1 -0
  75. package/dist/lib/database/repositories.d.ts +26 -0
  76. package/dist/lib/database/repositories.js +56 -0
  77. package/dist/lib/database/repositories.js.map +1 -0
  78. package/dist/lib/database/settings-store.d.ts +60 -0
  79. package/dist/lib/database/settings-store.js +87 -0
  80. package/dist/lib/database/settings-store.js.map +1 -0
  81. package/dist/lib/database/themes.d.ts +59 -0
  82. package/dist/lib/database/themes.js +212 -0
  83. package/dist/lib/database/themes.js.map +1 -0
  84. package/dist/lib/database/workspace.d.ts +46 -0
  85. package/dist/lib/database/workspace.js +158 -0
  86. package/dist/lib/database/workspace.js.map +1 -0
  87. package/dist/lib/database/worktrees.d.ts +33 -0
  88. package/dist/lib/database/worktrees.js +60 -0
  89. package/dist/lib/database/worktrees.js.map +1 -0
  90. package/dist/lib/execution/config.d.ts +1 -1
  91. package/dist/lib/execution/config.js +7 -17
  92. package/dist/lib/execution/config.js.map +1 -1
  93. package/dist/lib/execution/runners/prompt-builder.js +49 -15
  94. package/dist/lib/execution/runners/prompt-builder.js.map +1 -1
  95. package/dist/lib/execution/spawner.d.ts +1 -1
  96. package/dist/lib/execution/storage.d.ts +6 -4
  97. package/dist/lib/execution/storage.js +17 -9
  98. package/dist/lib/execution/storage.js.map +1 -1
  99. package/dist/lib/execution/types.d.ts +1 -0
  100. package/dist/lib/execution/types.js.map +1 -1
  101. package/dist/lib/external-issues/mapping-store.d.ts +4 -3
  102. package/dist/lib/external-issues/mapping-store.js +21 -13
  103. package/dist/lib/external-issues/mapping-store.js.map +1 -1
  104. package/dist/lib/external-issues/outbound-sync.d.ts +1 -1
  105. package/dist/lib/jira/config.d.ts +1 -6
  106. package/dist/lib/jira/config.js +16 -33
  107. package/dist/lib/jira/config.js.map +1 -1
  108. package/dist/lib/linear/config.d.ts +1 -1
  109. package/dist/lib/linear/config.js +16 -38
  110. package/dist/lib/linear/config.js.map +1 -1
  111. package/dist/lib/linear/mapper.d.ts +4 -3
  112. package/dist/lib/linear/mapper.js +20 -13
  113. package/dist/lib/linear/mapper.js.map +1 -1
  114. package/dist/lib/mcp/tools/action.js +34 -0
  115. package/dist/lib/mcp/tools/action.js.map +1 -1
  116. package/dist/lib/monday/config.d.ts +1 -1
  117. package/dist/lib/monday/config.js +16 -32
  118. package/dist/lib/monday/config.js.map +1 -1
  119. package/dist/lib/monday/mapper.d.ts +4 -3
  120. package/dist/lib/monday/mapper.js +19 -12
  121. package/dist/lib/monday/mapper.js.map +1 -1
  122. package/dist/lib/onboarding/wizard.d.ts +2 -2
  123. package/dist/lib/onboarding/wizard.js +32 -24
  124. package/dist/lib/onboarding/wizard.js.map +1 -1
  125. package/dist/lib/pmo/diet.d.ts +1 -1
  126. package/dist/lib/pmo/schema.d.ts +1 -1
  127. package/dist/lib/pmo/schema.js +1 -0
  128. package/dist/lib/pmo/schema.js.map +1 -1
  129. package/dist/lib/pmo/storage/actions.js +9 -3
  130. package/dist/lib/pmo/storage/actions.js.map +1 -1
  131. package/dist/lib/pmo/storage/index.d.ts +9 -0
  132. package/dist/lib/pmo/storage/index.js +16 -1
  133. package/dist/lib/pmo/storage/index.js.map +1 -1
  134. package/dist/lib/pmo/storage/tickets.d.ts +7 -0
  135. package/dist/lib/pmo/storage/tickets.js +33 -2
  136. package/dist/lib/pmo/storage/tickets.js.map +1 -1
  137. package/dist/lib/pmo/storage/types.d.ts +5 -1
  138. package/dist/lib/pmo/types.d.ts +10 -0
  139. package/dist/lib/pmo/types.js.map +1 -1
  140. package/dist/lib/pmo/utils.d.ts +38 -0
  141. package/dist/lib/pmo/utils.js +61 -0
  142. package/dist/lib/pmo/utils.js.map +1 -1
  143. package/dist/lib/providers/event-emitting-provider.js +13 -2
  144. package/dist/lib/providers/event-emitting-provider.js.map +1 -1
  145. package/dist/lib/shortcut/config.d.ts +1 -7
  146. package/dist/lib/shortcut/config.js +13 -32
  147. package/dist/lib/shortcut/config.js.map +1 -1
  148. package/dist/lib/telemetry/analytics.d.ts +47 -0
  149. package/dist/lib/telemetry/analytics.js +52 -0
  150. package/dist/lib/telemetry/analytics.js.map +1 -1
  151. package/dist/lib/telemetry/telemetry-bridge.d.ts +35 -0
  152. package/dist/lib/telemetry/telemetry-bridge.js +139 -0
  153. package/dist/lib/telemetry/telemetry-bridge.js.map +1 -0
  154. package/dist/lib/trello/config.d.ts +1 -26
  155. package/dist/lib/trello/config.js +23 -64
  156. package/dist/lib/trello/config.js.map +1 -1
  157. package/dist/lib/trello/mapper.d.ts +4 -3
  158. package/dist/lib/trello/mapper.js +17 -10
  159. package/dist/lib/trello/mapper.js.map +1 -1
  160. package/dist/lib/work-lifecycle/post-execution.d.ts +6 -2
  161. package/dist/lib/work-lifecycle/post-execution.js +30 -18
  162. package/dist/lib/work-lifecycle/post-execution.js.map +1 -1
  163. package/dist/lib/work-source/config.d.ts +1 -1
  164. package/dist/lib/work-source/config.js +14 -24
  165. package/dist/lib/work-source/config.js.map +1 -1
  166. package/dist/lib/work-source/provider-sources.d.ts +1 -1
  167. package/dist/lib/work-source/provider-sources.js +8 -20
  168. package/dist/lib/work-source/provider-sources.js.map +1 -1
  169. package/oclif.manifest.json +1035 -987
  170. package/package.json +9 -9
@@ -1,5 +1,5 @@
1
1
  import { loadProviderSources, resolveApiKey } from '../work-source/provider-sources.js';
2
- const SETTINGS_TABLE = 'workspace_settings';
2
+ import { SettingsStore } from '../database/settings-store.js';
3
3
  const ASANA_CONFIG_KEYS = {
4
4
  accessToken: 'asana.access_token',
5
5
  workspaceGid: 'asana.workspace_gid',
@@ -7,51 +7,39 @@ const ASANA_CONFIG_KEYS = {
7
7
  projectGid: 'asana.project_gid',
8
8
  projectName: 'asana.project_name',
9
9
  };
10
- function getSetting(db, key) {
11
- const row = db
12
- .prepare(`SELECT value FROM ${SETTINGS_TABLE} WHERE key = ?`)
13
- .get(key);
14
- return row?.value ?? null;
15
- }
16
- function setSetting(db, key, value) {
17
- db.prepare(`
18
- INSERT INTO ${SETTINGS_TABLE} (key, value)
19
- VALUES (?, ?)
20
- ON CONFLICT(key) DO UPDATE SET value = excluded.value
21
- `).run(key, value);
22
- }
23
- function deleteSetting(db, key) {
24
- db.prepare(`DELETE FROM ${SETTINGS_TABLE} WHERE key = ?`).run(key);
25
- }
26
10
  export function isAsanaConfigured(db) {
27
- return getSetting(db, ASANA_CONFIG_KEYS.accessToken) !== null;
11
+ return new SettingsStore(db).has(ASANA_CONFIG_KEYS.accessToken);
28
12
  }
29
13
  export function loadAsanaConfig(db) {
30
- const accessToken = getSetting(db, ASANA_CONFIG_KEYS.accessToken);
14
+ const settings = new SettingsStore(db);
15
+ const accessToken = settings.get(ASANA_CONFIG_KEYS.accessToken);
31
16
  if (!accessToken)
32
17
  return null;
33
18
  return {
34
19
  accessToken,
35
- workspaceGid: getSetting(db, ASANA_CONFIG_KEYS.workspaceGid) ?? undefined,
36
- workspaceName: getSetting(db, ASANA_CONFIG_KEYS.workspaceName) ?? undefined,
37
- projectGid: getSetting(db, ASANA_CONFIG_KEYS.projectGid) ?? undefined,
38
- projectName: getSetting(db, ASANA_CONFIG_KEYS.projectName) ?? undefined,
20
+ workspaceGid: settings.get(ASANA_CONFIG_KEYS.workspaceGid) ?? undefined,
21
+ workspaceName: settings.get(ASANA_CONFIG_KEYS.workspaceName) ?? undefined,
22
+ projectGid: settings.get(ASANA_CONFIG_KEYS.projectGid) ?? undefined,
23
+ projectName: settings.get(ASANA_CONFIG_KEYS.projectName) ?? undefined,
39
24
  };
40
25
  }
41
26
  export function saveAsanaAccessToken(db, accessToken) {
42
- setSetting(db, ASANA_CONFIG_KEYS.accessToken, accessToken);
27
+ new SettingsStore(db).set(ASANA_CONFIG_KEYS.accessToken, accessToken);
43
28
  }
44
29
  export function saveAsanaWorkspace(db, workspaceGid, workspaceName) {
45
- setSetting(db, ASANA_CONFIG_KEYS.workspaceGid, workspaceGid);
46
- setSetting(db, ASANA_CONFIG_KEYS.workspaceName, workspaceName);
30
+ const settings = new SettingsStore(db);
31
+ settings.set(ASANA_CONFIG_KEYS.workspaceGid, workspaceGid);
32
+ settings.set(ASANA_CONFIG_KEYS.workspaceName, workspaceName);
47
33
  }
48
34
  export function saveAsanaProject(db, projectGid, projectName) {
49
- setSetting(db, ASANA_CONFIG_KEYS.projectGid, projectGid);
50
- setSetting(db, ASANA_CONFIG_KEYS.projectName, projectName);
35
+ const settings = new SettingsStore(db);
36
+ settings.set(ASANA_CONFIG_KEYS.projectGid, projectGid);
37
+ settings.set(ASANA_CONFIG_KEYS.projectName, projectName);
51
38
  }
52
39
  export function clearAsanaConfig(db) {
40
+ const settings = new SettingsStore(db);
53
41
  for (const key of Object.values(ASANA_CONFIG_KEYS)) {
54
- deleteSetting(db, key);
42
+ settings.delete(key);
55
43
  }
56
44
  }
57
45
  export function getAsanaAccessToken(db) {
@@ -74,6 +62,6 @@ export function getAsanaAccessToken(db) {
74
62
  if (envToken)
75
63
  return envToken;
76
64
  // 3. Legacy: stored workspace setting
77
- return getSetting(db, ASANA_CONFIG_KEYS.accessToken);
65
+ return new SettingsStore(db).get(ASANA_CONFIG_KEYS.accessToken);
78
66
  }
79
67
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/asana/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/asana/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAE7D,MAAM,iBAAiB,GAAG;IACxB,WAAW,EAAE,oBAAoB;IACjC,YAAY,EAAE,qBAAqB;IACnC,aAAa,EAAE,sBAAsB;IACrC,UAAU,EAAE,mBAAmB;IAC/B,WAAW,EAAE,oBAAoB;CACzB,CAAA;AAEV,MAAM,UAAU,iBAAiB,CAAC,EAAqB;IACrD,OAAO,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAA;AACjE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAqB;IACnD,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,EAAE,CAAC,CAAA;IACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAA;IAC/D,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAA;IAE7B,OAAO;QACL,WAAW;QACX,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,SAAS;QACvE,aAAa,EAAE,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,SAAS;QACzE,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,SAAS;QACnE,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,SAAS;KACtE,CAAA;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAqB,EAAE,WAAmB;IAC7E,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;AACvE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAqB,EAAE,YAAoB,EAAE,aAAqB;IACnG,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,EAAE,CAAC,CAAA;IACtC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;IAC1D,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAqB,EAAE,UAAkB,EAAE,WAAmB;IAC7F,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,EAAE,CAAC,CAAA;IACtC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;IACtD,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAqB;IACpD,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,EAAE,CAAC,CAAA;IACtC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACnD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACtB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAqB;IACvD,iEAAiE;IACjE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAA;QACvC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;gBACrC,IAAI,GAAG;oBAAE,OAAO,GAAG,CAAA;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;IAED,mCAAmC;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;IACtF,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAE7B,sCAAsC;IACtC,OAAO,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAA;AACjE,CAAC"}
@@ -1,8 +1,9 @@
1
- import Database from 'better-sqlite3';
1
+ import type Database from 'better-sqlite3';
2
2
  import type { AsanaTaskMap } from './types.js';
3
+ import { type DatabaseDriver } from '../database/driver.js';
3
4
  export declare class AsanaMapper {
4
- private db;
5
- constructor(db: Database.Database);
5
+ private driver;
6
+ constructor(dbOrDriver: DatabaseDriver | Database.Database);
6
7
  private ensureTable;
7
8
  createOrUpdateMapping(pmoTicketId: string, asanaTaskGid: string, asanaProjectGid?: string): void;
8
9
  getByTicketId(ticketId: string): AsanaTaskMap | null;
@@ -1,12 +1,19 @@
1
1
  import { PMO_TABLES } from '../pmo/schema.js';
2
+ import { wrapDatabase } from '../database/driver.js';
3
+ function toDriver(dbOrDriver) {
4
+ if ('prepare' in dbOrDriver && 'pragma' in dbOrDriver && !('raw' in dbOrDriver)) {
5
+ return wrapDatabase(dbOrDriver);
6
+ }
7
+ return dbOrDriver;
8
+ }
2
9
  export class AsanaMapper {
3
- db;
4
- constructor(db) {
5
- this.db = db;
10
+ driver;
11
+ constructor(dbOrDriver) {
12
+ this.driver = toDriver(dbOrDriver);
6
13
  this.ensureTable();
7
14
  }
8
15
  ensureTable() {
9
- this.db.exec(`
16
+ this.driver.exec(`
10
17
  CREATE TABLE IF NOT EXISTS ${PMO_TABLES.asana_task_map} (
11
18
  pmo_ticket_id TEXT NOT NULL REFERENCES ${PMO_TABLES.tickets}(id) ON DELETE CASCADE,
12
19
  asana_task_gid TEXT NOT NULL,
@@ -17,13 +24,13 @@ export class AsanaMapper {
17
24
  UNIQUE (asana_task_gid)
18
25
  )
19
26
  `);
20
- this.db.exec(`
27
+ this.driver.exec(`
21
28
  CREATE INDEX IF NOT EXISTS idx_pmo_asana_task_map_task_gid
22
29
  ON ${PMO_TABLES.asana_task_map}(asana_task_gid)
23
30
  `);
24
31
  }
25
32
  createOrUpdateMapping(pmoTicketId, asanaTaskGid, asanaProjectGid) {
26
- this.db.prepare(`
33
+ this.driver.prepare(`
27
34
  INSERT INTO ${PMO_TABLES.asana_task_map}
28
35
  (pmo_ticket_id, asana_task_gid, asana_project_gid, last_synced_at, created_at)
29
36
  VALUES (?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
@@ -34,25 +41,25 @@ export class AsanaMapper {
34
41
  `).run(pmoTicketId, asanaTaskGid, asanaProjectGid ?? null);
35
42
  }
36
43
  getByTicketId(ticketId) {
37
- const row = this.db.prepare(`
44
+ const row = this.driver.prepare(`
38
45
  SELECT * FROM ${PMO_TABLES.asana_task_map} WHERE pmo_ticket_id = ?
39
46
  `).get(ticketId);
40
47
  return row ? this.rowToMap(row) : null;
41
48
  }
42
49
  getByTaskGid(asanaTaskGid) {
43
- const row = this.db.prepare(`
50
+ const row = this.driver.prepare(`
44
51
  SELECT * FROM ${PMO_TABLES.asana_task_map} WHERE asana_task_gid = ?
45
52
  `).get(asanaTaskGid);
46
53
  return row ? this.rowToMap(row) : null;
47
54
  }
48
55
  listMappings() {
49
- const rows = this.db.prepare(`
56
+ const rows = this.driver.prepare(`
50
57
  SELECT * FROM ${PMO_TABLES.asana_task_map} ORDER BY created_at DESC
51
58
  `).all();
52
59
  return rows.map((row) => this.rowToMap(row));
53
60
  }
54
61
  updateSyncTimestamp(ticketId) {
55
- this.db.prepare(`
62
+ this.driver.prepare(`
56
63
  UPDATE ${PMO_TABLES.asana_task_map}
57
64
  SET last_synced_at = CURRENT_TIMESTAMP
58
65
  WHERE pmo_ticket_id = ?
@@ -1 +1 @@
1
- {"version":3,"file":"mapper.js","sourceRoot":"","sources":["../../../src/lib/asana/mapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAG7C,MAAM,OAAO,WAAW;IACF;IAApB,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;QACvC,IAAI,CAAC,WAAW,EAAE,CAAA;IACpB,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;mCACkB,UAAU,CAAC,cAAc;iDACX,UAAU,CAAC,OAAO;;;;;;;;KAQ9D,CAAC,CAAA;QAEF,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;aAEJ,UAAU,CAAC,cAAc;KACjC,CAAC,CAAA;IACJ,CAAC;IAED,qBAAqB,CAAC,WAAmB,EAAE,YAAoB,EAAE,eAAwB;QACvF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;oBACA,UAAU,CAAC,cAAc;;;;;;;KAOxC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,eAAe,IAAI,IAAI,CAAC,CAAA;IAC5D,CAAC;IAED,aAAa,CAAC,QAAgB;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;sBACV,UAAU,CAAC,cAAc;KAC1C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAwC,CAAA;QAEvD,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACxC,CAAC;IAED,YAAY,CAAC,YAAoB;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;sBACV,UAAU,CAAC,cAAc;KAC1C,CAAC,CAAC,GAAG,CAAC,YAAY,CAAwC,CAAA;QAE3D,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACxC,CAAC;IAED,YAAY;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;sBACX,UAAU,CAAC,cAAc;KAC1C,CAAC,CAAC,GAAG,EAA+B,CAAA;QAErC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAC9C,CAAC;IAED,mBAAmB,CAAC,QAAgB;QAClC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;eACL,UAAU,CAAC,cAAc;;;KAGnC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClB,CAAC;IAEO,QAAQ,CAAC,GAA4B;QAC3C,OAAO;YACL,WAAW,EAAE,GAAG,CAAC,aAAuB;YACxC,YAAY,EAAE,GAAG,CAAC,cAAwB;YAC1C,eAAe,EAAG,GAAG,CAAC,iBAAmC,IAAI,SAAS;YACtE,YAAY,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,cAAwB,CAAC,CAAC,CAAC,CAAC,SAAS;YACrF,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAoB,CAAC;SAC9C,CAAA;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"mapper.js","sourceRoot":"","sources":["../../../src/lib/asana/mapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAuB,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEzE,SAAS,QAAQ,CAAC,UAA8C;IAC9D,IAAI,SAAS,IAAI,UAAU,IAAI,QAAQ,IAAI,UAAU,IAAI,CAAC,CAAC,KAAK,IAAI,UAAU,CAAC,EAAE,CAAC;QAChF,OAAO,YAAY,CAAC,UAA+B,CAAC,CAAA;IACtD,CAAC;IACD,OAAO,UAA4B,CAAA;AACrC,CAAC;AAED,MAAM,OAAO,WAAW;IACd,MAAM,CAAgB;IAE9B,YAAY,UAA8C;QACxD,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAA;QAClC,IAAI,CAAC,WAAW,EAAE,CAAA;IACpB,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;mCACc,UAAU,CAAC,cAAc;iDACX,UAAU,CAAC,OAAO;;;;;;;;KAQ9D,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;;aAER,UAAU,CAAC,cAAc;KACjC,CAAC,CAAA;IACJ,CAAC;IAED,qBAAqB,CAAC,WAAmB,EAAE,YAAoB,EAAE,eAAwB;QACvF,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;oBACJ,UAAU,CAAC,cAAc;;;;;;;KAOxC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,eAAe,IAAI,IAAI,CAAC,CAAA;IAC5D,CAAC;IAED,aAAa,CAAC,QAAgB;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAA0B;sBACvC,UAAU,CAAC,cAAc;KAC1C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAEhB,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACxC,CAAC;IAED,YAAY,CAAC,YAAoB;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAA0B;sBACvC,UAAU,CAAC,cAAc;KAC1C,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QAEpB,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACxC,CAAC;IAED,YAAY;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAA0B;sBACxC,UAAU,CAAC,cAAc;KAC1C,CAAC,CAAC,GAAG,EAAE,CAAA;QAER,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAC9C,CAAC;IAED,mBAAmB,CAAC,QAAgB;QAClC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;eACT,UAAU,CAAC,cAAc;;;KAGnC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClB,CAAC;IAEO,QAAQ,CAAC,GAA4B;QAC3C,OAAO;YACL,WAAW,EAAE,GAAG,CAAC,aAAuB;YACxC,YAAY,EAAE,GAAG,CAAC,cAAwB;YAC1C,eAAe,EAAG,GAAG,CAAC,iBAAmC,IAAI,SAAS;YACtE,YAAY,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,cAAwB,CAAC,CAAC,CAAC,CAAC,SAAS;YACrF,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAoB,CAAC;SAC9C,CAAA;IACH,CAAC;CACF"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Agent Database Operations
3
+ *
4
+ * CRUD operations for agents in the workspace database.
5
+ */
6
+ export type AgentType = 'persistent' | 'ephemeral';
7
+ export type AgentStatus = 'active' | 'cleaned';
8
+ export type MountMode = 'worktree' | 'clone';
9
+ export interface Agent {
10
+ name: string;
11
+ type: AgentType;
12
+ status: AgentStatus;
13
+ base_name: string | null;
14
+ theme_id: string | null;
15
+ worktree_path: string | null;
16
+ mount_mode: MountMode;
17
+ created_at: string;
18
+ cleaned_at: string | null;
19
+ }
20
+ /**
21
+ * Add agents to database (case-insensitive uniqueness)
22
+ */
23
+ export declare function addAgentsToDatabase(workspacePath: string, agentNames: string[], themeId?: string, mountMode?: MountMode): void;
24
+ /**
25
+ * Add an ephemeral agent to the database.
26
+ * Throws on name collision.
27
+ */
28
+ export declare function addEphemeralAgentToDatabase(workspacePath: string, agentName: string, baseName: string, themeId?: string, mountMode?: MountMode): Agent;
29
+ /**
30
+ * Try to add an ephemeral agent to the database.
31
+ * Returns null if the name already exists (concurrency-safe).
32
+ */
33
+ export declare function tryAddEphemeralAgentToDatabase(workspacePath: string, agentName: string, baseName: string, themeId?: string, mountMode?: MountMode): Agent | null;
34
+ /**
35
+ * Get all ephemeral agent names from the database
36
+ */
37
+ export declare function getEphemeralAgentNames(workspacePath: string): Set<string>;
38
+ /**
39
+ * Remove an ephemeral agent from the database
40
+ */
41
+ export declare function removeEphemeralAgent(workspacePath: string, agentName: string): void;
42
+ /**
43
+ * Get all agents in workspace
44
+ */
45
+ export declare function getWorkspaceAgents(workspacePath: string, includeCleanedUp?: boolean): Agent[];
46
+ /**
47
+ * Get an agent by directory path.
48
+ */
49
+ export declare function getAgentByPath(workspacePath: string, absolutePath: string): Agent | null;
50
+ /**
51
+ * Mark an agent as cleaned up
52
+ */
53
+ export declare function markAgentCleaned(workspacePath: string, agentName: string): void;
54
+ /**
55
+ * Sync agents in database with what exists on disk.
56
+ */
57
+ export declare function syncAgentsWithDisk(workspacePath: string): string[];
58
+ export interface DiscoverResult {
59
+ discovered: {
60
+ name: string;
61
+ type: AgentType;
62
+ path: string;
63
+ }[];
64
+ cleaned: string[];
65
+ }
66
+ /**
67
+ * Discover agents on disk that aren't in the database and register them.
68
+ */
69
+ export declare function discoverAgentsOnDisk(workspacePath: string): DiscoverResult;
70
+ /**
71
+ * Remove agents from database
72
+ */
73
+ export declare function removeAgentsFromDatabase(workspacePath: string, agentNames: string[]): void;
@@ -0,0 +1,341 @@
1
+ /**
2
+ * Agent Database Operations
3
+ *
4
+ * CRUD operations for agents in the workspace database.
5
+ */
6
+ import * as fs from 'node:fs';
7
+ import * as path from 'node:path';
8
+ import { eq, and, or, isNull, sql, asc } from 'drizzle-orm';
9
+ import { getThemePersistentDir } from '../themes.js';
10
+ import { createDrizzleConnection } from './drizzle.js';
11
+ import { workspace as workspaceTable, repositories as repositoriesTable, agents as agentsTable, agentWorktrees as agentWorktreesTable, } from './drizzle-schema.js';
12
+ import { withDrizzle, openWorkspaceDatabase } from './workspace.js';
13
+ /**
14
+ * Map a Drizzle agent row to the Agent interface.
15
+ */
16
+ function toAgent(row) {
17
+ return {
18
+ name: row.name,
19
+ type: (row.type || 'persistent'),
20
+ status: (row.status || 'active'),
21
+ base_name: row.baseName,
22
+ theme_id: row.themeId,
23
+ worktree_path: row.worktreePath,
24
+ mount_mode: (row.mountMode || 'worktree'),
25
+ created_at: row.createdAt,
26
+ cleaned_at: row.cleanedAt,
27
+ };
28
+ }
29
+ /**
30
+ * Add agents to database (case-insensitive uniqueness)
31
+ */
32
+ export function addAgentsToDatabase(workspacePath, agentNames, themeId, mountMode = 'worktree') {
33
+ withDrizzle(workspacePath, (ddb, sqliteDb) => {
34
+ const wsRow = ddb.select().from(workspaceTable).get();
35
+ if (!wsRow)
36
+ throw new Error('No workspace config found');
37
+ const repos = ddb.select({ name: repositoriesTable.name }).from(repositoriesTable).all();
38
+ const effectiveThemeId = themeId || wsRow.activeThemeId || undefined;
39
+ const persistentDir = getThemePersistentDir(effectiveThemeId);
40
+ const transaction = sqliteDb.transaction(() => {
41
+ for (const agentName of agentNames) {
42
+ const existing = ddb.select({ name: agentsTable.name })
43
+ .from(agentsTable)
44
+ .where(sql `LOWER(${agentsTable.name}) = LOWER(${agentName})`)
45
+ .get();
46
+ if (existing) {
47
+ continue;
48
+ }
49
+ const now = new Date().toISOString();
50
+ const agentWorktreePath = wsRow.type === 'hq'
51
+ ? `agents/${persistentDir}/${agentName}`
52
+ : agentName;
53
+ ddb.insert(agentsTable).values({
54
+ name: agentName,
55
+ type: 'persistent',
56
+ baseName: null,
57
+ themeId: effectiveThemeId || null,
58
+ worktreePath: agentWorktreePath,
59
+ mountMode,
60
+ createdAt: now,
61
+ }).onConflictDoUpdate({
62
+ target: agentsTable.name,
63
+ set: {
64
+ type: 'persistent',
65
+ baseName: null,
66
+ themeId: effectiveThemeId || null,
67
+ worktreePath: agentWorktreePath,
68
+ mountMode,
69
+ createdAt: now,
70
+ },
71
+ }).run();
72
+ for (const repo of repos) {
73
+ const worktreePath = wsRow.type === 'hq'
74
+ ? `agents/${persistentDir}/${agentName}/${repo.name}`
75
+ : `${agentName}/${repo.name}`;
76
+ ddb.insert(agentWorktreesTable).values({
77
+ agentName,
78
+ repoName: repo.name,
79
+ worktreePath,
80
+ branch: `agent-${agentName}`,
81
+ createdAt: now,
82
+ }).onConflictDoUpdate({
83
+ target: [agentWorktreesTable.agentName, agentWorktreesTable.repoName],
84
+ set: {
85
+ worktreePath,
86
+ branch: `agent-${agentName}`,
87
+ createdAt: now,
88
+ },
89
+ }).run();
90
+ }
91
+ }
92
+ });
93
+ transaction();
94
+ });
95
+ }
96
+ /**
97
+ * Add an ephemeral agent to the database.
98
+ * Throws on name collision.
99
+ */
100
+ export function addEphemeralAgentToDatabase(workspacePath, agentName, baseName, themeId, mountMode = 'worktree') {
101
+ const result = tryAddEphemeralAgentToDatabase(workspacePath, agentName, baseName, themeId, mountMode);
102
+ if (!result) {
103
+ throw new Error(`Agent name "${agentName}" already exists (UNIQUE constraint failed: agents.name)`);
104
+ }
105
+ return result;
106
+ }
107
+ /**
108
+ * Try to add an ephemeral agent to the database.
109
+ * Returns null if the name already exists (concurrency-safe).
110
+ */
111
+ export function tryAddEphemeralAgentToDatabase(workspacePath, agentName, baseName, themeId, mountMode = 'worktree') {
112
+ const sqliteDb = openWorkspaceDatabase(workspacePath);
113
+ const ddb = createDrizzleConnection(sqliteDb);
114
+ try {
115
+ const now = new Date().toISOString();
116
+ const worktreePath = `agents/temp/${agentName}`;
117
+ ddb.insert(agentsTable).values({
118
+ name: agentName,
119
+ type: 'ephemeral',
120
+ status: 'active',
121
+ baseName,
122
+ themeId: themeId || null,
123
+ worktreePath,
124
+ mountMode,
125
+ createdAt: now,
126
+ }).run();
127
+ const agent = ddb.select().from(agentsTable)
128
+ .where(eq(agentsTable.name, agentName))
129
+ .get();
130
+ if (!agent)
131
+ return null;
132
+ return toAgent(agent);
133
+ }
134
+ catch (err) {
135
+ const sqliteErr = err;
136
+ if (sqliteErr.code === 'SQLITE_CONSTRAINT_PRIMARYKEY' || sqliteErr.code === 'SQLITE_CONSTRAINT_UNIQUE') {
137
+ return null;
138
+ }
139
+ throw err;
140
+ }
141
+ finally {
142
+ sqliteDb.close();
143
+ }
144
+ }
145
+ /**
146
+ * Get all ephemeral agent names from the database
147
+ */
148
+ export function getEphemeralAgentNames(workspacePath) {
149
+ return withDrizzle(workspacePath, (ddb) => {
150
+ const rows = ddb.select({ name: agentsTable.name })
151
+ .from(agentsTable)
152
+ .where(eq(agentsTable.type, 'ephemeral'))
153
+ .all();
154
+ return new Set(rows.map(a => a.name.toLowerCase()));
155
+ });
156
+ }
157
+ /**
158
+ * Remove an ephemeral agent from the database
159
+ */
160
+ export function removeEphemeralAgent(workspacePath, agentName) {
161
+ withDrizzle(workspacePath, (ddb) => {
162
+ ddb.delete(agentsTable)
163
+ .where(and(eq(agentsTable.name, agentName), eq(agentsTable.type, 'ephemeral')))
164
+ .run();
165
+ });
166
+ }
167
+ /**
168
+ * Get all agents in workspace
169
+ */
170
+ export function getWorkspaceAgents(workspacePath, includeCleanedUp = false) {
171
+ return withDrizzle(workspacePath, (ddb) => {
172
+ let rows;
173
+ if (includeCleanedUp) {
174
+ rows = ddb.select().from(agentsTable)
175
+ .orderBy(asc(agentsTable.createdAt))
176
+ .all();
177
+ }
178
+ else {
179
+ rows = ddb.select().from(agentsTable)
180
+ .where(or(eq(agentsTable.status, 'active'), isNull(agentsTable.status)))
181
+ .orderBy(asc(agentsTable.createdAt))
182
+ .all();
183
+ }
184
+ return rows.map(toAgent);
185
+ });
186
+ }
187
+ /**
188
+ * Get an agent by directory path.
189
+ */
190
+ export function getAgentByPath(workspacePath, absolutePath) {
191
+ const normalizedWorkspace = path.resolve(workspacePath);
192
+ const normalizedPath = path.resolve(absolutePath);
193
+ if (!normalizedPath.startsWith(normalizedWorkspace)) {
194
+ return null;
195
+ }
196
+ const relativePath = path.relative(normalizedWorkspace, normalizedPath);
197
+ return withDrizzle(workspacePath, (ddb) => {
198
+ const rows = ddb.select().from(agentsTable)
199
+ .where(or(eq(agentsTable.status, 'active'), isNull(agentsTable.status)))
200
+ .all();
201
+ for (const row of rows) {
202
+ if (row.worktreePath) {
203
+ if (relativePath === row.worktreePath || relativePath.startsWith(row.worktreePath + '/')) {
204
+ return toAgent(row);
205
+ }
206
+ }
207
+ }
208
+ return null;
209
+ });
210
+ }
211
+ /**
212
+ * Mark an agent as cleaned up
213
+ */
214
+ export function markAgentCleaned(workspacePath, agentName) {
215
+ withDrizzle(workspacePath, (ddb) => {
216
+ ddb.update(agentsTable)
217
+ .set({ status: 'cleaned', cleanedAt: new Date().toISOString() })
218
+ .where(eq(agentsTable.name, agentName))
219
+ .run();
220
+ });
221
+ }
222
+ /**
223
+ * Sync agents in database with what exists on disk.
224
+ */
225
+ export function syncAgentsWithDisk(workspacePath) {
226
+ const agentList = getWorkspaceAgents(workspacePath, false);
227
+ const cleanedAgents = [];
228
+ for (const agent of agentList) {
229
+ let agentDir;
230
+ if (agent.worktree_path) {
231
+ agentDir = path.join(workspacePath, agent.worktree_path);
232
+ }
233
+ else if (agent.type === 'ephemeral') {
234
+ agentDir = path.join(workspacePath, 'agents', 'temp', agent.name);
235
+ }
236
+ else {
237
+ agentDir = path.join(workspacePath, 'agents', 'staff', agent.name);
238
+ }
239
+ if (!fs.existsSync(agentDir)) {
240
+ markAgentCleaned(workspacePath, agent.name);
241
+ cleanedAgents.push(agent.name);
242
+ }
243
+ }
244
+ return cleanedAgents;
245
+ }
246
+ /**
247
+ * Discover agents on disk that aren't in the database and register them.
248
+ */
249
+ export function discoverAgentsOnDisk(workspacePath) {
250
+ const result = { discovered: [], cleaned: [] };
251
+ result.cleaned = syncAgentsWithDisk(workspacePath);
252
+ const activeAgents = getWorkspaceAgents(workspacePath, false);
253
+ const activeNames = new Set(activeAgents.map(a => a.name.toLowerCase()));
254
+ const allAgents = getWorkspaceAgents(workspacePath, true);
255
+ const cleanedAgentsMap = new Map(allAgents.filter(a => a.status === 'cleaned').map(a => [a.name.toLowerCase(), a]));
256
+ withDrizzle(workspacePath, (ddb) => {
257
+ // Scan staff directory
258
+ const staffDir = path.join(workspacePath, 'agents', 'staff');
259
+ if (fs.existsSync(staffDir)) {
260
+ const staffEntries = fs.readdirSync(staffDir, { withFileTypes: true });
261
+ for (const entry of staffEntries) {
262
+ if (entry.isDirectory() && !entry.name.startsWith('.')) {
263
+ const nameLower = entry.name.toLowerCase();
264
+ if (!activeNames.has(nameLower)) {
265
+ const worktreePath = `agents/staff/${entry.name}`;
266
+ const now = new Date().toISOString();
267
+ const cleanedAgent = cleanedAgentsMap.get(nameLower);
268
+ if (cleanedAgent) {
269
+ ddb.update(agentsTable)
270
+ .set({ status: 'active', cleanedAt: null, worktreePath })
271
+ .where(sql `LOWER(${agentsTable.name}) = LOWER(${entry.name})`)
272
+ .run();
273
+ }
274
+ else {
275
+ ddb.insert(agentsTable).values({
276
+ name: entry.name,
277
+ type: 'persistent',
278
+ status: 'active',
279
+ worktreePath,
280
+ mountMode: 'worktree',
281
+ createdAt: now,
282
+ }).run();
283
+ }
284
+ result.discovered.push({ name: entry.name, type: 'persistent', path: worktreePath });
285
+ activeNames.add(nameLower);
286
+ }
287
+ }
288
+ }
289
+ }
290
+ // Scan temp directory
291
+ const tempDir = path.join(workspacePath, 'agents', 'temp');
292
+ if (fs.existsSync(tempDir)) {
293
+ const tempEntries = fs.readdirSync(tempDir, { withFileTypes: true });
294
+ for (const entry of tempEntries) {
295
+ if (entry.isDirectory() && !entry.name.startsWith('.')) {
296
+ const nameLower = entry.name.toLowerCase();
297
+ if (!activeNames.has(nameLower)) {
298
+ const worktreePath = `agents/temp/${entry.name}`;
299
+ const now = new Date().toISOString();
300
+ const cleanedAgent = cleanedAgentsMap.get(nameLower);
301
+ if (cleanedAgent) {
302
+ ddb.update(agentsTable)
303
+ .set({ status: 'active', cleanedAt: null, worktreePath })
304
+ .where(sql `LOWER(${agentsTable.name}) = LOWER(${entry.name})`)
305
+ .run();
306
+ }
307
+ else {
308
+ ddb.insert(agentsTable).values({
309
+ name: entry.name,
310
+ type: 'ephemeral',
311
+ status: 'active',
312
+ worktreePath,
313
+ mountMode: 'worktree',
314
+ createdAt: now,
315
+ }).run();
316
+ }
317
+ result.discovered.push({ name: entry.name, type: 'ephemeral', path: worktreePath });
318
+ activeNames.add(nameLower);
319
+ }
320
+ }
321
+ }
322
+ }
323
+ });
324
+ return result;
325
+ }
326
+ /**
327
+ * Remove agents from database
328
+ */
329
+ export function removeAgentsFromDatabase(workspacePath, agentNames) {
330
+ withDrizzle(workspacePath, (ddb, sqliteDb) => {
331
+ const transaction = sqliteDb.transaction(() => {
332
+ for (const agentName of agentNames) {
333
+ ddb.delete(agentsTable)
334
+ .where(eq(agentsTable.name, agentName))
335
+ .run();
336
+ }
337
+ });
338
+ transaction();
339
+ });
340
+ }
341
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/lib/database/agents.ts"],"names":[],"mappings":"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"}