@agent-relay/factory 0.0.0 → 0.1.1
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 +240 -22
- package/bin/factory.mjs +7 -0
- package/dist/cli/fleet.d.ts +77 -0
- package/dist/cli/fleet.d.ts.map +1 -0
- package/dist/cli/fleet.js +500 -0
- package/dist/cli/fleet.js.map +1 -0
- package/dist/config/schema.d.ts +1313 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +309 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/constants/linear.d.ts +4 -0
- package/dist/constants/linear.d.ts.map +1 -0
- package/dist/constants/linear.js +15 -0
- package/dist/constants/linear.js.map +1 -0
- package/dist/constants/slack.d.ts +3 -0
- package/dist/constants/slack.d.ts.map +1 -0
- package/dist/constants/slack.js +3 -0
- package/dist/constants/slack.js.map +1 -0
- package/dist/dispatch/templates.d.ts +36 -0
- package/dist/dispatch/templates.d.ts.map +1 -0
- package/dist/dispatch/templates.js +110 -0
- package/dist/dispatch/templates.js.map +1 -0
- package/dist/fleet/create-fleet.d.ts +13 -0
- package/dist/fleet/create-fleet.d.ts.map +1 -0
- package/dist/fleet/create-fleet.js +14 -0
- package/dist/fleet/create-fleet.js.map +1 -0
- package/dist/fleet/internal-fleet-client.d.ts +85 -0
- package/dist/fleet/internal-fleet-client.d.ts.map +1 -0
- package/dist/fleet/internal-fleet-client.js +575 -0
- package/dist/fleet/internal-fleet-client.js.map +1 -0
- package/dist/fleet/relay-fleet-client.d.ts +28 -0
- package/dist/fleet/relay-fleet-client.d.ts.map +1 -0
- package/dist/fleet/relay-fleet-client.js +33 -0
- package/dist/fleet/relay-fleet-client.js.map +1 -0
- package/dist/github/index.d.ts +5 -0
- package/dist/github/index.d.ts.map +1 -0
- package/dist/github/index.js +3 -0
- package/dist/github/index.js.map +1 -0
- package/dist/github/merge-gate.d.ts +47 -0
- package/dist/github/merge-gate.d.ts.map +1 -0
- package/dist/github/merge-gate.js +147 -0
- package/dist/github/merge-gate.js.map +1 -0
- package/dist/github/probe-closer.d.ts +15 -0
- package/dist/github/probe-closer.d.ts.map +1 -0
- package/dist/github/probe-closer.js +67 -0
- package/dist/github/probe-closer.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/issue-key-match.d.ts +3 -0
- package/dist/issue-key-match.d.ts.map +1 -0
- package/dist/issue-key-match.js +22 -0
- package/dist/issue-key-match.js.map +1 -0
- package/dist/linear/state-resolver.d.ts +25 -0
- package/dist/linear/state-resolver.d.ts.map +1 -0
- package/dist/linear/state-resolver.js +221 -0
- package/dist/linear/state-resolver.js.map +1 -0
- package/dist/mount/local-mount-preflight.d.ts +8 -0
- package/dist/mount/local-mount-preflight.d.ts.map +1 -0
- package/dist/mount/local-mount-preflight.js +97 -0
- package/dist/mount/local-mount-preflight.js.map +1 -0
- package/dist/mount/relayfile-binary.d.ts +7 -0
- package/dist/mount/relayfile-binary.d.ts.map +1 -0
- package/dist/mount/relayfile-binary.js +143 -0
- package/dist/mount/relayfile-binary.js.map +1 -0
- package/dist/mount/relayfile-cloud-mount-client.d.ts +123 -0
- package/dist/mount/relayfile-cloud-mount-client.d.ts.map +1 -0
- package/dist/mount/relayfile-cloud-mount-client.js +427 -0
- package/dist/mount/relayfile-cloud-mount-client.js.map +1 -0
- package/dist/orchestrator/batch-tracker.d.ts +42 -0
- package/dist/orchestrator/batch-tracker.d.ts.map +1 -0
- package/dist/orchestrator/batch-tracker.js +125 -0
- package/dist/orchestrator/batch-tracker.js.map +1 -0
- package/dist/orchestrator/factory.d.ts +55 -0
- package/dist/orchestrator/factory.d.ts.map +1 -0
- package/dist/orchestrator/factory.js +4018 -0
- package/dist/orchestrator/factory.js.map +1 -0
- package/dist/orchestrator/index.d.ts +5 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +4 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/process-identity.d.ts +23 -0
- package/dist/orchestrator/process-identity.d.ts.map +1 -0
- package/dist/orchestrator/process-identity.js +122 -0
- package/dist/orchestrator/process-identity.js.map +1 -0
- package/dist/orchestrator/reaper.d.ts +60 -0
- package/dist/orchestrator/reaper.d.ts.map +1 -0
- package/dist/orchestrator/reaper.js +293 -0
- package/dist/orchestrator/reaper.js.map +1 -0
- package/dist/ports/fleet.d.ts +95 -0
- package/dist/ports/fleet.d.ts.map +1 -0
- package/dist/ports/fleet.js +2 -0
- package/dist/ports/fleet.js.map +1 -0
- package/dist/ports/index.d.ts +5 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +2 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/ports/mount.d.ts +56 -0
- package/dist/ports/mount.d.ts.map +1 -0
- package/dist/ports/mount.js +2 -0
- package/dist/ports/mount.js.map +1 -0
- package/dist/ports/state.d.ts +61 -0
- package/dist/ports/state.d.ts.map +1 -0
- package/dist/ports/state.js +2 -0
- package/dist/ports/state.js.map +1 -0
- package/dist/ports/system.d.ts +15 -0
- package/dist/ports/system.d.ts.map +1 -0
- package/dist/ports/system.js +2 -0
- package/dist/ports/system.js.map +1 -0
- package/dist/ports/writeback.d.ts +25 -0
- package/dist/ports/writeback.d.ts.map +1 -0
- package/dist/ports/writeback.js +2 -0
- package/dist/ports/writeback.js.map +1 -0
- package/dist/safety/factory-scope.d.ts +16 -0
- package/dist/safety/factory-scope.d.ts.map +1 -0
- package/dist/safety/factory-scope.js +107 -0
- package/dist/safety/factory-scope.js.map +1 -0
- package/dist/state/in-memory-state-store.d.ts +31 -0
- package/dist/state/in-memory-state-store.d.ts.map +1 -0
- package/dist/state/in-memory-state-store.js +115 -0
- package/dist/state/in-memory-state-store.js.map +1 -0
- package/dist/state/index.d.ts +3 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +2 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/store.d.ts +29 -0
- package/dist/state/store.d.ts.map +1 -0
- package/dist/state/store.js +26 -0
- package/dist/state/store.js.map +1 -0
- package/dist/subscriptions/common.d.ts +7 -0
- package/dist/subscriptions/common.d.ts.map +1 -0
- package/dist/subscriptions/common.js +59 -0
- package/dist/subscriptions/common.js.map +1 -0
- package/dist/subscriptions/event-client.d.ts +40 -0
- package/dist/subscriptions/event-client.d.ts.map +1 -0
- package/dist/subscriptions/event-client.js +234 -0
- package/dist/subscriptions/event-client.js.map +1 -0
- package/dist/subscriptions/globs.d.ts +5 -0
- package/dist/subscriptions/globs.d.ts.map +1 -0
- package/dist/subscriptions/globs.js +50 -0
- package/dist/subscriptions/globs.js.map +1 -0
- package/dist/subscriptions/index.d.ts +8 -0
- package/dist/subscriptions/index.d.ts.map +1 -0
- package/dist/subscriptions/index.js +5 -0
- package/dist/subscriptions/index.js.map +1 -0
- package/dist/subscriptions/linear-filter.d.ts +26 -0
- package/dist/subscriptions/linear-filter.d.ts.map +1 -0
- package/dist/subscriptions/linear-filter.js +143 -0
- package/dist/subscriptions/linear-filter.js.map +1 -0
- package/dist/subscriptions/specs.d.ts +44 -0
- package/dist/subscriptions/specs.d.ts.map +1 -0
- package/dist/subscriptions/specs.js +195 -0
- package/dist/subscriptions/specs.js.map +1 -0
- package/dist/testing/fakes.d.ts +114 -0
- package/dist/testing/fakes.d.ts.map +1 -0
- package/dist/testing/fakes.js +219 -0
- package/dist/testing/fakes.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +2 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/triage/heuristic.d.ts +38 -0
- package/dist/triage/heuristic.d.ts.map +1 -0
- package/dist/triage/heuristic.js +262 -0
- package/dist/triage/heuristic.js.map +1 -0
- package/dist/triage/index.d.ts +7 -0
- package/dist/triage/index.d.ts.map +1 -0
- package/dist/triage/index.js +5 -0
- package/dist/triage/index.js.map +1 -0
- package/dist/triage/llm.d.ts +11 -0
- package/dist/triage/llm.d.ts.map +1 -0
- package/dist/triage/llm.js +46 -0
- package/dist/triage/llm.js.map +1 -0
- package/dist/triage/schema.d.ts +240 -0
- package/dist/triage/schema.d.ts.map +1 -0
- package/dist/triage/schema.js +34 -0
- package/dist/triage/schema.js.map +1 -0
- package/dist/triage/tiered.d.ts +8 -0
- package/dist/triage/tiered.d.ts.map +1 -0
- package/dist/triage/tiered.js +40 -0
- package/dist/triage/tiered.js.map +1 -0
- package/dist/types.d.ts +211 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/webhook/handler.d.ts +22 -0
- package/dist/webhook/handler.d.ts.map +1 -0
- package/dist/webhook/handler.js +57 -0
- package/dist/webhook/handler.js.map +1 -0
- package/dist/webhook/index.d.ts +5 -0
- package/dist/webhook/index.d.ts.map +1 -0
- package/dist/webhook/index.js +3 -0
- package/dist/webhook/index.js.map +1 -0
- package/dist/webhook/registrar.d.ts +16 -0
- package/dist/webhook/registrar.d.ts.map +1 -0
- package/dist/webhook/registrar.js +50 -0
- package/dist/webhook/registrar.js.map +1 -0
- package/dist/writeback/github.d.ts +6 -0
- package/dist/writeback/github.d.ts.map +1 -0
- package/dist/writeback/github.js +48 -0
- package/dist/writeback/github.js.map +1 -0
- package/dist/writeback/index.d.ts +6 -0
- package/dist/writeback/index.d.ts.map +1 -0
- package/dist/writeback/index.js +4 -0
- package/dist/writeback/index.js.map +1 -0
- package/dist/writeback/linear.d.ts +41 -0
- package/dist/writeback/linear.d.ts.map +1 -0
- package/dist/writeback/linear.js +243 -0
- package/dist/writeback/linear.js.map +1 -0
- package/dist/writeback/shared.d.ts +7 -0
- package/dist/writeback/shared.d.ts.map +1 -0
- package/dist/writeback/shared.js +29 -0
- package/dist/writeback/shared.js.map +1 -0
- package/dist/writeback/slack.d.ts +16 -0
- package/dist/writeback/slack.d.ts.map +1 -0
- package/dist/writeback/slack.js +104 -0
- package/dist/writeback/slack.js.map +1 -0
- package/package.json +46 -9
- package/index.d.ts +0 -2
- package/index.js +0 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tiered.d.ts","sourceRoot":"","sources":["../../src/triage/tiered.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAGxF,qBAAa,YAAa,YAAW,YAAY;;gBAInC,SAAS,GAAE,YAAoC,EAAE,GAAG,CAAC,EAAE,YAAY;IAKzE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;CAiB9E;AAED,wBAAgB,cAAc,CAC5B,iBAAiB,EAAE,cAAc,EACjC,WAAW,EAAE,cAAc,EAC3B,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,aAAa,GACjB,cAAc,CAchB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { buildDecision, HeuristicTriage, normalizeDecision } from './heuristic';
|
|
2
|
+
export class TieredTriage {
|
|
3
|
+
#heuristic;
|
|
4
|
+
#llm;
|
|
5
|
+
constructor(heuristic = new HeuristicTriage(), llm) {
|
|
6
|
+
this.#heuristic = heuristic;
|
|
7
|
+
this.#llm = llm;
|
|
8
|
+
}
|
|
9
|
+
async triage(issue, ctx) {
|
|
10
|
+
const heuristicDecision = await this.#heuristic.triage(issue, ctx);
|
|
11
|
+
if (!heuristicDecision.thin && heuristicDecision.confidence !== 'low') {
|
|
12
|
+
return heuristicDecision;
|
|
13
|
+
}
|
|
14
|
+
if (!this.#llm) {
|
|
15
|
+
return { ...heuristicDecision, confidence: 'low' };
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const llmDecision = await this.#llm.triage(issue, ctx);
|
|
19
|
+
return mergeDecisions(heuristicDecision, llmDecision, issue, ctx);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return { ...heuristicDecision, confidence: 'low' };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function mergeDecisions(heuristicDecision, llmDecision, issue, ctx) {
|
|
27
|
+
const mergedRoutes = llmDecision.routes.length > 0 ? llmDecision.routes : heuristicDecision.routes;
|
|
28
|
+
const mergedScope = mergedRoutes.length >= 2 || llmDecision.scope === 'team' || heuristicDecision.scope === 'team' ? 'team' : 'single';
|
|
29
|
+
return normalizeDecision(buildDecision({
|
|
30
|
+
issue,
|
|
31
|
+
config: ctx.config,
|
|
32
|
+
routes: mergedRoutes,
|
|
33
|
+
scope: mergedScope,
|
|
34
|
+
thin: llmDecision.thin && heuristicDecision.thin,
|
|
35
|
+
confidence: mergedRoutes.length === 0 ? 'low' : llmDecision.confidence,
|
|
36
|
+
rationale: llmDecision.rationale || heuristicDecision.rationale,
|
|
37
|
+
scopeSlugs: llmDecision.implementers.map((implementer) => implementer.name.replace(/^ar-\d+-impl-?/, '')).filter(Boolean),
|
|
38
|
+
}), issue, ctx.config);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=tiered.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tiered.js","sourceRoot":"","sources":["../../src/triage/tiered.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/E,MAAM,OAAO,YAAY;IACd,UAAU,CAAc;IACxB,IAAI,CAAe;IAE5B,YAAY,YAA0B,IAAI,eAAe,EAAE,EAAE,GAAkB;QAC7E,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAC3B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAkB,EAAE,GAAkB;QACjD,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAClE,IAAI,CAAC,iBAAiB,CAAC,IAAI,IAAI,iBAAiB,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YACtE,OAAO,iBAAiB,CAAA;QAC1B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,EAAE,GAAG,iBAAiB,EAAE,UAAU,EAAE,KAAK,EAAE,CAAA;QACpD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACtD,OAAO,cAAc,CAAC,iBAAiB,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,GAAG,iBAAiB,EAAE,UAAU,EAAE,KAAK,EAAE,CAAA;QACpD,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAC5B,iBAAiC,EACjC,WAA2B,EAC3B,KAAkB,EAClB,GAAkB;IAElB,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAA;IAClG,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,WAAW,CAAC,KAAK,KAAK,MAAM,IAAI,iBAAiB,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAA;IAEtI,OAAO,iBAAiB,CAAC,aAAa,CAAC;QACrC,KAAK;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,MAAM,EAAE,YAAY;QACpB,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,iBAAiB,CAAC,IAAI;QAChD,UAAU,EAAE,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU;QACtE,SAAS,EAAE,WAAW,CAAC,SAAS,IAAI,iBAAiB,CAAC,SAAS;QAC/D,UAAU,EAAE,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;KAC1H,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;AACxB,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import type { FactoryConfig } from './config/schema';
|
|
2
|
+
import type { FactoryStateResolution } from './linear/state-resolver';
|
|
3
|
+
import type { AgentSpec, FleetClient, GithubRead, LinearWriteback, MountClient, SlackWriteback } from './ports';
|
|
4
|
+
import type { StateStore } from './ports/state';
|
|
5
|
+
import type { Clock, Logger } from './ports/system';
|
|
6
|
+
import type { CloseProbePrInput, CloseProbePrResult } from './github/probe-closer';
|
|
7
|
+
import type { GhRunner, GithubMergeGate } from './github/merge-gate';
|
|
8
|
+
import type { AgentProcessFinder, ProcessIdentity } from './orchestrator/process-identity';
|
|
9
|
+
export interface FactoryPorts {
|
|
10
|
+
mount: MountClient;
|
|
11
|
+
fleet: FleetClient;
|
|
12
|
+
stateStore?: StateStore;
|
|
13
|
+
stateResolution?: FactoryStateResolution;
|
|
14
|
+
triage?: TriageEngine;
|
|
15
|
+
linear?: LinearWriteback;
|
|
16
|
+
slack?: SlackWriteback;
|
|
17
|
+
github?: GithubRead;
|
|
18
|
+
mergeGate?: GithubMergeGate;
|
|
19
|
+
probeCloser?: ProbeCloser;
|
|
20
|
+
probePrResolver?: ProbePrResolver;
|
|
21
|
+
probePrGhRunner?: GhRunner;
|
|
22
|
+
logger?: Logger;
|
|
23
|
+
clock?: Clock;
|
|
24
|
+
processIdentityReader?: (pid: number) => Promise<ProcessIdentity | undefined>;
|
|
25
|
+
processFinder?: AgentProcessFinder;
|
|
26
|
+
kill?: (pid: number, signal?: NodeJS.Signals | 0) => boolean;
|
|
27
|
+
readChildPids?: (pid: number) => Promise<number[]>;
|
|
28
|
+
terminationGraceMs?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface Factory {
|
|
31
|
+
start(opts?: FactoryStartOptions): Promise<void>;
|
|
32
|
+
stop(): Promise<void>;
|
|
33
|
+
dispose(): Promise<void>;
|
|
34
|
+
runOnce(opts?: {
|
|
35
|
+
dryRun?: boolean;
|
|
36
|
+
}): Promise<IterationReport>;
|
|
37
|
+
runLoop(opts?: FactoryLoopRunOptions): Promise<IterationReport[]>;
|
|
38
|
+
triageIssue(issue: LinearIssue): Promise<TriageDecision>;
|
|
39
|
+
dispatch(decision: TriageDecision, opts?: {
|
|
40
|
+
dryRun?: boolean;
|
|
41
|
+
}): Promise<DispatchResult>;
|
|
42
|
+
status(): FactoryStatus;
|
|
43
|
+
on(event: 'issue-queued' | 'dispatched' | 'issue-done' | 'writeback-verified' | 'error', listener: (payload: FactoryEventPayload) => void): () => void;
|
|
44
|
+
}
|
|
45
|
+
export interface FactoryStartOptions {
|
|
46
|
+
mode?: 'backfill-and-subscribe' | 'live';
|
|
47
|
+
liveSubscription?: Partial<FactoryLiveSubscriptionOptions>;
|
|
48
|
+
}
|
|
49
|
+
export interface FactoryLiveSubscriptionOptions {
|
|
50
|
+
transport: 'subscribe-and-poll' | 'subscribe' | 'poll';
|
|
51
|
+
pollIntervalMs: number;
|
|
52
|
+
eventLimit: number;
|
|
53
|
+
replaySkewMarginMs: number;
|
|
54
|
+
}
|
|
55
|
+
export interface FactoryLoopRunOptions {
|
|
56
|
+
dryRun?: boolean;
|
|
57
|
+
maxIterations?: number;
|
|
58
|
+
maxConsecutiveFailures?: number;
|
|
59
|
+
heartbeatPath?: string;
|
|
60
|
+
registryPath?: string;
|
|
61
|
+
}
|
|
62
|
+
export type FactoryLoopHeartbeatStatus = 'running' | 'idle' | 'stopping';
|
|
63
|
+
export interface FactoryLoopHeartbeat {
|
|
64
|
+
pid: number;
|
|
65
|
+
status: FactoryLoopHeartbeatStatus;
|
|
66
|
+
iteration: number;
|
|
67
|
+
maxIterations: number;
|
|
68
|
+
updatedAt: string;
|
|
69
|
+
updatedAtMs: number;
|
|
70
|
+
registryPath?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface FactoryInFlightRegistryAgent {
|
|
73
|
+
name: string;
|
|
74
|
+
role?: AgentSpec['role'];
|
|
75
|
+
issue?: IssueRef;
|
|
76
|
+
sessionRef?: string;
|
|
77
|
+
pids: number[];
|
|
78
|
+
processes?: FactoryInFlightRegistryProcess[];
|
|
79
|
+
}
|
|
80
|
+
export interface FactoryInFlightRegistryProcess {
|
|
81
|
+
pid: number;
|
|
82
|
+
agentName: string;
|
|
83
|
+
cmdline: string;
|
|
84
|
+
startTime: string;
|
|
85
|
+
}
|
|
86
|
+
export interface FactoryInFlightRegistry {
|
|
87
|
+
pid: number;
|
|
88
|
+
heartbeatPath?: string;
|
|
89
|
+
updatedAt: string;
|
|
90
|
+
updatedAtMs: number;
|
|
91
|
+
agents: FactoryInFlightRegistryAgent[];
|
|
92
|
+
}
|
|
93
|
+
export interface FactoryLoopLiveness {
|
|
94
|
+
ok: boolean;
|
|
95
|
+
stale: boolean;
|
|
96
|
+
ageMs?: number;
|
|
97
|
+
heartbeat?: FactoryLoopHeartbeat;
|
|
98
|
+
reason?: string;
|
|
99
|
+
}
|
|
100
|
+
export interface LinearIssue {
|
|
101
|
+
uuid: string;
|
|
102
|
+
key: string;
|
|
103
|
+
title: string;
|
|
104
|
+
description: string;
|
|
105
|
+
stateId: string;
|
|
106
|
+
state?: {
|
|
107
|
+
name: string;
|
|
108
|
+
};
|
|
109
|
+
labels: string[];
|
|
110
|
+
project?: string;
|
|
111
|
+
team?: string;
|
|
112
|
+
assignee?: string;
|
|
113
|
+
path: string;
|
|
114
|
+
raw: Record<string, unknown>;
|
|
115
|
+
}
|
|
116
|
+
export interface IssueRef {
|
|
117
|
+
uuid: string;
|
|
118
|
+
key: string;
|
|
119
|
+
path: string;
|
|
120
|
+
}
|
|
121
|
+
export interface IterationReport {
|
|
122
|
+
pulled: IssueRef[];
|
|
123
|
+
triaged: TriageDecision[];
|
|
124
|
+
dispatched: DispatchResult[];
|
|
125
|
+
skipped: Array<{
|
|
126
|
+
issue: IssueRef;
|
|
127
|
+
reason: string;
|
|
128
|
+
}>;
|
|
129
|
+
dryRun: boolean;
|
|
130
|
+
slackDegraded?: boolean;
|
|
131
|
+
error?: {
|
|
132
|
+
message: string;
|
|
133
|
+
stack?: string;
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
export interface DispatchResult {
|
|
137
|
+
issue: IssueRef;
|
|
138
|
+
agents: Array<{
|
|
139
|
+
name: string;
|
|
140
|
+
role: AgentSpec['role'];
|
|
141
|
+
}>;
|
|
142
|
+
comments?: string[];
|
|
143
|
+
stateId?: string;
|
|
144
|
+
dryRun: boolean;
|
|
145
|
+
}
|
|
146
|
+
export interface FactoryStatus {
|
|
147
|
+
inFlight: IssueRef[];
|
|
148
|
+
queued: IssueRef[];
|
|
149
|
+
counters: Record<string, number>;
|
|
150
|
+
slackDegraded?: boolean;
|
|
151
|
+
slackDegradedReason?: string;
|
|
152
|
+
}
|
|
153
|
+
export type FactoryEventPayload = {
|
|
154
|
+
issue: IssueRef;
|
|
155
|
+
} | {
|
|
156
|
+
issue: IssueRef;
|
|
157
|
+
result: DispatchResult;
|
|
158
|
+
} | {
|
|
159
|
+
issue: IssueRef;
|
|
160
|
+
path: string;
|
|
161
|
+
} | {
|
|
162
|
+
error: unknown;
|
|
163
|
+
errorMessage: string;
|
|
164
|
+
errorStack?: string;
|
|
165
|
+
issue?: IssueRef;
|
|
166
|
+
};
|
|
167
|
+
export interface TriageEngine {
|
|
168
|
+
triage(issue: LinearIssue, ctx: TriageContext): Promise<TriageDecision>;
|
|
169
|
+
}
|
|
170
|
+
export interface TriageContext {
|
|
171
|
+
config: FactoryConfig;
|
|
172
|
+
repoMap: RepoMapEntry[];
|
|
173
|
+
}
|
|
174
|
+
export interface RepoMapEntry {
|
|
175
|
+
repo: string;
|
|
176
|
+
clonePath?: string;
|
|
177
|
+
source: 'label' | 'project' | 'keyword' | 'default';
|
|
178
|
+
key?: string;
|
|
179
|
+
}
|
|
180
|
+
export interface TriageDecision {
|
|
181
|
+
issue: IssueRef;
|
|
182
|
+
routes: Array<{
|
|
183
|
+
repo: string;
|
|
184
|
+
clonePath?: string;
|
|
185
|
+
rationale: string;
|
|
186
|
+
}>;
|
|
187
|
+
scope: 'single' | 'team';
|
|
188
|
+
implementers: AgentSpec[];
|
|
189
|
+
reviewer: AgentSpec;
|
|
190
|
+
thin: boolean;
|
|
191
|
+
confidence: 'high' | 'low';
|
|
192
|
+
rationale: string;
|
|
193
|
+
}
|
|
194
|
+
export interface PrSummary {
|
|
195
|
+
repo: string;
|
|
196
|
+
number: number;
|
|
197
|
+
title?: string;
|
|
198
|
+
url?: string;
|
|
199
|
+
/** Advisory only: mount snapshots can lag live GitHub state. Never use this for merge readiness. */
|
|
200
|
+
state?: string;
|
|
201
|
+
headRef?: string;
|
|
202
|
+
baseRef?: string;
|
|
203
|
+
author?: string;
|
|
204
|
+
filesChanged?: string[];
|
|
205
|
+
}
|
|
206
|
+
export type ProbePrRef = Pick<CloseProbePrInput, 'repo' | 'prNumber'> & {
|
|
207
|
+
draft?: boolean;
|
|
208
|
+
};
|
|
209
|
+
export type ProbePrResolver = (issue: LinearIssue) => Promise<ProbePrRef | undefined>;
|
|
210
|
+
export type ProbeCloser = (input: Pick<CloseProbePrInput, 'repo' | 'prNumber' | 'expectedIssueKey' | 'requireTitleMarker'>) => Promise<CloseProbePrResult>;
|
|
211
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface WebhookEvent {
|
|
2
|
+
type: string;
|
|
3
|
+
path: string;
|
|
4
|
+
revision: string;
|
|
5
|
+
eventId: string;
|
|
6
|
+
contentHash?: string;
|
|
7
|
+
provider?: string;
|
|
8
|
+
correlationId?: string;
|
|
9
|
+
timestamp: string;
|
|
10
|
+
}
|
|
11
|
+
export interface WebhookHandlerConfig {
|
|
12
|
+
secret: string;
|
|
13
|
+
onLinearEvent: (event: WebhookEvent) => Promise<void>;
|
|
14
|
+
onSlackEvent: (event: WebhookEvent) => Promise<void>;
|
|
15
|
+
onGithubEvent: (event: WebhookEvent) => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export declare class WebhookHandler {
|
|
18
|
+
#private;
|
|
19
|
+
constructor(config: WebhookHandlerConfig);
|
|
20
|
+
handle(request: Request): Promise<Response>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/webhook/handler.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACrD,YAAY,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,aAAa,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACtD;AAED,qBAAa,cAAc;;gBAIb,MAAM,EAAE,oBAAoB;IAIlC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;CA2ClD"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { createHmac, timingSafeEqual as cryptoTimingSafeEqual } from 'node:crypto';
|
|
2
|
+
export class WebhookHandler {
|
|
3
|
+
#config;
|
|
4
|
+
#seen = new Set();
|
|
5
|
+
constructor(config) {
|
|
6
|
+
this.#config = config;
|
|
7
|
+
}
|
|
8
|
+
async handle(request) {
|
|
9
|
+
const timestamp = request.headers.get('x-relay-timestamp') ?? '';
|
|
10
|
+
const signature = request.headers.get('x-relay-signature') ?? '';
|
|
11
|
+
const headerEventId = request.headers.get('x-relay-event-id') ?? '';
|
|
12
|
+
const rawBody = await request.text();
|
|
13
|
+
const expected = createHmac('sha256', this.#config.secret)
|
|
14
|
+
.update(`${timestamp}.${rawBody}`)
|
|
15
|
+
.digest('hex');
|
|
16
|
+
if (!timingSafeHexEqual(expected, signature)) {
|
|
17
|
+
return new Response('forbidden', { status: 403 });
|
|
18
|
+
}
|
|
19
|
+
let event;
|
|
20
|
+
try {
|
|
21
|
+
event = JSON.parse(rawBody);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return new Response('bad_request', { status: 400 });
|
|
25
|
+
}
|
|
26
|
+
const eventId = event.eventId || headerEventId;
|
|
27
|
+
if (eventId && this.#seen.has(eventId)) {
|
|
28
|
+
return new Response('ok', { status: 200 });
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
if (event.path.startsWith('/linear/issues/')) {
|
|
32
|
+
await this.#config.onLinearEvent(event);
|
|
33
|
+
}
|
|
34
|
+
else if (event.path.startsWith('/slack/channels/')) {
|
|
35
|
+
await this.#config.onSlackEvent(event);
|
|
36
|
+
}
|
|
37
|
+
else if (event.path.startsWith('/github/repos/')) {
|
|
38
|
+
await this.#config.onGithubEvent(event);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return new Response('internal_error', { status: 500 });
|
|
43
|
+
}
|
|
44
|
+
if (eventId) {
|
|
45
|
+
this.#seen.add(eventId);
|
|
46
|
+
}
|
|
47
|
+
return new Response('ok', { status: 200 });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function timingSafeHexEqual(a, b) {
|
|
51
|
+
if (a.length !== b.length)
|
|
52
|
+
return false;
|
|
53
|
+
const bufA = Buffer.from(a, 'hex');
|
|
54
|
+
const bufB = Buffer.from(b, 'hex');
|
|
55
|
+
return bufA.length === bufB.length && cryptoTimingSafeEqual(bufA, bufB);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/webhook/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { WebhookHandler } from './handler.js';
|
|
2
|
+
export type { WebhookHandlerConfig, WebhookEvent } from './handler.js';
|
|
3
|
+
export { WebhookRegistrar } from './registrar.js';
|
|
4
|
+
export type { WebhookRegistrarConfig } from './registrar.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/webhook/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,YAAY,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/webhook/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { RelayFileClient } from '@relayfile/sdk';
|
|
2
|
+
export interface WebhookRegistrarConfig {
|
|
3
|
+
client: RelayFileClient;
|
|
4
|
+
workspaceId: string;
|
|
5
|
+
receiverUrl: string;
|
|
6
|
+
secret: string;
|
|
7
|
+
pathGlobs?: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare class WebhookRegistrar {
|
|
10
|
+
#private;
|
|
11
|
+
constructor(config: WebhookRegistrarConfig);
|
|
12
|
+
register(): Promise<void>;
|
|
13
|
+
unregister(): Promise<void>;
|
|
14
|
+
get subscriptionId(): string | undefined;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=registrar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registrar.d.ts","sourceRoot":"","sources":["../../src/webhook/registrar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,gBAAgB,CAAA;AAQ1E,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,eAAe,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED,qBAAa,gBAAgB;;gBAIf,MAAM,EAAE,sBAAsB;IAIpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC,IAAI,cAAc,IAAI,MAAM,GAAG,SAAS,CAEvC;CASF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const DEFAULT_PATH_GLOBS = [
|
|
2
|
+
'/linear/issues/**',
|
|
3
|
+
'/slack/channels/**',
|
|
4
|
+
'/github/repos/**',
|
|
5
|
+
];
|
|
6
|
+
export class WebhookRegistrar {
|
|
7
|
+
#config;
|
|
8
|
+
#subscriptionId;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.#config = config;
|
|
11
|
+
}
|
|
12
|
+
async register() {
|
|
13
|
+
if (this.#subscriptionId)
|
|
14
|
+
return;
|
|
15
|
+
const pathGlobs = this.#config.pathGlobs ?? DEFAULT_PATH_GLOBS;
|
|
16
|
+
const existing = await this.#findExistingSubscription(pathGlobs);
|
|
17
|
+
if (existing) {
|
|
18
|
+
this.#subscriptionId = existing.id;
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const subscription = await this.#config.client.registerWebhook({
|
|
22
|
+
workspaceId: this.#config.workspaceId,
|
|
23
|
+
url: this.#config.receiverUrl,
|
|
24
|
+
pathGlobs,
|
|
25
|
+
secret: this.#config.secret,
|
|
26
|
+
});
|
|
27
|
+
this.#subscriptionId = subscription.subscriptionId;
|
|
28
|
+
}
|
|
29
|
+
async unregister() {
|
|
30
|
+
if (!this.#subscriptionId)
|
|
31
|
+
return;
|
|
32
|
+
await this.#config.client.deleteWebhook(this.#config.workspaceId, this.#subscriptionId);
|
|
33
|
+
this.#subscriptionId = undefined;
|
|
34
|
+
}
|
|
35
|
+
get subscriptionId() {
|
|
36
|
+
return this.#subscriptionId;
|
|
37
|
+
}
|
|
38
|
+
async #findExistingSubscription(pathGlobs) {
|
|
39
|
+
const subscriptions = await this.#config.client.listWebhooks(this.#config.workspaceId);
|
|
40
|
+
return subscriptions.find((subscription) => (subscription.url === this.#config.receiverUrl
|
|
41
|
+
&& sameStringSet(subscription.pathGlobs, pathGlobs)));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function sameStringSet(a, b) {
|
|
45
|
+
if (a.length !== b.length)
|
|
46
|
+
return false;
|
|
47
|
+
const bSet = new Set(b);
|
|
48
|
+
return a.every((value) => bSet.has(value));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=registrar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registrar.js","sourceRoot":"","sources":["../../src/webhook/registrar.ts"],"names":[],"mappings":"AAEA,MAAM,kBAAkB,GAAG;IACzB,mBAAmB;IACnB,oBAAoB;IACpB,kBAAkB;CACnB,CAAA;AAUD,MAAM,OAAO,gBAAgB;IAClB,OAAO,CAAwB;IACxC,eAAe,CAAS;IAExB,YAAY,MAA8B;QACxC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,eAAe;YAAE,OAAM;QAEhC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAA;QAC9D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA;QAChE,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,EAAE,CAAA;YAClC,OAAM;QACR,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC;YAC7D,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW;YACrC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW;YAC7B,SAAS;YACT,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;SAC5B,CAAC,CAAA;QACF,IAAI,CAAC,eAAe,GAAG,YAAY,CAAC,cAAc,CAAA;IACpD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAM;QACjC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CACrC,IAAI,CAAC,OAAO,CAAC,WAAW,EACxB,IAAI,CAAC,eAAe,CACrB,CAAA;QACD,IAAI,CAAC,eAAe,GAAG,SAAS,CAAA;IAClC,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,eAAe,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,SAAmB;QACjD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QACtF,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAC1C,YAAY,CAAC,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW;eAC1C,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CACpD,CAAC,CAAA;IACJ,CAAC;CACF;AAED,SAAS,aAAa,CAAC,CAAW,EAAE,CAAW;IAC7C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACvC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;IACvB,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;AAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/writeback/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAmBzC,eAAO,MAAM,eAAe,GAAI,OAAO,WAAW;gBAC9B,MAAM,UAAU,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CAgB7D,CAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { asRecord, wrappedPayload } from './shared';
|
|
2
|
+
const repoDir = (repo) => {
|
|
3
|
+
if (repo.includes('__')) {
|
|
4
|
+
return repo;
|
|
5
|
+
}
|
|
6
|
+
const [owner, name] = repo.split('/');
|
|
7
|
+
if (!owner || !name) {
|
|
8
|
+
throw new Error(`GitHub repo must be owner/repo or owner__repo: ${repo}`);
|
|
9
|
+
}
|
|
10
|
+
return `${owner}__${name}`;
|
|
11
|
+
};
|
|
12
|
+
const prPath = (repo, number) => `/github/repos/${repoDir(repo)}/pulls/by-id/${number}.json`;
|
|
13
|
+
export const MountGithubRead = (mount) => ({
|
|
14
|
+
async getPr(repo, number) {
|
|
15
|
+
const { content } = await mount.readFile(prPath(repo, number));
|
|
16
|
+
const payload = wrappedPayload(content);
|
|
17
|
+
return {
|
|
18
|
+
repo,
|
|
19
|
+
number: numberValue(payload.number) ?? number,
|
|
20
|
+
title: typeof payload.title === 'string' ? payload.title : undefined,
|
|
21
|
+
url: typeof payload.url === 'string' ? payload.url : undefined,
|
|
22
|
+
state: typeof payload.state === 'string' ? payload.state : undefined,
|
|
23
|
+
headRef: refName(payload.headRef) ?? refName(payload.head) ?? stringValue(payload.head_ref),
|
|
24
|
+
baseRef: refName(payload.baseRef) ?? refName(payload.base) ?? stringValue(payload.base_ref),
|
|
25
|
+
author: refName(payload.author) ?? stringValue(payload.user),
|
|
26
|
+
filesChanged: filesChanged(payload.files_changed ?? payload.filesChanged ?? payload.files),
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
const stringValue = (value) => typeof value === 'string' ? value : undefined;
|
|
31
|
+
const numberValue = (value) => typeof value === 'number' ? value : undefined;
|
|
32
|
+
const refName = (value) => {
|
|
33
|
+
if (typeof value === 'string') {
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
const record = asRecord(value);
|
|
37
|
+
return stringValue(record?.name) ?? stringValue(record?.ref) ?? stringValue(record?.login);
|
|
38
|
+
};
|
|
39
|
+
const filesChanged = (value) => {
|
|
40
|
+
if (!Array.isArray(value)) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
const files = value
|
|
44
|
+
.map((entry) => typeof entry === 'string' ? entry : stringValue(asRecord(entry)?.path) ?? stringValue(asRecord(entry)?.filename))
|
|
45
|
+
.filter((entry) => Boolean(entry));
|
|
46
|
+
return files.length > 0 ? files : undefined;
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/writeback/github.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { linearCommentName, MountLinearWriteback, } from './linear';
|
|
2
|
+
export type { LinearCommentPayload, LinearCreateIssuePayload, LinearStateIds, MountLinearWritebackConfig, } from './linear';
|
|
3
|
+
export { MountSlackWriteback, } from './slack';
|
|
4
|
+
export type { MountSlackWritebackConfig, } from './slack';
|
|
5
|
+
export { MountGithubRead, } from './github';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/writeback/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,UAAU,CAAA;AACjB,YAAY,EACV,oBAAoB,EACpB,wBAAwB,EACxB,cAAc,EACd,0BAA0B,GAC3B,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,mBAAmB,GACpB,MAAM,SAAS,CAAA;AAChB,YAAY,EACV,yBAAyB,GAC1B,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,eAAe,GAChB,MAAM,UAAU,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/writeback/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,UAAU,CAAA;AAOjB,OAAO,EACL,mBAAmB,GACpB,MAAM,SAAS,CAAA;AAIhB,OAAO,EACL,eAAe,GAChB,MAAM,UAAU,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { MountClient } from '../ports';
|
|
2
|
+
import type { Logger } from '../ports/system';
|
|
3
|
+
import type { LinearIssue } from '../types';
|
|
4
|
+
export interface LinearStateIds {
|
|
5
|
+
[name: string]: string;
|
|
6
|
+
}
|
|
7
|
+
export interface LinearCommentPayload {
|
|
8
|
+
body: string;
|
|
9
|
+
issueId: string;
|
|
10
|
+
}
|
|
11
|
+
export interface MountLinearWritebackConfig {
|
|
12
|
+
stateIds?: LinearStateIds;
|
|
13
|
+
safety?: {
|
|
14
|
+
requireTitlePrefix?: string;
|
|
15
|
+
requireLabel?: string;
|
|
16
|
+
requireTeamKey?: string;
|
|
17
|
+
};
|
|
18
|
+
logger?: Pick<Logger, 'warn'>;
|
|
19
|
+
}
|
|
20
|
+
export interface LinearCreateIssuePayload extends Record<string, unknown> {
|
|
21
|
+
id?: string;
|
|
22
|
+
identifier?: string;
|
|
23
|
+
title?: string;
|
|
24
|
+
teamId?: string;
|
|
25
|
+
team?: unknown;
|
|
26
|
+
labels?: unknown;
|
|
27
|
+
source?: unknown;
|
|
28
|
+
}
|
|
29
|
+
export declare const linearCommentName: (issue: LinearIssue, body: string) => string;
|
|
30
|
+
export declare const MountLinearWriteback: (mount: MountClient, configOrStateIds?: LinearStateIds | MountLinearWritebackConfig) => {
|
|
31
|
+
setState(issue: LinearIssue, stateId: string): Promise<void>;
|
|
32
|
+
postComment(issue: LinearIssue, body: string): Promise<void>;
|
|
33
|
+
createIssue(payload: LinearCreateIssuePayload): Promise<{
|
|
34
|
+
path: string;
|
|
35
|
+
}>;
|
|
36
|
+
verify(issue: LinearIssue, expect: {
|
|
37
|
+
stateId?: string;
|
|
38
|
+
commentName?: string;
|
|
39
|
+
}): Promise<boolean>;
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=linear.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../src/writeback/linear.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAG3C,MAAM,WAAW,cAAc;IAC7B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,MAAM,CAAC,EAAE;QACP,kBAAkB,CAAC,EAAE,MAAM,CAAA;QAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,cAAc,CAAC,EAAE,MAAM,CAAA;KACxB,CAAA;IACD,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,wBAAyB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvE,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAKD,eAAO,MAAM,iBAAiB,GAAI,OAAO,WAAW,EAAE,MAAM,MAAM,KAAG,MACxB,CAAA;AAwF7C,eAAO,MAAM,oBAAoB,GAC/B,OAAO,WAAW,EAClB,mBAAmB,cAAc,GAAG,0BAA0B;oBAsEtC,WAAW,WAAW,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;uBAYzC,WAAW,QAAQ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;yBASvC,wBAAwB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;kBAiBtE,WAAW,UACV;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GACjD,OAAO,CAAC,OAAO,CAAC;CAkBtB,CAAA"}
|