@studio-foundation/api 0.13.0 → 0.14.0
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/README.md +5 -5
- package/dist/bootstrap.d.ts +4 -5
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +16 -18
- package/dist/bootstrap.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +4 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +3 -3
- package/dist/server.js.map +1 -1
- package/dist/trigger-runtime.d.ts +27 -0
- package/dist/trigger-runtime.d.ts.map +1 -0
- package/dist/trigger-runtime.js +204 -0
- package/dist/trigger-runtime.js.map +1 -0
- package/dist/trigger-store.d.ts +20 -0
- package/dist/trigger-store.d.ts.map +1 -0
- package/dist/trigger-store.js +53 -0
- package/dist/trigger-store.js.map +1 -0
- package/dist/triggers/trigger-loader.d.ts +7 -0
- package/dist/triggers/trigger-loader.d.ts.map +1 -0
- package/dist/triggers/trigger-loader.js +38 -0
- package/dist/triggers/trigger-loader.js.map +1 -0
- package/dist/triggers/webhook.d.ts +10 -0
- package/dist/triggers/webhook.d.ts.map +1 -0
- package/dist/triggers/webhook.js +42 -0
- package/dist/triggers/webhook.js.map +1 -0
- package/dist/user-store.js +1 -1
- package/dist/user-store.js.map +1 -1
- package/dist/utils/repo-resolver.d.ts +9 -2
- package/dist/utils/repo-resolver.d.ts.map +1 -1
- package/dist/utils/repo-resolver.js +42 -2
- package/dist/utils/repo-resolver.js.map +1 -1
- package/package.json +8 -4
- package/dist/integration-runtime.d.ts +0 -22
- package/dist/integration-runtime.d.ts.map +0 -1
- package/dist/integration-runtime.js +0 -150
- package/dist/integration-runtime.js.map +0 -1
- package/dist/integration-store.d.ts +0 -26
- package/dist/integration-store.d.ts.map +0 -1
- package/dist/integration-store.js +0 -78
- package/dist/integration-store.js.map +0 -1
- package/dist/integrations/linear/failure-handler.d.ts +0 -5
- package/dist/integrations/linear/failure-handler.d.ts.map +0 -1
- package/dist/integrations/linear/failure-handler.js +0 -73
- package/dist/integrations/linear/failure-handler.js.map +0 -1
- package/dist/integrations/linear/webhook-handler.d.ts +0 -6
- package/dist/integrations/linear/webhook-handler.d.ts.map +0 -1
- package/dist/integrations/linear/webhook-handler.js +0 -131
- package/dist/integrations/linear/webhook-handler.js.map +0 -1
- package/dist/integrations/registry.d.ts +0 -4
- package/dist/integrations/registry.d.ts.map +0 -1
- package/dist/integrations/registry.js +0 -9
- package/dist/integrations/registry.js.map +0 -1
- package/dist/integrations/types.d.ts +0 -33
- package/dist/integrations/types.d.ts.map +0 -1
- package/dist/integrations/types.js +0 -2
- package/dist/integrations/types.js.map +0 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// TriggerStore — SQLite log of inbound webhook deliveries that launched a run.
|
|
2
|
+
// Partitioned by trigger_name. Uses the same DB file as the run store
|
|
3
|
+
// (.studio/runs/runs.db).
|
|
4
|
+
import { openDatabase } from '@studio-foundation/engine';
|
|
5
|
+
export class TriggerStore {
|
|
6
|
+
db;
|
|
7
|
+
constructor(dbPath) {
|
|
8
|
+
this.db = openDatabase(dbPath);
|
|
9
|
+
this.db.exec('PRAGMA journal_mode = WAL');
|
|
10
|
+
this.initSchema();
|
|
11
|
+
}
|
|
12
|
+
initSchema() {
|
|
13
|
+
this.db.exec(`
|
|
14
|
+
CREATE TABLE IF NOT EXISTS trigger_log (
|
|
15
|
+
id TEXT PRIMARY KEY,
|
|
16
|
+
trigger_name TEXT NOT NULL,
|
|
17
|
+
received_at TEXT NOT NULL,
|
|
18
|
+
external_id TEXT,
|
|
19
|
+
external_label TEXT,
|
|
20
|
+
external_url TEXT,
|
|
21
|
+
pipeline TEXT NOT NULL,
|
|
22
|
+
run_id TEXT,
|
|
23
|
+
status TEXT NOT NULL
|
|
24
|
+
);
|
|
25
|
+
`);
|
|
26
|
+
}
|
|
27
|
+
insert(record) {
|
|
28
|
+
this.db.prepare(`
|
|
29
|
+
INSERT INTO trigger_log
|
|
30
|
+
(id, trigger_name, received_at, external_id, external_label, external_url, pipeline, run_id, status)
|
|
31
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
32
|
+
`).run(record.id, record.trigger_name, record.received_at, record.external_id ?? null, record.external_label ?? null, record.external_url ?? null, record.pipeline, record.run_id ?? null, record.status);
|
|
33
|
+
}
|
|
34
|
+
list(triggerName, limit = 50) {
|
|
35
|
+
const rows = this.db.prepare(`SELECT id, trigger_name, received_at, external_id, external_label, external_url, pipeline, run_id, status
|
|
36
|
+
FROM trigger_log WHERE trigger_name = ? ORDER BY received_at DESC LIMIT ?`).all(triggerName, limit);
|
|
37
|
+
return rows.map(row => ({
|
|
38
|
+
id: row.id,
|
|
39
|
+
trigger_name: row.trigger_name,
|
|
40
|
+
received_at: row.received_at,
|
|
41
|
+
...(row.external_id != null ? { external_id: row.external_id } : {}),
|
|
42
|
+
...(row.external_label != null ? { external_label: row.external_label } : {}),
|
|
43
|
+
...(row.external_url != null ? { external_url: row.external_url } : {}),
|
|
44
|
+
pipeline: row.pipeline,
|
|
45
|
+
...(row.run_id != null ? { run_id: row.run_id } : {}),
|
|
46
|
+
status: row.status,
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
close() {
|
|
50
|
+
this.db.close();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=trigger-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-store.js","sourceRoot":"","sources":["../src/trigger-store.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,sEAAsE;AACtE,0BAA0B;AAE1B,OAAO,EAAE,YAAY,EAAqB,MAAM,2BAA2B,CAAC;AAc5E,MAAM,OAAO,YAAY;IACf,EAAE,CAAe;IAEzB,YAAY,MAAc;QACxB,IAAI,CAAC,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;KAYZ,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,MAAqB;QAC1B,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAIf,CAAC,CAAC,GAAG,CACJ,MAAM,CAAC,EAAE,EACT,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,WAAW,IAAI,IAAI,EAC1B,MAAM,CAAC,cAAc,IAAI,IAAI,EAC7B,MAAM,CAAC,YAAY,IAAI,IAAI,EAC3B,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,MAAM,IAAI,IAAI,EACrB,MAAM,CAAC,MAAM,CACd,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,WAAmB,EAAE,KAAK,GAAG,EAAE;QAMlC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B;iFAC2E,CAC5E,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAU,CAAC;QAEnC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtB,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,GAAG,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,MAAM,EAAE,GAAG,CAAC,MAA8B;SAC3C,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TriggerDef } from '@studio-foundation/contracts';
|
|
2
|
+
/**
|
|
3
|
+
* Load all `.trigger.yaml` files from a project's triggers directory.
|
|
4
|
+
* Returns an empty array if the directory does not exist.
|
|
5
|
+
*/
|
|
6
|
+
export declare function loadProjectTriggers(triggersDir: string): Promise<TriggerDef[]>;
|
|
7
|
+
//# sourceMappingURL=trigger-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-loader.d.ts","sourceRoot":"","sources":["../../src/triggers/trigger-loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE/D;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAyBpF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
import yaml from 'js-yaml';
|
|
5
|
+
import { resolveEnvVars } from '@studio-foundation/engine';
|
|
6
|
+
/**
|
|
7
|
+
* Load all `.trigger.yaml` files from a project's triggers directory.
|
|
8
|
+
* Returns an empty array if the directory does not exist.
|
|
9
|
+
*/
|
|
10
|
+
export async function loadProjectTriggers(triggersDir) {
|
|
11
|
+
if (!existsSync(triggersDir))
|
|
12
|
+
return [];
|
|
13
|
+
let files;
|
|
14
|
+
try {
|
|
15
|
+
files = (await readdir(triggersDir)).filter(f => f.endsWith('.trigger.yaml'));
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
const triggers = [];
|
|
21
|
+
for (const file of files.sort()) {
|
|
22
|
+
const content = await readFile(resolve(triggersDir, file), 'utf-8');
|
|
23
|
+
const def = yaml.load(resolveEnvVars(content));
|
|
24
|
+
if (!def?.name)
|
|
25
|
+
throw new Error(`Trigger '${file}' is missing 'name'`);
|
|
26
|
+
if (!def.pipeline)
|
|
27
|
+
throw new Error(`Trigger '${def.name}' is missing 'pipeline'`);
|
|
28
|
+
// An unset ${VAR} resolves to nothing, which YAML reads as null. Refusing here
|
|
29
|
+
// is the point: a trigger that declares hmac and silently stops verifying
|
|
30
|
+
// accepts unsigned deliveries from anyone who knows the URL.
|
|
31
|
+
if (def.webhook?.hmac && !def.webhook.hmac.secret) {
|
|
32
|
+
throw new Error(`Trigger '${def.name}' declares webhook.hmac but its secret resolved to nothing`);
|
|
33
|
+
}
|
|
34
|
+
triggers.push(def);
|
|
35
|
+
}
|
|
36
|
+
return triggers;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=trigger-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-loader.js","sourceRoot":"","sources":["../../src/triggers/trigger-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IAC3D,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAA2B,CAAC;QACzE,IAAI,CAAC,GAAG,EAAE,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,qBAAqB,CAAC,CAAC;QACvE,IAAI,CAAC,GAAG,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,IAAI,yBAAyB,CAAC,CAAC;QAClF,+EAA+E;QAC/E,0EAA0E;QAC1E,6DAA6D;QAC7D,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,IAAI,4DAA4D,CAAC,CAAC;QACpG,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TriggerDef } from '@studio-foundation/contracts';
|
|
2
|
+
export declare function verifyHmac(rawBody: Buffer, signature: string, secret: string): boolean;
|
|
3
|
+
/**
|
|
4
|
+
* Every `when:` condition must hold. No conditions means every delivery matches —
|
|
5
|
+
* the trigger file's existence is the opt-in.
|
|
6
|
+
*/
|
|
7
|
+
export declare function matchesPayload(trigger: TriggerDef, payload: unknown): boolean;
|
|
8
|
+
/** Resolve a `{{payload.<path>}}` template map against the delivered payload. */
|
|
9
|
+
export declare function renderTemplate(template: Record<string, unknown> | undefined, payload: unknown): Record<string, unknown>;
|
|
10
|
+
//# sourceMappingURL=webhook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/triggers/webhook.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAO/D,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAUtF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAI7E;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC7C,OAAO,EAAE,OAAO,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQzB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Payload-level decisions for an inbound webhook: is it authentic, does it match,
|
|
2
|
+
// and what do the trigger's templates resolve to. All pure — the runtime owns I/O.
|
|
3
|
+
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
4
|
+
import { evaluateCondition, interpolateTemplate, resolveContextPath } from '@studio-foundation/engine';
|
|
5
|
+
/** `payload.<path>` reads the request body; nothing else is in scope. */
|
|
6
|
+
function payloadScope(payload) {
|
|
7
|
+
return { input: {}, stageOutputs: new Map(), roots: { payload } };
|
|
8
|
+
}
|
|
9
|
+
export function verifyHmac(rawBody, signature, secret) {
|
|
10
|
+
const computed = createHmac('sha256', secret).update(rawBody).digest('hex');
|
|
11
|
+
try {
|
|
12
|
+
const a = Buffer.from(computed, 'hex');
|
|
13
|
+
const b = Buffer.from(signature, 'hex');
|
|
14
|
+
if (a.length !== b.length)
|
|
15
|
+
return false;
|
|
16
|
+
return timingSafeEqual(a, b);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Every `when:` condition must hold. No conditions means every delivery matches —
|
|
24
|
+
* the trigger file's existence is the opt-in.
|
|
25
|
+
*/
|
|
26
|
+
export function matchesPayload(trigger, payload) {
|
|
27
|
+
const conditions = trigger.webhook?.when ?? [];
|
|
28
|
+
const scope = payloadScope(payload);
|
|
29
|
+
return conditions.every(condition => evaluateCondition(condition, scope));
|
|
30
|
+
}
|
|
31
|
+
/** Resolve a `{{payload.<path>}}` template map against the delivered payload. */
|
|
32
|
+
export function renderTemplate(template, payload) {
|
|
33
|
+
if (!template)
|
|
34
|
+
return {};
|
|
35
|
+
const scope = payloadScope(payload);
|
|
36
|
+
const result = {};
|
|
37
|
+
for (const [key, value] of Object.entries(template)) {
|
|
38
|
+
result[key] = interpolateTemplate(value, ref => resolveContextPath(ref, scope));
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/triggers/webhook.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,mFAAmF;AAEnF,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAIvG,yEAAyE;AACzE,SAAS,YAAY,CAAC,OAAgB;IACpC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,SAAiB,EAAE,MAAc;IAC3E,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5E,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACxC,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAmB,EAAE,OAAgB;IAClE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;IAC/C,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAC5B,QAA6C,EAC7C,OAAgB;IAEhB,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/user-store.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// api/src/user-store.ts
|
|
2
2
|
// UserStore — SQLite persistence for users and daily usage
|
|
3
|
-
// Follows same pattern as WebhookStore and
|
|
3
|
+
// Follows same pattern as WebhookStore and TriggerStore
|
|
4
4
|
// Uses the same DB file as the run store (.studio/runs/runs.db)
|
|
5
5
|
import { openDatabase } from '@studio-foundation/engine';
|
|
6
6
|
export class UserStore {
|
package/dist/user-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-store.js","sourceRoot":"","sources":["../src/user-store.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,2DAA2D;AAC3D,
|
|
1
|
+
{"version":3,"file":"user-store.js","sourceRoot":"","sources":["../src/user-store.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,2DAA2D;AAC3D,wDAAwD;AACxD,gEAAgE;AAEhE,OAAO,EAAE,YAAY,EAAqB,MAAM,2BAA2B,CAAC;AAiB5E,MAAM,OAAO,SAAS;IACZ,EAAE,CAAe;IAEzB,YAAY,MAAc;QACxB,IAAI,CAAC,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;KAgBZ,CAAC,CAAC;IACL,CAAC;IAED,eAAe,CAAC,MAAc;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,0EAA0E,CAAC;aACnF,GAAG,CAAC,MAAM,CAAqB,CAAC;QACnC,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAED,WAAW,CAAC,EAAU;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,qEAAqE,CAAC;aAC9E,GAAG,CAAC,EAAE,CAAqB,CAAC;QAC/B,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAED,cAAc,CAAC,KAAa;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,wEAAwE,CAAC;aACjF,GAAG,CAAC,KAAK,CAAqB,CAAC;QAClC,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CAAC,gFAAgF,CAAC;aACzF,GAAG,EAAuB,CAAC;IAChC,CAAC;IAED,QAAQ,CAAC,IAAU;QACjB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;KAQf,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACxE,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,aAAa,CAAC,MAAc,EAAE,IAAY;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,yFAAyF,CAAC;aAClG,GAAG,CAAC,MAAM,EAAE,IAAI,CAA2B,CAAC;QAC/C,OAAO,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IACzE,CAAC;IAED,aAAa,CAAC,MAAc,EAAE,IAAY;QACxC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAKf,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,eAAe,CAAC,MAAc,EAAE,IAAY,EAAE,MAAc;QAC1D,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAKf,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
1
|
+
export interface RepoResolveOptions {
|
|
2
|
+
repoPathOverride?: string;
|
|
3
|
+
repoUrl?: string;
|
|
4
|
+
rawProjectsDir?: string;
|
|
5
|
+
pipelineName: string;
|
|
6
|
+
branch?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function cloneRepo(repoUrl: string, projectsDir: string, pipelineName: string, branch?: string): Promise<string>;
|
|
9
|
+
export declare function resolveRepoPath(options: RepoResolveOptions): Promise<string>;
|
|
3
10
|
//# sourceMappingURL=repo-resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/repo-resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"repo-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/repo-resolver.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBlF"}
|
|
@@ -1,3 +1,43 @@
|
|
|
1
|
-
//
|
|
2
|
-
|
|
1
|
+
// Not in the engine: cloning is a version-control choice, and INV-04 keeps the
|
|
2
|
+
// engine free of those. The CLI imports this through the
|
|
3
|
+
// `@studio-foundation/api/repo-resolver` subpath, so `studio run` does not load
|
|
4
|
+
// the HTTP server.
|
|
5
|
+
import { execSync } from 'node:child_process';
|
|
6
|
+
import { mkdir } from 'node:fs/promises';
|
|
7
|
+
import { resolve, join } from 'node:path';
|
|
8
|
+
import { homedir } from 'node:os';
|
|
9
|
+
export async function cloneRepo(repoUrl, projectsDir, pipelineName, branch) {
|
|
10
|
+
await mkdir(projectsDir, { recursive: true });
|
|
11
|
+
const timestamp = new Date().toISOString()
|
|
12
|
+
.replace(/:/g, 'h')
|
|
13
|
+
.replace(/\..+$/, '')
|
|
14
|
+
.replace('T', 'T');
|
|
15
|
+
const dirName = `${pipelineName}-${timestamp}`;
|
|
16
|
+
const clonePath = join(projectsDir, dirName);
|
|
17
|
+
const branchArg = branch ? `--branch ${branch}` : '';
|
|
18
|
+
const cmd = `git clone --depth 1 ${branchArg} ${repoUrl} ${clonePath}`;
|
|
19
|
+
try {
|
|
20
|
+
execSync(cmd, { stdio: 'pipe' });
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
24
|
+
throw new Error(`Failed to clone ${repoUrl}: ${msg}`, { cause: error });
|
|
25
|
+
}
|
|
26
|
+
return clonePath;
|
|
27
|
+
}
|
|
28
|
+
export async function resolveRepoPath(options) {
|
|
29
|
+
const { repoPathOverride, repoUrl, rawProjectsDir, pipelineName, branch } = options;
|
|
30
|
+
if (repoPathOverride) {
|
|
31
|
+
return resolve(repoPathOverride);
|
|
32
|
+
}
|
|
33
|
+
if (repoUrl) {
|
|
34
|
+
const rawDir = rawProjectsDir || process.env['STUDIO_PROJECTS_DIR'];
|
|
35
|
+
const projectsDir = rawDir?.replace(/^~/, homedir());
|
|
36
|
+
if (!projectsDir) {
|
|
37
|
+
throw new Error('STUDIO_PROJECTS_DIR is not set. Set it in config.yaml paths.projects_dir or as an environment variable.');
|
|
38
|
+
}
|
|
39
|
+
return cloneRepo(repoUrl, projectsDir, pipelineName, branch);
|
|
40
|
+
}
|
|
41
|
+
return '.';
|
|
42
|
+
}
|
|
3
43
|
//# sourceMappingURL=repo-resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-resolver.js","sourceRoot":"","sources":["../../src/utils/repo-resolver.ts"],"names":[],"mappings":"AAAA,+
|
|
1
|
+
{"version":3,"file":"repo-resolver.js","sourceRoot":"","sources":["../../src/utils/repo-resolver.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,yDAAyD;AACzD,gFAAgF;AAChF,mBAAmB;AAEnB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAUlC,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAe,EACf,WAAmB,EACnB,YAAoB,EACpB,MAAe;IAEf,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACrB,MAAM,OAAO,GAAG,GAAG,YAAY,IAAI,SAAS,EAAE,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAE7C,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,MAAM,GAAG,GAAG,uBAAuB,SAAS,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;IAEvE,IAAI,CAAC;QACH,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,KAAK,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA2B;IAC/D,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEpF,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,yGAAyG,CAC1G,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@studio-foundation/api",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "HTTP REST API server for Studio agent pipelines",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/api.js",
|
|
@@ -16,6 +16,10 @@
|
|
|
16
16
|
"./user-store": {
|
|
17
17
|
"import": "./dist/user-store.js",
|
|
18
18
|
"types": "./dist/user-store.d.ts"
|
|
19
|
+
},
|
|
20
|
+
"./repo-resolver": {
|
|
21
|
+
"import": "./dist/utils/repo-resolver.js",
|
|
22
|
+
"types": "./dist/utils/repo-resolver.d.ts"
|
|
19
23
|
}
|
|
20
24
|
},
|
|
21
25
|
"bin": {
|
|
@@ -41,9 +45,9 @@
|
|
|
41
45
|
"fastify": "^5.3.2",
|
|
42
46
|
"js-yaml": "^4.1.1",
|
|
43
47
|
"pg": "^8.19.0",
|
|
44
|
-
"@studio-foundation/
|
|
45
|
-
"@studio-foundation/
|
|
46
|
-
"@studio-foundation/runner": "0.
|
|
48
|
+
"@studio-foundation/contracts": "0.14.0",
|
|
49
|
+
"@studio-foundation/engine": "0.14.0",
|
|
50
|
+
"@studio-foundation/runner": "0.14.0"
|
|
47
51
|
},
|
|
48
52
|
"devDependencies": {
|
|
49
53
|
"@types/js-yaml": "^4.0.9",
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { FastifyInstance } from 'fastify';
|
|
2
|
-
import type { IntegrationPluginDef } from '@studio-foundation/contracts';
|
|
3
|
-
import type { IntegrationStore } from './integration-store.js';
|
|
4
|
-
import type { RunLauncher } from './launcher.js';
|
|
5
|
-
import type { RunEventBus } from './event-bus.js';
|
|
6
|
-
import type { ApiConfig } from './server.js';
|
|
7
|
-
export interface IntegrationRuntimeDeps {
|
|
8
|
-
integrations: IntegrationPluginDef[];
|
|
9
|
-
store: IntegrationStore;
|
|
10
|
-
launcher: RunLauncher;
|
|
11
|
-
configsDir: string;
|
|
12
|
-
projectsDir?: string;
|
|
13
|
-
apiConfig: ApiConfig;
|
|
14
|
-
integrationConfigs: Record<string, Record<string, unknown>>;
|
|
15
|
-
}
|
|
16
|
-
export declare class IntegrationRuntime {
|
|
17
|
-
private deps;
|
|
18
|
-
constructor(deps: IntegrationRuntimeDeps);
|
|
19
|
-
setupEventBus(bus: RunEventBus): void;
|
|
20
|
-
registerRoutes(fastify: FastifyInstance, prefix: string): void;
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=integration-runtime.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integration-runtime.d.ts","sourceRoot":"","sources":["../src/integration-runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC7D;AAED,qBAAa,kBAAkB;IACjB,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,sBAAsB;IAEhD,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAiCrC,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CA0H/D"}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import { WEBHOOK_HANDLERS, FAILURE_HANDLERS } from './integrations/registry.js';
|
|
2
|
-
export class IntegrationRuntime {
|
|
3
|
-
deps;
|
|
4
|
-
constructor(deps) {
|
|
5
|
-
this.deps = deps;
|
|
6
|
-
}
|
|
7
|
-
setupEventBus(bus) {
|
|
8
|
-
bus.subscribeAll((runId, event) => {
|
|
9
|
-
if (event.type !== 'pipeline_complete')
|
|
10
|
-
return;
|
|
11
|
-
const data = event.data;
|
|
12
|
-
if (data.status === 'success')
|
|
13
|
-
return;
|
|
14
|
-
for (const integration of this.deps.integrations) {
|
|
15
|
-
if (!integration.on_failure?.handler)
|
|
16
|
-
continue;
|
|
17
|
-
const handler = FAILURE_HANDLERS[integration.on_failure.handler];
|
|
18
|
-
if (!handler)
|
|
19
|
-
continue;
|
|
20
|
-
const ctx = {
|
|
21
|
-
runId,
|
|
22
|
-
durationMs: data.duration_ms,
|
|
23
|
-
status: data.status,
|
|
24
|
-
meta: data.meta ?? {},
|
|
25
|
-
lastGroupFeedback: data.last_group_feedback,
|
|
26
|
-
integration,
|
|
27
|
-
integrationConfig: this.deps.integrationConfigs[integration.name] ?? {},
|
|
28
|
-
};
|
|
29
|
-
void handler.handleFailure(ctx);
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
registerRoutes(fastify, prefix) {
|
|
34
|
-
for (const integration of this.deps.integrations) {
|
|
35
|
-
if (!integration.webhook?.handler)
|
|
36
|
-
continue;
|
|
37
|
-
const webhookHandler = WEBHOOK_HANDLERS[integration.webhook.handler];
|
|
38
|
-
if (!webhookHandler)
|
|
39
|
-
continue;
|
|
40
|
-
const name = integration.name;
|
|
41
|
-
const { store, launcher, configsDir, projectsDir, apiConfig, integrationConfigs } = this.deps;
|
|
42
|
-
const integrationConfig = integrationConfigs[name] ?? {};
|
|
43
|
-
const errorSchema = { type: 'object', properties: { error: { type: 'string' } } };
|
|
44
|
-
void fastify.register(async (scope) => {
|
|
45
|
-
scope.addContentTypeParser('application/json', { parseAs: 'buffer' }, (_req, body, done) => done(null, body));
|
|
46
|
-
// GET /api/integrations/{name}
|
|
47
|
-
scope.get(`${prefix}/integrations/${name}`, {
|
|
48
|
-
schema: {
|
|
49
|
-
tags: ['integrations'],
|
|
50
|
-
summary: `Get ${name} integration config and trigger log`,
|
|
51
|
-
response: {
|
|
52
|
-
200: {
|
|
53
|
-
type: 'object',
|
|
54
|
-
properties: {
|
|
55
|
-
webhook_url: { type: 'string' },
|
|
56
|
-
pipeline: { type: ['string', 'null'] },
|
|
57
|
-
active: { type: 'boolean' },
|
|
58
|
-
triggers: { type: 'array' },
|
|
59
|
-
},
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
},
|
|
63
|
-
}, async (request, reply) => {
|
|
64
|
-
const config = store.getConfig(name);
|
|
65
|
-
const triggers = store.listTriggers(name, 50);
|
|
66
|
-
const baseUrl = process.env['STUDIO_BASE_URL'] ?? `${request.protocol}://${request.hostname}`;
|
|
67
|
-
return reply.status(200).send({
|
|
68
|
-
webhook_url: `${baseUrl}/api/integrations/${name}/webhook`,
|
|
69
|
-
pipeline: config.pipeline ?? null,
|
|
70
|
-
active: config.active,
|
|
71
|
-
triggers,
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
// PATCH /api/integrations/{name}
|
|
75
|
-
scope.patch(`${prefix}/integrations/${name}`, {
|
|
76
|
-
schema: {
|
|
77
|
-
tags: ['integrations'],
|
|
78
|
-
summary: `Update ${name} integration config`,
|
|
79
|
-
body: {
|
|
80
|
-
type: 'object',
|
|
81
|
-
properties: {
|
|
82
|
-
pipeline: { type: 'string' },
|
|
83
|
-
active: { type: 'boolean' },
|
|
84
|
-
},
|
|
85
|
-
},
|
|
86
|
-
response: {
|
|
87
|
-
200: {
|
|
88
|
-
type: 'object',
|
|
89
|
-
properties: {
|
|
90
|
-
webhook_url: { type: 'string' },
|
|
91
|
-
pipeline: { type: ['string', 'null'] },
|
|
92
|
-
active: { type: 'boolean' },
|
|
93
|
-
},
|
|
94
|
-
},
|
|
95
|
-
400: errorSchema,
|
|
96
|
-
},
|
|
97
|
-
},
|
|
98
|
-
}, async (request, reply) => {
|
|
99
|
-
let data;
|
|
100
|
-
try {
|
|
101
|
-
data = JSON.parse(request.body.toString('utf-8'));
|
|
102
|
-
}
|
|
103
|
-
catch {
|
|
104
|
-
return reply.status(400).send({ error: 'Invalid JSON' });
|
|
105
|
-
}
|
|
106
|
-
store.patchConfig(name, data);
|
|
107
|
-
const updated = store.getConfig(name);
|
|
108
|
-
const baseUrl = process.env['STUDIO_BASE_URL'] ?? `${request.protocol}://${request.hostname}`;
|
|
109
|
-
return reply.status(200).send({
|
|
110
|
-
webhook_url: `${baseUrl}/api/integrations/${name}/webhook`,
|
|
111
|
-
pipeline: updated.pipeline ?? null,
|
|
112
|
-
active: updated.active,
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
// POST /api/integrations/{name}/webhook
|
|
116
|
-
scope.post(`${prefix}/integrations/${name}/webhook`, {
|
|
117
|
-
schema: {
|
|
118
|
-
tags: ['integrations'],
|
|
119
|
-
summary: `Receive ${name} webhook event`,
|
|
120
|
-
response: {
|
|
121
|
-
202: {
|
|
122
|
-
type: 'object',
|
|
123
|
-
properties: { run_id: { type: 'string' }, stream_url: { type: 'string' } },
|
|
124
|
-
},
|
|
125
|
-
200: {
|
|
126
|
-
type: 'object',
|
|
127
|
-
properties: { ignored: { type: 'boolean' }, reason: { type: 'string' } },
|
|
128
|
-
},
|
|
129
|
-
400: errorSchema,
|
|
130
|
-
401: errorSchema,
|
|
131
|
-
},
|
|
132
|
-
},
|
|
133
|
-
}, async (request, reply) => {
|
|
134
|
-
return webhookHandler.handle({
|
|
135
|
-
rawBody: request.body,
|
|
136
|
-
headers: request.headers,
|
|
137
|
-
integration,
|
|
138
|
-
store,
|
|
139
|
-
launcher,
|
|
140
|
-
configsDir,
|
|
141
|
-
projectsDir,
|
|
142
|
-
apiConfig,
|
|
143
|
-
integrationConfig,
|
|
144
|
-
}, reply);
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
//# sourceMappingURL=integration-runtime.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integration-runtime.js","sourceRoot":"","sources":["../src/integration-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export interface IntegrationConfig {
|
|
2
|
-
pipeline?: string;
|
|
3
|
-
active: boolean;
|
|
4
|
-
}
|
|
5
|
-
export interface IntegrationTriggerRecord {
|
|
6
|
-
id: string;
|
|
7
|
-
integration_name: string;
|
|
8
|
-
received_at: string;
|
|
9
|
-
external_id?: string;
|
|
10
|
-
external_label?: string;
|
|
11
|
-
external_url?: string;
|
|
12
|
-
pipeline: string;
|
|
13
|
-
run_id?: string;
|
|
14
|
-
status: 'success' | 'failed';
|
|
15
|
-
}
|
|
16
|
-
export declare class IntegrationStore {
|
|
17
|
-
private db;
|
|
18
|
-
constructor(dbPath: string);
|
|
19
|
-
private initSchema;
|
|
20
|
-
getConfig(integrationName: string): IntegrationConfig;
|
|
21
|
-
patchConfig(integrationName: string, data: Partial<IntegrationConfig>): void;
|
|
22
|
-
insertTrigger(trigger: IntegrationTriggerRecord): void;
|
|
23
|
-
listTriggers(integrationName: string, limit?: number): IntegrationTriggerRecord[];
|
|
24
|
-
close(): void;
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=integration-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integration-store.d.ts","sourceRoot":"","sources":["../src/integration-store.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;CAC9B;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAAe;gBAEb,MAAM,EAAE,MAAM;IAM1B,OAAO,CAAC,UAAU;IAuBlB,SAAS,CAAC,eAAe,EAAE,MAAM,GAAG,iBAAiB;IAYrD,WAAW,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAU5E,aAAa,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAkBtD,YAAY,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,wBAAwB,EAAE;IAwB7E,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
// IntegrationStore — generic SQLite persistence for integration configs and trigger logs
|
|
2
|
-
// Partitioned by integration_name — supports any integration (linear, slack, github, etc.)
|
|
3
|
-
// Uses the same DB file as the run store (.studio/runs/runs.db)
|
|
4
|
-
import { openDatabase } from '@studio-foundation/engine';
|
|
5
|
-
export class IntegrationStore {
|
|
6
|
-
db;
|
|
7
|
-
constructor(dbPath) {
|
|
8
|
-
this.db = openDatabase(dbPath);
|
|
9
|
-
this.db.exec('PRAGMA journal_mode = WAL');
|
|
10
|
-
this.initSchema();
|
|
11
|
-
}
|
|
12
|
-
initSchema() {
|
|
13
|
-
this.db.exec(`
|
|
14
|
-
CREATE TABLE IF NOT EXISTS integration_config (
|
|
15
|
-
integration_name TEXT NOT NULL,
|
|
16
|
-
pipeline TEXT,
|
|
17
|
-
active INTEGER NOT NULL DEFAULT 0,
|
|
18
|
-
PRIMARY KEY (integration_name)
|
|
19
|
-
);
|
|
20
|
-
|
|
21
|
-
CREATE TABLE IF NOT EXISTS integration_triggers (
|
|
22
|
-
id TEXT PRIMARY KEY,
|
|
23
|
-
integration_name TEXT NOT NULL,
|
|
24
|
-
received_at TEXT NOT NULL,
|
|
25
|
-
external_id TEXT,
|
|
26
|
-
external_label TEXT,
|
|
27
|
-
external_url TEXT,
|
|
28
|
-
pipeline TEXT NOT NULL,
|
|
29
|
-
run_id TEXT,
|
|
30
|
-
status TEXT NOT NULL
|
|
31
|
-
);
|
|
32
|
-
`);
|
|
33
|
-
}
|
|
34
|
-
getConfig(integrationName) {
|
|
35
|
-
const row = this.db.prepare('SELECT pipeline, active FROM integration_config WHERE integration_name = ?').get(integrationName);
|
|
36
|
-
if (!row)
|
|
37
|
-
return { active: false };
|
|
38
|
-
return {
|
|
39
|
-
...(row.pipeline != null ? { pipeline: row.pipeline } : {}),
|
|
40
|
-
active: row.active === 1,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
patchConfig(integrationName, data) {
|
|
44
|
-
const current = this.getConfig(integrationName);
|
|
45
|
-
const pipeline = 'pipeline' in data ? (data.pipeline ?? null) : (current.pipeline ?? null);
|
|
46
|
-
const active = 'active' in data ? (data.active ? 1 : 0) : (current.active ? 1 : 0);
|
|
47
|
-
this.db.prepare(`
|
|
48
|
-
INSERT INTO integration_config (integration_name, pipeline, active) VALUES (?, ?, ?)
|
|
49
|
-
ON CONFLICT(integration_name) DO UPDATE SET pipeline = excluded.pipeline, active = excluded.active
|
|
50
|
-
`).run(integrationName, pipeline, active);
|
|
51
|
-
}
|
|
52
|
-
insertTrigger(trigger) {
|
|
53
|
-
this.db.prepare(`
|
|
54
|
-
INSERT INTO integration_triggers
|
|
55
|
-
(id, integration_name, received_at, external_id, external_label, external_url, pipeline, run_id, status)
|
|
56
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
57
|
-
`).run(trigger.id, trigger.integration_name, trigger.received_at, trigger.external_id ?? null, trigger.external_label ?? null, trigger.external_url ?? null, trigger.pipeline, trigger.run_id ?? null, trigger.status);
|
|
58
|
-
}
|
|
59
|
-
listTriggers(integrationName, limit = 50) {
|
|
60
|
-
const rows = this.db.prepare(`SELECT id, integration_name, received_at, external_id, external_label, external_url, pipeline, run_id, status
|
|
61
|
-
FROM integration_triggers WHERE integration_name = ? ORDER BY received_at DESC LIMIT ?`).all(integrationName, limit);
|
|
62
|
-
return rows.map(row => ({
|
|
63
|
-
id: row.id,
|
|
64
|
-
integration_name: row.integration_name,
|
|
65
|
-
received_at: row.received_at,
|
|
66
|
-
...(row.external_id != null ? { external_id: row.external_id } : {}),
|
|
67
|
-
...(row.external_label != null ? { external_label: row.external_label } : {}),
|
|
68
|
-
...(row.external_url != null ? { external_url: row.external_url } : {}),
|
|
69
|
-
pipeline: row.pipeline,
|
|
70
|
-
...(row.run_id != null ? { run_id: row.run_id } : {}),
|
|
71
|
-
status: row.status,
|
|
72
|
-
}));
|
|
73
|
-
}
|
|
74
|
-
close() {
|
|
75
|
-
this.db.close();
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=integration-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integration-store.js","sourceRoot":"","sources":["../src/integration-store.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,2FAA2F;AAC3F,gEAAgE;AAEhE,OAAO,EAAE,YAAY,EAAqB,MAAM,2BAA2B,CAAC;AAmB5E,MAAM,OAAO,gBAAgB;IACnB,EAAE,CAAe;IAEzB,YAAY,MAAc;QACxB,IAAI,CAAC,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;KAmBZ,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,eAAuB;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,4EAA4E,CAC7E,CAAC,GAAG,CAAC,eAAe,CAA4D,CAAC;QAElF,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACnC,OAAO;YACL,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,CAAC;SACzB,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,eAAuB,EAAE,IAAgC;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QAC3F,MAAM,MAAM,GAAG,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CAAC,eAAe,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,aAAa,CAAC,OAAiC;QAC7C,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAIf,CAAC,CAAC,GAAG,CACJ,OAAO,CAAC,EAAE,EACV,OAAO,CAAC,gBAAgB,EACxB,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,WAAW,IAAI,IAAI,EAC3B,OAAO,CAAC,cAAc,IAAI,IAAI,EAC9B,OAAO,CAAC,YAAY,IAAI,IAAI,EAC5B,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,MAAM,IAAI,IAAI,EACtB,OAAO,CAAC,MAAM,CACf,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,eAAuB,EAAE,KAAK,GAAG,EAAE;QAM9C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B;8FACwF,CACzF,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAU,CAAC;QAEvC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtB,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,GAAG,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,MAAM,EAAE,GAAG,CAAC,MAA8B;SAC3C,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"failure-handler.d.ts","sourceRoot":"","sources":["../../../src/integrations/linear/failure-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAqCzE,qBAAa,oBAAqB,YAAW,cAAc;IACnD,aAAa,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CAqD/D"}
|