@proletariat/cli 0.3.87 → 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/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/hooks/init.js +3 -6
- package/dist/hooks/init.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/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/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/spawner.d.ts +1 -1
- package/dist/lib/execution/storage.d.ts +4 -3
- package/dist/lib/execution/storage.js +11 -4
- package/dist/lib/execution/storage.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/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/storage/index.d.ts +8 -0
- package/dist/lib/pmo/storage/index.js +13 -1
- package/dist/lib/pmo/storage/index.js.map +1 -1
- package/dist/lib/pmo/storage/types.d.ts +4 -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/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 +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 +1461 -1412
- package/package.json +1 -1
|
@@ -2,41 +2,22 @@
|
|
|
2
2
|
* Trello Configuration Storage
|
|
3
3
|
*
|
|
4
4
|
* Stores Trello credentials and preferences in the workspace_settings table.
|
|
5
|
-
* Mirrors the Shortcut/Asana config module pattern.
|
|
6
5
|
*/
|
|
7
6
|
import { loadProviderSources, resolveApiKey } from '../work-source/provider-sources.js';
|
|
8
|
-
|
|
7
|
+
import { SettingsStore } from '../database/settings-store.js';
|
|
9
8
|
const TRELLO_CONFIG_KEYS = {
|
|
10
9
|
apiKey: 'trello.api_key',
|
|
11
10
|
apiToken: 'trello.api_token',
|
|
12
11
|
boardId: 'trello.board_id',
|
|
13
12
|
boardName: 'trello.board_name',
|
|
14
13
|
};
|
|
15
|
-
function getSetting(db, key) {
|
|
16
|
-
const row = db
|
|
17
|
-
.prepare(`SELECT value FROM ${SETTINGS_TABLE} WHERE key = ?`)
|
|
18
|
-
.get(key);
|
|
19
|
-
return row?.value ?? null;
|
|
20
|
-
}
|
|
21
|
-
function setSetting(db, key, value) {
|
|
22
|
-
db.prepare(`
|
|
23
|
-
INSERT INTO ${SETTINGS_TABLE} (key, value)
|
|
24
|
-
VALUES (?, ?)
|
|
25
|
-
ON CONFLICT(key) DO UPDATE SET value = excluded.value
|
|
26
|
-
`).run(key, value);
|
|
27
|
-
}
|
|
28
|
-
function deleteSetting(db, key) {
|
|
29
|
-
db.prepare(`DELETE FROM ${SETTINGS_TABLE} WHERE key = ?`).run(key);
|
|
30
|
-
}
|
|
31
14
|
/**
|
|
32
15
|
* Check if Trello is configured.
|
|
33
|
-
* Returns true if either:
|
|
34
|
-
* - Database has trello.api_key and trello.api_token stored, OR
|
|
35
|
-
* - Environment variables PRLT_TRELLO_API_KEY/TRELLO_API_KEY and PRLT_TRELLO_API_TOKEN/TRELLO_API_TOKEN are set
|
|
36
16
|
*/
|
|
37
17
|
export function isTrelloConfigured(db) {
|
|
38
|
-
const
|
|
39
|
-
|
|
18
|
+
const settings = new SettingsStore(db);
|
|
19
|
+
const hasDbConfig = settings.has(TRELLO_CONFIG_KEYS.apiKey)
|
|
20
|
+
&& settings.has(TRELLO_CONFIG_KEYS.apiToken);
|
|
40
21
|
if (hasDbConfig)
|
|
41
22
|
return true;
|
|
42
23
|
const hasEnvKey = !!(process.env.PRLT_TRELLO_API_KEY || process.env.TRELLO_API_KEY);
|
|
@@ -45,13 +26,13 @@ export function isTrelloConfigured(db) {
|
|
|
45
26
|
}
|
|
46
27
|
/**
|
|
47
28
|
* Load Trello configuration from the database + environment.
|
|
48
|
-
* Returns null if not configured.
|
|
49
29
|
*/
|
|
50
30
|
export function loadTrelloConfig(db) {
|
|
51
|
-
const
|
|
31
|
+
const settings = new SettingsStore(db);
|
|
32
|
+
const apiKey = settings.get(TRELLO_CONFIG_KEYS.apiKey)
|
|
52
33
|
|| process.env.PRLT_TRELLO_API_KEY
|
|
53
34
|
|| process.env.TRELLO_API_KEY;
|
|
54
|
-
const apiToken =
|
|
35
|
+
const apiToken = settings.get(TRELLO_CONFIG_KEYS.apiToken)
|
|
55
36
|
|| process.env.PRLT_TRELLO_API_TOKEN
|
|
56
37
|
|| process.env.TRELLO_API_TOKEN;
|
|
57
38
|
if (!apiKey || !apiToken)
|
|
@@ -59,58 +40,44 @@ export function loadTrelloConfig(db) {
|
|
|
59
40
|
return {
|
|
60
41
|
apiKey,
|
|
61
42
|
apiToken,
|
|
62
|
-
boardId:
|
|
43
|
+
boardId: settings.get(TRELLO_CONFIG_KEYS.boardId)
|
|
63
44
|
|| process.env.PRLT_TRELLO_BOARD_ID
|
|
64
45
|
|| undefined,
|
|
65
|
-
boardName:
|
|
46
|
+
boardName: settings.get(TRELLO_CONFIG_KEYS.boardName) || undefined,
|
|
66
47
|
};
|
|
67
48
|
}
|
|
68
49
|
/**
|
|
69
50
|
* Save Trello configuration to the database.
|
|
70
51
|
*/
|
|
71
52
|
export function saveTrelloConfig(db, config) {
|
|
72
|
-
|
|
73
|
-
|
|
53
|
+
const settings = new SettingsStore(db);
|
|
54
|
+
settings.set(TRELLO_CONFIG_KEYS.apiKey, config.apiKey);
|
|
55
|
+
settings.set(TRELLO_CONFIG_KEYS.apiToken, config.apiToken);
|
|
74
56
|
if (config.boardId) {
|
|
75
|
-
|
|
57
|
+
settings.set(TRELLO_CONFIG_KEYS.boardId, config.boardId);
|
|
76
58
|
}
|
|
77
59
|
if (config.boardName) {
|
|
78
|
-
|
|
60
|
+
settings.set(TRELLO_CONFIG_KEYS.boardName, config.boardName);
|
|
79
61
|
}
|
|
80
62
|
}
|
|
81
|
-
/**
|
|
82
|
-
* Save the Trello API key.
|
|
83
|
-
*/
|
|
84
63
|
export function saveTrelloApiKey(db, apiKey) {
|
|
85
|
-
|
|
64
|
+
new SettingsStore(db).set(TRELLO_CONFIG_KEYS.apiKey, apiKey);
|
|
86
65
|
}
|
|
87
|
-
/**
|
|
88
|
-
* Save the Trello API token.
|
|
89
|
-
*/
|
|
90
66
|
export function saveTrelloApiToken(db, apiToken) {
|
|
91
|
-
|
|
67
|
+
new SettingsStore(db).set(TRELLO_CONFIG_KEYS.apiToken, apiToken);
|
|
92
68
|
}
|
|
93
|
-
/**
|
|
94
|
-
* Save the Trello board.
|
|
95
|
-
*/
|
|
96
69
|
export function saveTrelloBoard(db, boardId, boardName) {
|
|
97
|
-
|
|
98
|
-
|
|
70
|
+
const settings = new SettingsStore(db);
|
|
71
|
+
settings.set(TRELLO_CONFIG_KEYS.boardId, boardId);
|
|
72
|
+
settings.set(TRELLO_CONFIG_KEYS.boardName, boardName);
|
|
99
73
|
}
|
|
100
|
-
/**
|
|
101
|
-
* Clear all Trello configuration from the database.
|
|
102
|
-
*/
|
|
103
74
|
export function clearTrelloConfig(db) {
|
|
75
|
+
const settings = new SettingsStore(db);
|
|
104
76
|
for (const key of Object.values(TRELLO_CONFIG_KEYS)) {
|
|
105
|
-
|
|
77
|
+
settings.delete(key);
|
|
106
78
|
}
|
|
107
79
|
}
|
|
108
|
-
/**
|
|
109
|
-
* Get the stored Trello API key.
|
|
110
|
-
* Also checks PRLT_TRELLO_API_KEY and TRELLO_API_KEY environment variables.
|
|
111
|
-
*/
|
|
112
80
|
export function getTrelloApiKey(db) {
|
|
113
|
-
// 1. Try provider sources (resolves apiKeyRef → trello.api_key)
|
|
114
81
|
try {
|
|
115
82
|
const sources = loadProviderSources(db);
|
|
116
83
|
for (const source of sources) {
|
|
@@ -124,23 +91,15 @@ export function getTrelloApiKey(db) {
|
|
|
124
91
|
catch {
|
|
125
92
|
// Provider sources may not exist in older databases
|
|
126
93
|
}
|
|
127
|
-
// 2. Legacy: environment variables
|
|
128
94
|
const envKey = process.env.PRLT_TRELLO_API_KEY || process.env.TRELLO_API_KEY;
|
|
129
95
|
if (envKey)
|
|
130
96
|
return envKey;
|
|
131
|
-
|
|
132
|
-
return getSetting(db, TRELLO_CONFIG_KEYS.apiKey);
|
|
97
|
+
return new SettingsStore(db).get(TRELLO_CONFIG_KEYS.apiKey);
|
|
133
98
|
}
|
|
134
|
-
/**
|
|
135
|
-
* Get the stored Trello API token.
|
|
136
|
-
* Also checks PRLT_TRELLO_API_TOKEN and TRELLO_API_TOKEN environment variables.
|
|
137
|
-
*/
|
|
138
99
|
export function getTrelloApiToken(db) {
|
|
139
|
-
// 1. Legacy: environment variables
|
|
140
100
|
const envToken = process.env.PRLT_TRELLO_API_TOKEN || process.env.TRELLO_API_TOKEN;
|
|
141
101
|
if (envToken)
|
|
142
102
|
return envToken;
|
|
143
|
-
|
|
144
|
-
return getSetting(db, TRELLO_CONFIG_KEYS.apiToken);
|
|
103
|
+
return new SettingsStore(db).get(TRELLO_CONFIG_KEYS.apiToken);
|
|
145
104
|
}
|
|
146
105
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/trello/config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/trello/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 { TrelloCardMap } from './types.js';
|
|
3
|
+
import { type DatabaseDriver } from '../database/driver.js';
|
|
3
4
|
export declare class TrelloMapper {
|
|
4
|
-
private
|
|
5
|
-
constructor(
|
|
5
|
+
private driver;
|
|
6
|
+
constructor(dbOrDriver: DatabaseDriver | Database.Database);
|
|
6
7
|
private ensureTable;
|
|
7
8
|
createOrUpdateMapping(pmoTicketId: string, trelloCardId: string, trelloBoardId?: string): void;
|
|
8
9
|
getByTicketId(ticketId: string): TrelloCardMap | 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 TrelloMapper {
|
|
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.trello_card_map} (
|
|
11
18
|
pmo_ticket_id TEXT NOT NULL REFERENCES ${PMO_TABLES.tickets}(id) ON DELETE CASCADE,
|
|
12
19
|
trello_card_id TEXT NOT NULL,
|
|
@@ -17,13 +24,13 @@ export class TrelloMapper {
|
|
|
17
24
|
UNIQUE (trello_card_id)
|
|
18
25
|
)
|
|
19
26
|
`);
|
|
20
|
-
this.
|
|
27
|
+
this.driver.exec(`
|
|
21
28
|
CREATE INDEX IF NOT EXISTS idx_pmo_trello_card_map_card_id
|
|
22
29
|
ON ${PMO_TABLES.trello_card_map}(trello_card_id)
|
|
23
30
|
`);
|
|
24
31
|
}
|
|
25
32
|
createOrUpdateMapping(pmoTicketId, trelloCardId, trelloBoardId) {
|
|
26
|
-
this.
|
|
33
|
+
this.driver.prepare(`
|
|
27
34
|
INSERT INTO ${PMO_TABLES.trello_card_map}
|
|
28
35
|
(pmo_ticket_id, trello_card_id, trello_board_id, last_synced_at, created_at)
|
|
29
36
|
VALUES (?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
|
|
@@ -34,25 +41,25 @@ export class TrelloMapper {
|
|
|
34
41
|
`).run(pmoTicketId, trelloCardId, trelloBoardId ?? null);
|
|
35
42
|
}
|
|
36
43
|
getByTicketId(ticketId) {
|
|
37
|
-
const row = this.
|
|
44
|
+
const row = this.driver.prepare(`
|
|
38
45
|
SELECT * FROM ${PMO_TABLES.trello_card_map} WHERE pmo_ticket_id = ?
|
|
39
46
|
`).get(ticketId);
|
|
40
47
|
return row ? this.rowToMap(row) : null;
|
|
41
48
|
}
|
|
42
49
|
getByCardId(trelloCardId) {
|
|
43
|
-
const row = this.
|
|
50
|
+
const row = this.driver.prepare(`
|
|
44
51
|
SELECT * FROM ${PMO_TABLES.trello_card_map} WHERE trello_card_id = ?
|
|
45
52
|
`).get(trelloCardId);
|
|
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.trello_card_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.trello_card_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/trello/mapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"mapper.js","sourceRoot":"","sources":["../../../src/lib/trello/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,YAAY;IACf,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,eAAe;iDACZ,UAAU,CAAC,OAAO;;;;;;;;KAQ9D,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;;aAER,UAAU,CAAC,eAAe;KAClC,CAAC,CAAA;IACJ,CAAC;IAED,qBAAqB,CAAC,WAAmB,EAAE,YAAoB,EAAE,aAAsB;QACrF,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;oBACJ,UAAU,CAAC,eAAe;;;;;;;KAOzC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,IAAI,IAAI,CAAC,CAAA;IAC1D,CAAC;IAED,aAAa,CAAC,QAAgB;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAA0B;sBACvC,UAAU,CAAC,eAAe;KAC3C,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,WAAW,CAAC,YAAoB;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAA0B;sBACvC,UAAU,CAAC,eAAe;KAC3C,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,eAAe;KAC3C,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,eAAe;;;KAGpC,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,aAAa,EAAG,GAAG,CAAC,eAAiC,IAAI,SAAS;YAClE,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"}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* (Linear, Jira, etc.) — not through the local PMO as a cache layer.
|
|
14
14
|
* The local PMO is just the default provider for users without integrations.
|
|
15
15
|
*/
|
|
16
|
-
import Database from 'better-sqlite3';
|
|
16
|
+
import type Database from 'better-sqlite3';
|
|
17
17
|
import type { StateCategory, ReviewGateMode } from '../pmo/types.js';
|
|
18
18
|
import type { ProviderStorage } from '../providers/types.js';
|
|
19
19
|
import { type CommitValidationResult } from '../execution/commit-validation.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import Database from 'better-sqlite3';
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
2
|
export declare const WORK_SOURCE_PROVIDERS: readonly ["pmo", "linear", "jira", "shortcut", "asana", "trello", "monday"];
|
|
3
3
|
export type WorkSourceProvider = typeof WORK_SOURCE_PROVIDERS[number];
|
|
4
4
|
export interface WorkSourceRef {
|
|
@@ -5,26 +5,13 @@ import { loadShortcutConfig } from '../shortcut/config.js';
|
|
|
5
5
|
import { loadTrelloConfig } from '../trello/config.js';
|
|
6
6
|
import { loadMondayConfig } from '../monday/config.js';
|
|
7
7
|
import { loadProviderSources } from './provider-sources.js';
|
|
8
|
-
|
|
8
|
+
import { SettingsStore } from '../database/settings-store.js';
|
|
9
9
|
const DEFAULT_SOURCE_KEY = 'work.default_source';
|
|
10
10
|
/** @deprecated Old key kept for migration — use DEFAULT_SOURCE_KEY */
|
|
11
11
|
const LEGACY_ACTIVE_SOURCE_KEY = 'work.active_source';
|
|
12
12
|
export const WORK_SOURCE_PROVIDERS = ['pmo', 'linear', 'jira', 'shortcut', 'asana', 'trello', 'monday'];
|
|
13
|
-
function
|
|
14
|
-
|
|
15
|
-
.prepare(`SELECT value FROM ${SETTINGS_TABLE} WHERE key = ?`)
|
|
16
|
-
.get(key);
|
|
17
|
-
return row?.value ?? null;
|
|
18
|
-
}
|
|
19
|
-
function setSetting(db, key, value) {
|
|
20
|
-
db.prepare(`
|
|
21
|
-
INSERT INTO ${SETTINGS_TABLE} (key, value)
|
|
22
|
-
VALUES (?, ?)
|
|
23
|
-
ON CONFLICT(key) DO UPDATE SET value = excluded.value
|
|
24
|
-
`).run(key, value);
|
|
25
|
-
}
|
|
26
|
-
function deleteSetting(db, key) {
|
|
27
|
-
db.prepare(`DELETE FROM ${SETTINGS_TABLE} WHERE key = ?`).run(key);
|
|
13
|
+
function settingsFor(db) {
|
|
14
|
+
return new SettingsStore(db);
|
|
28
15
|
}
|
|
29
16
|
export function isWorkSourceProvider(value) {
|
|
30
17
|
return WORK_SOURCE_PROVIDERS.includes(value);
|
|
@@ -55,24 +42,27 @@ export function formatWorkSourceRef(source) {
|
|
|
55
42
|
return source.context ? `${source.provider}:${source.context}` : source.provider;
|
|
56
43
|
}
|
|
57
44
|
export function saveDefaultWorkSource(db, source) {
|
|
58
|
-
|
|
45
|
+
const settings = settingsFor(db);
|
|
46
|
+
settings.set(DEFAULT_SOURCE_KEY, formatWorkSourceRef(source));
|
|
59
47
|
// Clean up legacy key if it exists
|
|
60
|
-
|
|
48
|
+
settings.delete(LEGACY_ACTIVE_SOURCE_KEY);
|
|
61
49
|
}
|
|
62
50
|
export function clearDefaultWorkSource(db) {
|
|
63
|
-
|
|
64
|
-
|
|
51
|
+
const settings = settingsFor(db);
|
|
52
|
+
settings.delete(DEFAULT_SOURCE_KEY);
|
|
53
|
+
settings.delete(LEGACY_ACTIVE_SOURCE_KEY);
|
|
65
54
|
}
|
|
66
55
|
export function loadDefaultWorkSource(db) {
|
|
56
|
+
const settings = settingsFor(db);
|
|
67
57
|
// Check new key first
|
|
68
|
-
let raw =
|
|
58
|
+
let raw = settings.get(DEFAULT_SOURCE_KEY);
|
|
69
59
|
// Fall back to legacy key and migrate
|
|
70
60
|
if (!raw) {
|
|
71
|
-
raw =
|
|
61
|
+
raw = settings.get(LEGACY_ACTIVE_SOURCE_KEY);
|
|
72
62
|
if (raw) {
|
|
73
63
|
// Migrate to new key
|
|
74
|
-
|
|
75
|
-
|
|
64
|
+
settings.set(DEFAULT_SOURCE_KEY, raw);
|
|
65
|
+
settings.delete(LEGACY_ACTIVE_SOURCE_KEY);
|
|
76
66
|
}
|
|
77
67
|
}
|
|
78
68
|
if (!raw)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/work-source/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/work-source/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* Stored as a JSON array in workspace_settings under the key
|
|
11
11
|
* `work.provider_sources`.
|
|
12
12
|
*/
|
|
13
|
-
import Database from 'better-sqlite3';
|
|
13
|
+
import type Database from 'better-sqlite3';
|
|
14
14
|
import type { WorkSourceProvider } from './config.js';
|
|
15
15
|
/**
|
|
16
16
|
* A single provider source entry in the multi-source configuration.
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* `work.provider_sources`.
|
|
12
12
|
*/
|
|
13
13
|
import { WORK_SOURCE_PROVIDERS, isWorkSourceProvider } from './config.js';
|
|
14
|
-
|
|
14
|
+
import { SettingsStore } from '../database/settings-store.js';
|
|
15
15
|
const PROVIDER_SOURCES_KEY = 'work.provider_sources';
|
|
16
16
|
export function validateProviderSourceEntry(entry) {
|
|
17
17
|
const errors = [];
|
|
@@ -47,28 +47,15 @@ export function validateProviderSourceEntry(entry) {
|
|
|
47
47
|
// =============================================================================
|
|
48
48
|
// Persistence
|
|
49
49
|
// =============================================================================
|
|
50
|
-
function
|
|
51
|
-
|
|
52
|
-
.prepare(`SELECT value FROM ${SETTINGS_TABLE} WHERE key = ?`)
|
|
53
|
-
.get(key);
|
|
54
|
-
return row?.value ?? null;
|
|
55
|
-
}
|
|
56
|
-
function setRawSetting(db, key, value) {
|
|
57
|
-
db.prepare(`
|
|
58
|
-
INSERT INTO ${SETTINGS_TABLE} (key, value)
|
|
59
|
-
VALUES (?, ?)
|
|
60
|
-
ON CONFLICT(key) DO UPDATE SET value = excluded.value
|
|
61
|
-
`).run(key, value);
|
|
62
|
-
}
|
|
63
|
-
function deleteRawSetting(db, key) {
|
|
64
|
-
db.prepare(`DELETE FROM ${SETTINGS_TABLE} WHERE key = ?`).run(key);
|
|
50
|
+
function settingsFor(db) {
|
|
51
|
+
return new SettingsStore(db);
|
|
65
52
|
}
|
|
66
53
|
/**
|
|
67
54
|
* Load all provider source entries from the database.
|
|
68
55
|
* Returns an empty array if none are configured.
|
|
69
56
|
*/
|
|
70
57
|
export function loadProviderSources(db) {
|
|
71
|
-
const raw =
|
|
58
|
+
const raw = settingsFor(db).get(PROVIDER_SOURCES_KEY);
|
|
72
59
|
if (!raw)
|
|
73
60
|
return [];
|
|
74
61
|
try {
|
|
@@ -88,11 +75,12 @@ export function loadProviderSources(db) {
|
|
|
88
75
|
* Save the full list of provider source entries to the database.
|
|
89
76
|
*/
|
|
90
77
|
export function saveProviderSources(db, sources) {
|
|
78
|
+
const settings = settingsFor(db);
|
|
91
79
|
if (sources.length === 0) {
|
|
92
|
-
|
|
80
|
+
settings.delete(PROVIDER_SOURCES_KEY);
|
|
93
81
|
return;
|
|
94
82
|
}
|
|
95
|
-
|
|
83
|
+
settings.set(PROVIDER_SOURCES_KEY, JSON.stringify(sources));
|
|
96
84
|
}
|
|
97
85
|
/**
|
|
98
86
|
* Add a new provider source entry. Returns validation errors if invalid,
|
|
@@ -257,7 +245,7 @@ export function resolveApiKey(db, entry) {
|
|
|
257
245
|
if (envValue)
|
|
258
246
|
return envValue;
|
|
259
247
|
// Try workspace_settings key
|
|
260
|
-
const dbValue =
|
|
248
|
+
const dbValue = settingsFor(db).get(entry.apiKeyRef);
|
|
261
249
|
if (dbValue)
|
|
262
250
|
return dbValue;
|
|
263
251
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-sources.js","sourceRoot":"","sources":["../../../src/lib/work-source/provider-sources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"provider-sources.js","sourceRoot":"","sources":["../../../src/lib/work-source/provider-sources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAE7D,MAAM,oBAAoB,GAAG,uBAAuB,CAAA;AAoDpD,MAAM,UAAU,2BAA2B,CACzC,KAAmC;IAEnC,MAAM,MAAM,GAAoC,EAAE,CAAA;IAElD,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAA;IACzD,CAAC;SAAM,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,6FAA6F;SACvG,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAA;IACrE,CAAC;SAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,4BAA4B,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACxE,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAA;IACvE,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAA;IAC/E,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAA;IACjE,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF,SAAS,WAAW,CAAC,EAAqB;IACxC,OAAO,IAAI,aAAa,CAAC,EAAE,CAAC,CAAA;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAqB;IACvD,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;IACrD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAA;IAEnB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAA;QACrC,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,KAAc,EAAE,EAAE,CACjB,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,KAAK,IAAI;YACd,OAAQ,KAA6B,CAAC,EAAE,KAAK,QAAQ;YACrD,OAAQ,KAA6B,CAAC,QAAQ,KAAK,QAAQ,CACrC,CAAA;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAqB,EAAE,OAA8B;IACvF,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;IAChC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,QAAQ,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAA;QACrC,OAAM;IACR,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,EAAqB,EACrB,KAA0B;IAE1B,MAAM,MAAM,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAA;IACjD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAA;IAEpC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAA;IAExC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,8BAA8B,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAA;IAC7F,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QAChF,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,kCAAkC,KAAK,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAA;IACzG,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;IACjC,OAAO,EAAE,CAAA;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,EAAqB,EACrB,EAAU,EACV,OAAiD;IAEjD,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAA;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;IAEnD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,qCAAqC,EAAE,GAAG,EAAE,CAAC,CAAA;IAC/E,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,CAAA;IAChD,MAAM,MAAM,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAA;IAClD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAA;IAEpC,gDAAgD;IAChD,IACE,OAAO,CAAC,MAAM;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,MAAO,CAAC,WAAW,EAAE,CAAC,EAC/F,CAAC;QACD,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,kCAAkC,OAAO,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAA;IAC3G,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAA;IACvB,mBAAmB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAChC,OAAO,EAAE,CAAA;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAqB,EAAE,EAAU;IACpE,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;IAEnD,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAEpD,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;IACjC,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,EAAqB,EACrB,EAAU;IAEV,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAA;IACvC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAA;AACjD,CAAC;AAED,gFAAgF;AAChF,uBAAuB;AACvB,gFAAgF;AAEhF;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CACrC,EAAqB,EACrB,SAAiB;IAEjB,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAA;IACvC,OAAO,+BAA+B,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,+BAA+B,CAC7C,OAA8B,EAC9B,SAAiB;IAEjB,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,CAAA;IACxC,IAAI,SAAS,GAA+B,IAAI,CAAA;IAChD,IAAI,UAAU,GAAG,CAAC,CAAA;IAElB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;QAC/C,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;YACxE,SAAS,GAAG,MAAM,CAAA;YAClB,UAAU,GAAG,WAAW,CAAC,MAAM,CAAA;QACjC,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAqB;IAErB,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAA;IACvC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE;QACtB,EAAE,EAAE,CAAC,CAAC,EAAE;KACT,CAAC,CAAC,CAAA;AACL,CAAC;AAED,gFAAgF;AAChF,gCAAgC;AAChC,gFAAgF;AAEhF;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,EAAqB,EACrB,KAA0B;IAE1B,MAAM,MAAM,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAA;IACjD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAA;IAEpC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAA;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAA;IAE1D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,gDAAgD;QAChD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAClG,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,kCAAkC,KAAK,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAA;QACzG,CAAC;QACD,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;QACvB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;QACjC,OAAO,EAAE,CAAA;IACX,CAAC;IAED,kEAAkE;IAClE,OAAO,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,+BAA+B,CAC7C,EAAqB,EACrB,QAA4B;IAE5B,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAA;IAC/D,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA;IACrD,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;IACjC,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,EAAqB,EACrB,KAA0B;IAE1B,iCAAiC;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAC7C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAE7B,6BAA6B;IAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACpD,IAAI,OAAO;QAAE,OAAO,OAAO,CAAA;IAE3B,OAAO,IAAI,CAAA;AACb,CAAC"}
|