@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.
- package/dist/commands/config/index.js +42 -0
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/init.d.ts +6 -1
- package/dist/commands/init.js +44 -89
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/new.d.ts +30 -2
- package/dist/commands/new.js +141 -9
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/session/poke.d.ts +3 -7
- package/dist/commands/session/poke.js +5 -7
- package/dist/commands/session/poke.js.map +1 -1
- package/dist/commands/ticket/cancel.js +2 -0
- package/dist/commands/ticket/cancel.js.map +1 -1
- package/dist/commands/ticket/complete.js +2 -0
- package/dist/commands/ticket/complete.js.map +1 -1
- package/dist/commands/ticket/delete.js +2 -0
- package/dist/commands/ticket/delete.js.map +1 -1
- package/dist/commands/ticket/edit.js +5 -0
- package/dist/commands/ticket/edit.js.map +1 -1
- package/dist/commands/ticket/move.js +2 -0
- package/dist/commands/ticket/move.js.map +1 -1
- package/dist/commands/ticket/project.js +2 -0
- package/dist/commands/ticket/project.js.map +1 -1
- package/dist/commands/ticket/reassign.js +2 -0
- package/dist/commands/ticket/reassign.js.map +1 -1
- package/dist/commands/ticket/resolve.js +2 -0
- package/dist/commands/ticket/resolve.js.map +1 -1
- package/dist/commands/ticket/update.js +5 -0
- package/dist/commands/ticket/update.js.map +1 -1
- package/dist/commands/work/complete.js +2 -0
- package/dist/commands/work/complete.js.map +1 -1
- package/dist/commands/work/peek.js +4 -0
- package/dist/commands/work/peek.js.map +1 -1
- package/dist/commands/work/poke.d.ts +3 -4
- package/dist/commands/work/poke.js +9 -4
- package/dist/commands/work/poke.js.map +1 -1
- package/dist/commands/work/ready.js +2 -0
- package/dist/commands/work/ready.js.map +1 -1
- package/dist/commands/work/start.d.ts +1 -0
- package/dist/commands/work/start.js +46 -2
- package/dist/commands/work/start.js.map +1 -1
- package/dist/commands/work/stop.js +5 -0
- package/dist/commands/work/stop.js.map +1 -1
- package/dist/hooks/init.js +6 -6
- package/dist/hooks/init.js.map +1 -1
- package/dist/hooks/postrun.js +3 -0
- package/dist/hooks/postrun.js.map +1 -1
- package/dist/lib/asana/config.d.ts +1 -1
- package/dist/lib/asana/config.js +18 -30
- package/dist/lib/asana/config.js.map +1 -1
- package/dist/lib/asana/mapper.d.ts +4 -3
- package/dist/lib/asana/mapper.js +17 -10
- package/dist/lib/asana/mapper.js.map +1 -1
- package/dist/lib/database/agents.d.ts +73 -0
- package/dist/lib/database/agents.js +341 -0
- package/dist/lib/database/agents.js.map +1 -0
- package/dist/lib/database/driver.d.ts +115 -0
- package/dist/lib/database/driver.js +109 -0
- package/dist/lib/database/driver.js.map +1 -0
- package/dist/lib/database/drizzle-schema.d.ts +1 -1
- package/dist/lib/database/index.d.ts +25 -287
- package/dist/lib/database/index.js +35 -1067
- package/dist/lib/database/index.js.map +1 -1
- package/dist/lib/database/media.d.ts +53 -0
- package/dist/lib/database/media.js +118 -0
- package/dist/lib/database/media.js.map +1 -0
- package/dist/lib/database/migrations/0011_add_review_gate.d.ts +8 -0
- package/dist/lib/database/migrations/0011_add_review_gate.js +21 -0
- package/dist/lib/database/migrations/0011_add_review_gate.js.map +1 -0
- package/dist/lib/database/migrations/index.js +2 -0
- package/dist/lib/database/migrations/index.js.map +1 -1
- package/dist/lib/database/pmo-bootstrap.d.ts +30 -0
- package/dist/lib/database/pmo-bootstrap.js +105 -0
- package/dist/lib/database/pmo-bootstrap.js.map +1 -0
- package/dist/lib/database/repositories.d.ts +26 -0
- package/dist/lib/database/repositories.js +56 -0
- package/dist/lib/database/repositories.js.map +1 -0
- package/dist/lib/database/settings-store.d.ts +60 -0
- package/dist/lib/database/settings-store.js +87 -0
- package/dist/lib/database/settings-store.js.map +1 -0
- package/dist/lib/database/themes.d.ts +59 -0
- package/dist/lib/database/themes.js +212 -0
- package/dist/lib/database/themes.js.map +1 -0
- package/dist/lib/database/workspace.d.ts +46 -0
- package/dist/lib/database/workspace.js +158 -0
- package/dist/lib/database/workspace.js.map +1 -0
- package/dist/lib/database/worktrees.d.ts +33 -0
- package/dist/lib/database/worktrees.js +60 -0
- package/dist/lib/database/worktrees.js.map +1 -0
- package/dist/lib/execution/config.d.ts +1 -1
- package/dist/lib/execution/config.js +7 -17
- package/dist/lib/execution/config.js.map +1 -1
- package/dist/lib/execution/runners/prompt-builder.js +49 -15
- package/dist/lib/execution/runners/prompt-builder.js.map +1 -1
- package/dist/lib/execution/spawner.d.ts +1 -1
- package/dist/lib/execution/storage.d.ts +6 -4
- package/dist/lib/execution/storage.js +17 -9
- package/dist/lib/execution/storage.js.map +1 -1
- package/dist/lib/execution/types.d.ts +1 -0
- package/dist/lib/execution/types.js.map +1 -1
- package/dist/lib/external-issues/mapping-store.d.ts +4 -3
- package/dist/lib/external-issues/mapping-store.js +21 -13
- package/dist/lib/external-issues/mapping-store.js.map +1 -1
- package/dist/lib/external-issues/outbound-sync.d.ts +1 -1
- package/dist/lib/jira/config.d.ts +1 -6
- package/dist/lib/jira/config.js +16 -33
- package/dist/lib/jira/config.js.map +1 -1
- package/dist/lib/linear/config.d.ts +1 -1
- package/dist/lib/linear/config.js +16 -38
- package/dist/lib/linear/config.js.map +1 -1
- package/dist/lib/linear/mapper.d.ts +4 -3
- package/dist/lib/linear/mapper.js +20 -13
- package/dist/lib/linear/mapper.js.map +1 -1
- package/dist/lib/mcp/tools/action.js +34 -0
- package/dist/lib/mcp/tools/action.js.map +1 -1
- package/dist/lib/monday/config.d.ts +1 -1
- package/dist/lib/monday/config.js +16 -32
- package/dist/lib/monday/config.js.map +1 -1
- package/dist/lib/monday/mapper.d.ts +4 -3
- package/dist/lib/monday/mapper.js +19 -12
- package/dist/lib/monday/mapper.js.map +1 -1
- package/dist/lib/onboarding/wizard.d.ts +2 -2
- package/dist/lib/onboarding/wizard.js +32 -24
- package/dist/lib/onboarding/wizard.js.map +1 -1
- package/dist/lib/pmo/diet.d.ts +1 -1
- package/dist/lib/pmo/schema.d.ts +1 -1
- package/dist/lib/pmo/schema.js +1 -0
- package/dist/lib/pmo/schema.js.map +1 -1
- package/dist/lib/pmo/storage/actions.js +9 -3
- package/dist/lib/pmo/storage/actions.js.map +1 -1
- package/dist/lib/pmo/storage/index.d.ts +9 -0
- package/dist/lib/pmo/storage/index.js +16 -1
- package/dist/lib/pmo/storage/index.js.map +1 -1
- package/dist/lib/pmo/storage/tickets.d.ts +7 -0
- package/dist/lib/pmo/storage/tickets.js +33 -2
- package/dist/lib/pmo/storage/tickets.js.map +1 -1
- package/dist/lib/pmo/storage/types.d.ts +5 -1
- package/dist/lib/pmo/types.d.ts +10 -0
- package/dist/lib/pmo/types.js.map +1 -1
- package/dist/lib/pmo/utils.d.ts +38 -0
- package/dist/lib/pmo/utils.js +61 -0
- package/dist/lib/pmo/utils.js.map +1 -1
- package/dist/lib/providers/event-emitting-provider.js +13 -2
- package/dist/lib/providers/event-emitting-provider.js.map +1 -1
- package/dist/lib/shortcut/config.d.ts +1 -7
- package/dist/lib/shortcut/config.js +13 -32
- package/dist/lib/shortcut/config.js.map +1 -1
- package/dist/lib/telemetry/analytics.d.ts +47 -0
- package/dist/lib/telemetry/analytics.js +52 -0
- package/dist/lib/telemetry/analytics.js.map +1 -1
- package/dist/lib/telemetry/telemetry-bridge.d.ts +35 -0
- package/dist/lib/telemetry/telemetry-bridge.js +139 -0
- package/dist/lib/telemetry/telemetry-bridge.js.map +1 -0
- package/dist/lib/trello/config.d.ts +1 -26
- package/dist/lib/trello/config.js +23 -64
- package/dist/lib/trello/config.js.map +1 -1
- package/dist/lib/trello/mapper.d.ts +4 -3
- package/dist/lib/trello/mapper.js +17 -10
- package/dist/lib/trello/mapper.js.map +1 -1
- package/dist/lib/work-lifecycle/post-execution.d.ts +6 -2
- package/dist/lib/work-lifecycle/post-execution.js +30 -18
- package/dist/lib/work-lifecycle/post-execution.js.map +1 -1
- package/dist/lib/work-source/config.d.ts +1 -1
- package/dist/lib/work-source/config.js +14 -24
- package/dist/lib/work-source/config.js.map +1 -1
- package/dist/lib/work-source/provider-sources.d.ts +1 -1
- package/dist/lib/work-source/provider-sources.js +8 -20
- package/dist/lib/work-source/provider-sources.js.map +1 -1
- package/oclif.manifest.json +1035 -987
- package/package.json +9 -9
package/dist/lib/asana/config.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { loadProviderSources, resolveApiKey } from '../work-source/provider-sources.js';
|
|
2
|
-
|
|
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
|
|
11
|
+
return new SettingsStore(db).has(ASANA_CONFIG_KEYS.accessToken);
|
|
28
12
|
}
|
|
29
13
|
export function loadAsanaConfig(db) {
|
|
30
|
-
const
|
|
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:
|
|
36
|
-
workspaceName:
|
|
37
|
-
projectGid:
|
|
38
|
-
projectName:
|
|
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
|
-
|
|
27
|
+
new SettingsStore(db).set(ASANA_CONFIG_KEYS.accessToken, accessToken);
|
|
43
28
|
}
|
|
44
29
|
export function saveAsanaWorkspace(db, workspaceGid, workspaceName) {
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
50
|
-
|
|
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
|
-
|
|
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
|
|
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":"AAEA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/asana/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
5
|
-
constructor(
|
|
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;
|
package/dist/lib/asana/mapper.js
CHANGED
|
@@ -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
|
-
|
|
4
|
-
constructor(
|
|
5
|
-
this.
|
|
10
|
+
driver;
|
|
11
|
+
constructor(dbOrDriver) {
|
|
12
|
+
this.driver = toDriver(dbOrDriver);
|
|
6
13
|
this.ensureTable();
|
|
7
14
|
}
|
|
8
15
|
ensureTable() {
|
|
9
|
-
this.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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;
|
|
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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"}
|