@agent-relay/factory 0.0.0 → 0.1.2
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 +182 -23
- package/bin/factory.mjs +7 -0
- package/dist/cli/fleet.d.ts +81 -0
- package/dist/cli/fleet.d.ts.map +1 -0
- package/dist/cli/fleet.js +571 -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 +320 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/constants/linear.d.ts +6 -0
- package/dist/constants/linear.d.ts.map +1 -0
- package/dist/constants/linear.js +21 -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 +52 -0
- package/dist/dispatch/templates.d.ts.map +1 -0
- package/dist/dispatch/templates.js +118 -0
- package/dist/dispatch/templates.js.map +1 -0
- package/dist/fleet/create-fleet.d.ts +14 -0
- package/dist/fleet/create-fleet.d.ts.map +1 -0
- package/dist/fleet/create-fleet.js +15 -0
- package/dist/fleet/create-fleet.js.map +1 -0
- package/dist/fleet/ensure-relay-broker.d.ts +24 -0
- package/dist/fleet/ensure-relay-broker.d.ts.map +1 -0
- package/dist/fleet/ensure-relay-broker.js +56 -0
- package/dist/fleet/ensure-relay-broker.js.map +1 -0
- package/dist/fleet/internal-fleet-client.d.ts +90 -0
- package/dist/fleet/internal-fleet-client.d.ts.map +1 -0
- package/dist/fleet/internal-fleet-client.js +602 -0
- package/dist/fleet/internal-fleet-client.js.map +1 -0
- package/dist/fleet/relay-fleet-client.d.ts +105 -0
- package/dist/fleet/relay-fleet-client.d.ts.map +1 -0
- package/dist/fleet/relay-fleet-client.js +509 -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 +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -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 +26 -0
- package/dist/linear/state-resolver.d.ts.map +1 -0
- package/dist/linear/state-resolver.js +285 -0
- package/dist/linear/state-resolver.js.map +1 -0
- package/dist/mount/local-mount-preflight.d.ts +9 -0
- package/dist/mount/local-mount-preflight.d.ts.map +1 -0
- package/dist/mount/local-mount-preflight.js +149 -0
- package/dist/mount/local-mount-preflight.js.map +1 -0
- package/dist/mount/relayfile-binary.d.ts +9 -0
- package/dist/mount/relayfile-binary.d.ts.map +1 -0
- package/dist/mount/relayfile-binary.js +177 -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/node/factory-node.d.ts +59 -0
- package/dist/node/factory-node.d.ts.map +1 -0
- package/dist/node/factory-node.js +351 -0
- package/dist/node/factory-node.js.map +1 -0
- package/dist/node/factory.node.d.ts +3 -0
- package/dist/node/factory.node.d.ts.map +1 -0
- package/dist/node/factory.node.js +5 -0
- package/dist/node/factory.node.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 +58 -0
- package/dist/orchestrator/factory.d.ts.map +1 -0
- package/dist/orchestrator/factory.js +4372 -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 +101 -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 +42 -0
- package/dist/triage/heuristic.d.ts.map +1 -0
- package/dist/triage/heuristic.js +326 -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 +48 -0
- package/dist/triage/llm.js.map +1 -0
- package/dist/triage/schema.d.ts +344 -0
- package/dist/triage/schema.d.ts.map +1 -0
- package/dist/triage/schema.js +37 -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 +47 -0
- package/dist/triage/tiered.js.map +1 -0
- package/dist/types.d.ts +212 -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 +286 -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 +54 -9
- package/scripts/com.agentrelay.factory-canary.plist.example +53 -0
- package/scripts/factory-canary.sh +89 -0
- package/index.d.ts +0 -2
- package/index.js +0 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/writeback/linear.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const parseJsonContent: (content: unknown) => unknown;
|
|
2
|
+
export declare const asRecord: (value: unknown) => Record<string, unknown> | undefined;
|
|
3
|
+
export declare const wrappedPayload: (content: unknown) => Record<string, unknown>;
|
|
4
|
+
export declare const stableHash: (input: string) => string;
|
|
5
|
+
export declare const safePathSegment: (input: string) => string;
|
|
6
|
+
export declare const trimToLines: (text: string, maxLines: number) => string;
|
|
7
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/writeback/shared.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,GAAI,SAAS,OAAO,KAAG,OAMnD,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAGrD,CAAA;AAEf,eAAO,MAAM,cAAc,GAAI,SAAS,OAAO,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAGvE,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,MAQ1C,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,KAAG,MAMhC,CAAA;AAEhB,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,KAAG,MACV,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export const parseJsonContent = (content) => {
|
|
2
|
+
if (typeof content !== 'string') {
|
|
3
|
+
return content;
|
|
4
|
+
}
|
|
5
|
+
return JSON.parse(content);
|
|
6
|
+
};
|
|
7
|
+
export const asRecord = (value) => value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
8
|
+
? value
|
|
9
|
+
: undefined;
|
|
10
|
+
export const wrappedPayload = (content) => {
|
|
11
|
+
const record = asRecord(parseJsonContent(content)) ?? {};
|
|
12
|
+
return asRecord(record.payload) ?? record;
|
|
13
|
+
};
|
|
14
|
+
export const stableHash = (input) => {
|
|
15
|
+
let hash = 0x811c9dc5;
|
|
16
|
+
for (let index = 0; index < input.length; index += 1) {
|
|
17
|
+
hash ^= input.charCodeAt(index);
|
|
18
|
+
hash = Math.imul(hash, 0x01000193);
|
|
19
|
+
}
|
|
20
|
+
return (hash >>> 0).toString(36);
|
|
21
|
+
};
|
|
22
|
+
export const safePathSegment = (input) => input
|
|
23
|
+
.trim()
|
|
24
|
+
.toLowerCase()
|
|
25
|
+
.replace(/[^a-z0-9._-]+/g, '-')
|
|
26
|
+
.replace(/^-+|-+$/g, '')
|
|
27
|
+
|| 'factory';
|
|
28
|
+
export const trimToLines = (text, maxLines) => text.split(/\r?\n/).slice(0, maxLines).join('\n');
|
|
29
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/writeback/shared.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAgB,EAAW,EAAE;IAC5D,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AAC5B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAuC,EAAE,CAC9E,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAClE,CAAC,CAAC,KAAgC;IAClC,CAAC,CAAC,SAAS,CAAA;AAEf,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAgB,EAA2B,EAAE;IAC1E,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;IACxD,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAA;AAC3C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE;IAClD,IAAI,IAAI,GAAG,UAAU,CAAA;IACrB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAC/B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACpC,CAAC;IAED,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;AAClC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAa,EAAU,EAAE,CACvD,KAAK;KACF,IAAI,EAAE;KACN,WAAW,EAAE;KACb,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;KAC9B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;OACrB,SAAS,CAAA;AAEhB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAU,EAAE,CACpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { MountClient } from '../ports/index.js';
|
|
2
|
+
export interface MountSlackWritebackConfig {
|
|
3
|
+
channel?: string;
|
|
4
|
+
channelDir?: string;
|
|
5
|
+
clientIdPrefix?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const MountSlackWriteback: (mount: MountClient, slackCfg?: MountSlackWritebackConfig) => {
|
|
8
|
+
postThread(root: {
|
|
9
|
+
channel: string;
|
|
10
|
+
text: string;
|
|
11
|
+
}): Promise<{
|
|
12
|
+
threadId: string;
|
|
13
|
+
}>;
|
|
14
|
+
reply(threadId: string, text: string): Promise<void>;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=slack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../src/writeback/slack.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAG3C,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AA0ED,eAAO,MAAM,mBAAmB,GAC9B,OAAO,WAAW,EAClB,WAAU,yBAA8B;qBAWf;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;oBAsBlE,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA0B7D,CAAA"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { slackMessagePath, slackReplyPath } from '../constants/slack.js';
|
|
2
|
+
import { safePathSegment, stableHash, trimToLines, wrappedPayload } from './shared.js';
|
|
3
|
+
const channelIdFromDir = (channelDir) => channelDir.split('__')[0] ?? channelDir;
|
|
4
|
+
const channelSegment = (value) => {
|
|
5
|
+
const trimmed = value.trim().replace(/^#/u, '');
|
|
6
|
+
const match = trimmed.match(/(?:^|\/)slack\/channels\/([^/]+)/u);
|
|
7
|
+
return match?.[1] ?? trimmed.split('/')[0] ?? trimmed;
|
|
8
|
+
};
|
|
9
|
+
const channelAliases = (value) => {
|
|
10
|
+
const segment = typeof value === 'string' ? channelSegment(value) : '';
|
|
11
|
+
if (!segment)
|
|
12
|
+
return new Set();
|
|
13
|
+
const aliases = new Set();
|
|
14
|
+
const add = (candidate) => {
|
|
15
|
+
const normalized = candidate.trim().replace(/^#/u, '').toLowerCase();
|
|
16
|
+
if (normalized)
|
|
17
|
+
aliases.add(normalized);
|
|
18
|
+
};
|
|
19
|
+
add(segment);
|
|
20
|
+
const [id, name] = segment.split('__');
|
|
21
|
+
if (id)
|
|
22
|
+
add(id);
|
|
23
|
+
if (name)
|
|
24
|
+
add(name);
|
|
25
|
+
return aliases;
|
|
26
|
+
};
|
|
27
|
+
const assertSlackChannelAllowed = (configuredChannel, targetChannel, context) => {
|
|
28
|
+
const configured = channelAliases(configuredChannel);
|
|
29
|
+
const target = channelAliases(targetChannel);
|
|
30
|
+
if (configured.size === 0) {
|
|
31
|
+
throw new Error(`Refusing Slack writeback for ${context}: configured factory-e2e channel is required`);
|
|
32
|
+
}
|
|
33
|
+
if (target.size === 0 || ![...target].some((alias) => configured.has(alias))) {
|
|
34
|
+
throw new Error(`Refusing Slack writeback for ${context}: target channel must match configured factory-e2e channel`);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const pathTs = (threadTs) => threadTs.replace(/\./g, '_');
|
|
38
|
+
const payloadTs = (threadId) => threadId.replace(/_/g, '.');
|
|
39
|
+
const rootClientId = (prefix, channelDir, text) => `${safePathSegment(prefix)}-${safePathSegment(channelIdFromDir(channelDir))}-${stableHash(text)}`;
|
|
40
|
+
const replyClientId = (prefix, threadId, text) => `${safePathSegment(prefix)}-reply-${safePathSegment(threadId)}-${stableHash(text)}`;
|
|
41
|
+
const confirmPath = async (mount, path) => {
|
|
42
|
+
const confirmation = await mount.confirmWrite(path, { timeoutMs: 90_000 });
|
|
43
|
+
if (confirmation !== 'acked') {
|
|
44
|
+
throw new Error(`Writeback not acked for ${path}: ${confirmation}`);
|
|
45
|
+
}
|
|
46
|
+
return (await mount.readFile(path)).content;
|
|
47
|
+
};
|
|
48
|
+
const slackTsFromContent = (content) => {
|
|
49
|
+
const payload = wrappedPayload(content);
|
|
50
|
+
const ts = stringValue(payload.ts) ?? stringValue(payload.thread_ts);
|
|
51
|
+
return ts && /^\d+\.\d+$/u.test(ts) ? ts : undefined;
|
|
52
|
+
};
|
|
53
|
+
export const MountSlackWriteback = (mount, slackCfg = {}) => {
|
|
54
|
+
const threads = new Map();
|
|
55
|
+
const prefix = slackCfg.clientIdPrefix ?? 'factory';
|
|
56
|
+
const assertCloudWriteback = () => {
|
|
57
|
+
if (mount.writebackTransport !== 'relayfile-cloud' && mount.writebackTransport !== 'test') {
|
|
58
|
+
throw new Error('Slack writeback requires RelayfileCloudMountClient cloud writeback transport');
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
return {
|
|
62
|
+
async postThread(root) {
|
|
63
|
+
assertCloudWriteback();
|
|
64
|
+
const channelDir = slackCfg.channelDir ?? root.channel ?? slackCfg.channel;
|
|
65
|
+
assertSlackChannelAllowed(slackCfg.channel, root.channel, 'postThread');
|
|
66
|
+
assertSlackChannelAllowed(slackCfg.channel, channelDir, 'postThread path');
|
|
67
|
+
const text = trimToLines(root.text, 3);
|
|
68
|
+
const channelId = channelIdFromDir(channelDir);
|
|
69
|
+
const clientId = rootClientId(prefix, channelDir, text);
|
|
70
|
+
const path = slackMessagePath(channelDir, clientId);
|
|
71
|
+
await mount.writeFile(path, { channelId, text }, { guarded: true });
|
|
72
|
+
const content = await confirmPath(mount, path);
|
|
73
|
+
const threadTs = slackTsFromContent(content) ?? clientId;
|
|
74
|
+
threads.set(threadTs, { channelDir, channelId, threadTs });
|
|
75
|
+
if (threadTs !== clientId) {
|
|
76
|
+
threads.set(clientId, { channelDir, channelId, threadTs });
|
|
77
|
+
}
|
|
78
|
+
return { threadId: threadTs };
|
|
79
|
+
},
|
|
80
|
+
async reply(threadId, text) {
|
|
81
|
+
assertCloudWriteback();
|
|
82
|
+
const fallbackChannelDir = slackCfg.channelDir ?? slackCfg.channel;
|
|
83
|
+
assertSlackChannelAllowed(slackCfg.channel, fallbackChannelDir, 'reply');
|
|
84
|
+
const ref = threads.get(threadId) ?? (fallbackChannelDir
|
|
85
|
+
? { channelDir: fallbackChannelDir, channelId: channelIdFromDir(fallbackChannelDir), threadTs: payloadTs(threadId) }
|
|
86
|
+
: undefined);
|
|
87
|
+
if (!ref) {
|
|
88
|
+
throw new Error(`Unknown Slack thread ${threadId}; provide channelDir in slack config`);
|
|
89
|
+
}
|
|
90
|
+
assertSlackChannelAllowed(slackCfg.channel, ref.channelDir, 'reply path');
|
|
91
|
+
const body = trimToLines(text, 3);
|
|
92
|
+
const clientId = replyClientId(prefix, threadId, body);
|
|
93
|
+
const path = slackReplyPath(ref.channelDir, pathTs(ref.threadTs), clientId);
|
|
94
|
+
await mount.writeFile(path, {
|
|
95
|
+
channelId: ref.channelId,
|
|
96
|
+
thread_ts: ref.threadTs,
|
|
97
|
+
text: body,
|
|
98
|
+
}, { guarded: true });
|
|
99
|
+
await confirmPath(mount, path);
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
const stringValue = (value) => typeof value === 'string' ? value : undefined;
|
|
104
|
+
//# sourceMappingURL=slack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/writeback/slack.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/factory",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "Agent factory — triage, dispatch, merge-gate for relayfile-driven workspaces",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -12,18 +12,63 @@
|
|
|
12
12
|
"url": "https://github.com/AgentWorkforce/factory/issues"
|
|
13
13
|
},
|
|
14
14
|
"type": "module",
|
|
15
|
-
"
|
|
16
|
-
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=20"
|
|
17
|
+
},
|
|
18
|
+
"main": "./dist/index.js",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
17
20
|
"files": [
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
+
"dist",
|
|
22
|
+
"bin/factory.mjs",
|
|
23
|
+
"scripts/factory-canary.sh",
|
|
24
|
+
"scripts/com.agentrelay.factory-canary.plist.example",
|
|
25
|
+
"package.json",
|
|
26
|
+
"README.md"
|
|
21
27
|
],
|
|
28
|
+
"bin": {
|
|
29
|
+
"factory": "bin/factory.mjs"
|
|
30
|
+
},
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"import": "./dist/index.js"
|
|
35
|
+
},
|
|
36
|
+
"./testing": {
|
|
37
|
+
"types": "./dist/testing/index.d.ts",
|
|
38
|
+
"import": "./dist/testing/index.js"
|
|
39
|
+
},
|
|
40
|
+
"./writeback": {
|
|
41
|
+
"types": "./dist/writeback/index.d.ts",
|
|
42
|
+
"import": "./dist/writeback/index.js"
|
|
43
|
+
},
|
|
44
|
+
"./node": {
|
|
45
|
+
"types": "./dist/node/factory.node.d.ts",
|
|
46
|
+
"import": "./dist/node/factory.node.js"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
22
49
|
"publishConfig": {
|
|
23
50
|
"access": "public"
|
|
24
51
|
},
|
|
25
52
|
"scripts": {
|
|
26
|
-
"build": "tsc -p tsconfig.build.json
|
|
27
|
-
"test": "
|
|
53
|
+
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
|
|
54
|
+
"test": "vitest run",
|
|
55
|
+
"factory-build": "factory-build/run-factory-build.sh"
|
|
56
|
+
},
|
|
57
|
+
"dependencies": {
|
|
58
|
+
"@agent-relay/cloud": "^8.7.2",
|
|
59
|
+
"@agent-relay/harness-driver": "^8.3.7",
|
|
60
|
+
"@agent-relay/integration-prompts": "^8.8.3",
|
|
61
|
+
"@relayfile/sdk": "^0.8.29",
|
|
62
|
+
"agent-relay": "^8.8.1",
|
|
63
|
+
"zod": "^3.25.76"
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@relayflows/cli": "^1.0.3",
|
|
67
|
+
"@relayflows/core": "^1.0.3",
|
|
68
|
+
"@types/node": "^22.10.2",
|
|
69
|
+
"esbuild": "^0.24.2",
|
|
70
|
+
"tsc-alias": "^1.8.17",
|
|
71
|
+
"typescript": "^5.7.0",
|
|
72
|
+
"vitest": "^4.1.8"
|
|
28
73
|
}
|
|
29
74
|
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
launchd template for the factory sync-fidelity canary (see factory-canary.sh).
|
|
4
|
+
|
|
5
|
+
Install (macOS):
|
|
6
|
+
1. Replace __FACTORY_WORKDIR__ with your factory deployment dir (the one with
|
|
7
|
+
factory.config.json), and __FACTORY_BIN__ with the path to factory.mjs
|
|
8
|
+
(e.g. node_modules/@agent-relay/factory/bin/factory.mjs). Set the issue key
|
|
9
|
+
and, optionally, FACTORY_CANARY_SLACK_WEBHOOK.
|
|
10
|
+
2. cp scripts/com.agentrelay.factory-canary.plist.example \
|
|
11
|
+
~/Library/LaunchAgents/com.agentrelay.factory-canary.plist
|
|
12
|
+
3. launchctl load ~/Library/LaunchAgents/com.agentrelay.factory-canary.plist
|
|
13
|
+
4. launchctl start com.agentrelay.factory-canary # run once now to verify
|
|
14
|
+
|
|
15
|
+
Runs every 6h (StartInterval 21600). Logs to <workdir>/.factory-canary.log.
|
|
16
|
+
Run from the deployment dir so the canary reuses the running relay broker.
|
|
17
|
+
-->
|
|
18
|
+
<plist version="1.0">
|
|
19
|
+
<dict>
|
|
20
|
+
<key>Label</key>
|
|
21
|
+
<string>com.agentrelay.factory-canary</string>
|
|
22
|
+
|
|
23
|
+
<key>ProgramArguments</key>
|
|
24
|
+
<array>
|
|
25
|
+
<string>/bin/bash</string>
|
|
26
|
+
<string>__FACTORY_WORKDIR__/scripts/factory-canary.sh</string>
|
|
27
|
+
</array>
|
|
28
|
+
|
|
29
|
+
<key>WorkingDirectory</key>
|
|
30
|
+
<string>__FACTORY_WORKDIR__</string>
|
|
31
|
+
|
|
32
|
+
<key>EnvironmentVariables</key>
|
|
33
|
+
<dict>
|
|
34
|
+
<key>FACTORY_CANARY_ISSUE</key>
|
|
35
|
+
<string>AR-305</string>
|
|
36
|
+
<key>FACTORY_WORKDIR</key>
|
|
37
|
+
<string>__FACTORY_WORKDIR__</string>
|
|
38
|
+
<key>FACTORY_BIN</key>
|
|
39
|
+
<string>__FACTORY_BIN__</string>
|
|
40
|
+
<key>FACTORY_CANARY_SLACK_WEBHOOK</key>
|
|
41
|
+
<string></string>
|
|
42
|
+
</dict>
|
|
43
|
+
|
|
44
|
+
<key>StartInterval</key>
|
|
45
|
+
<integer>21600</integer>
|
|
46
|
+
<key>RunAtLoad</key>
|
|
47
|
+
<true/>
|
|
48
|
+
<key>StandardOutPath</key>
|
|
49
|
+
<string>__FACTORY_WORKDIR__/.factory-canary.log</string>
|
|
50
|
+
<key>StandardErrorPath</key>
|
|
51
|
+
<string>__FACTORY_WORKDIR__/.factory-canary.log</string>
|
|
52
|
+
</dict>
|
|
53
|
+
</plist>
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# factory-canary.sh — scheduled sync-fidelity regression detector.
|
|
4
|
+
#
|
|
5
|
+
# Runs `factory canary <issue>` against the LIVE relayfile mount and asserts a
|
|
6
|
+
# known "Ready for Agent" issue is still classified dispatch-ready by the real
|
|
7
|
+
# triage path. If it ever flips to "skipped" (e.g. the Linear sync regresses to
|
|
8
|
+
# sparse records with no state.id), this exits non-zero and alerts — catching the
|
|
9
|
+
# regression before it silently blocks every factory dispatch.
|
|
10
|
+
#
|
|
11
|
+
# Run it on a schedule (cron/launchd) from your factory deployment directory —
|
|
12
|
+
# the one holding factory.config.json, where the relayfile mount + relay broker
|
|
13
|
+
# already live (so the canary reuses the running broker rather than spawning one).
|
|
14
|
+
# See scripts/com.agentrelay.factory-canary.plist.example for a launchd template.
|
|
15
|
+
#
|
|
16
|
+
# Config (env vars):
|
|
17
|
+
# FACTORY_CANARY_ISSUE Linear issue key to check (default: the first arg)
|
|
18
|
+
# FACTORY_WORKDIR deployment dir with factory.config.json (default: cwd)
|
|
19
|
+
# FACTORY_CONFIG config path, relative to FACTORY_WORKDIR (default: factory.config.json)
|
|
20
|
+
# FACTORY_BIN path to factory.mjs (default: this repo's bin/factory.mjs)
|
|
21
|
+
# FACTORY_BACKEND --backend value (default: internal)
|
|
22
|
+
# FACTORY_CANARY_TIMEOUT seconds before the canary is considered hung (default: 180)
|
|
23
|
+
# FACTORY_CANARY_SLACK_WEBHOOK optional Slack incoming-webhook URL for failure alerts
|
|
24
|
+
#
|
|
25
|
+
# Exit codes: 0 = dispatch-ready (healthy); 1 = NOT ready / error / hung.
|
|
26
|
+
|
|
27
|
+
set -uo pipefail
|
|
28
|
+
|
|
29
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
30
|
+
ISSUE="${FACTORY_CANARY_ISSUE:-${1:-}}"
|
|
31
|
+
WORKDIR="${FACTORY_WORKDIR:-$PWD}"
|
|
32
|
+
CONFIG="${FACTORY_CONFIG:-factory.config.json}"
|
|
33
|
+
BIN="${FACTORY_BIN:-$SCRIPT_DIR/../bin/factory.mjs}"
|
|
34
|
+
BACKEND="${FACTORY_BACKEND:-internal}"
|
|
35
|
+
TIMEOUT="${FACTORY_CANARY_TIMEOUT:-180}"
|
|
36
|
+
TS="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
37
|
+
|
|
38
|
+
if [[ -z "$ISSUE" ]]; then
|
|
39
|
+
echo "[$TS] factory-canary: no issue key (set FACTORY_CANARY_ISSUE or pass an arg)" >&2
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
42
|
+
if [[ ! -f "$BIN" ]]; then
|
|
43
|
+
echo "[$TS] factory-canary: factory bin not found at $BIN" >&2
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
46
|
+
cd "$WORKDIR" || { echo "[$TS] factory-canary: cannot cd to $WORKDIR" >&2; exit 1; }
|
|
47
|
+
|
|
48
|
+
# The canary runs the real dry-run triage path (no agents spawned) and prints a
|
|
49
|
+
# JSON verdict {ok,issue,status,reason}; exit code mirrors ok. A hung run
|
|
50
|
+
# (broker/mount wedge) is bounded by FACTORY_CANARY_TIMEOUT.
|
|
51
|
+
RUN=(node "$BIN" factory canary "$ISSUE" --config "$CONFIG" --backend "$BACKEND")
|
|
52
|
+
# A hung run (broker/mount wedge) MUST be bounded — an unbounded canary on a
|
|
53
|
+
# scheduler (launchd/cron) can wedge the slot forever and suppress later alerts.
|
|
54
|
+
# macOS has no `timeout` by default; coreutils ships it as `gtimeout`. If neither
|
|
55
|
+
# is present, fail closed rather than run without a deadline.
|
|
56
|
+
TIMEOUT_BIN=""
|
|
57
|
+
if command -v timeout >/dev/null 2>&1; then
|
|
58
|
+
TIMEOUT_BIN="timeout"
|
|
59
|
+
elif command -v gtimeout >/dev/null 2>&1; then
|
|
60
|
+
TIMEOUT_BIN="gtimeout"
|
|
61
|
+
fi
|
|
62
|
+
if [[ -z "$TIMEOUT_BIN" ]]; then
|
|
63
|
+
echo "[$TS] factory-canary: no timeout utility found (install coreutils for 'timeout'/'gtimeout'); refusing to run unbounded" >&2
|
|
64
|
+
exit 1
|
|
65
|
+
fi
|
|
66
|
+
OUT="$("$TIMEOUT_BIN" "$TIMEOUT" "${RUN[@]}" 2>/dev/null)"
|
|
67
|
+
CODE=$?
|
|
68
|
+
if [[ $CODE -eq 124 ]]; then
|
|
69
|
+
echo "[$TS] factory-canary: TIMED OUT after ${TIMEOUT}s (broker/mount may be wedged)" >&2
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
# The CLI prints a pretty-printed (multi-line) JSON verdict, so parse the whole
|
|
73
|
+
# output — not just the last line (which is only the closing `}`).
|
|
74
|
+
echo "[$TS] factory-canary $ISSUE -> exit $CODE"
|
|
75
|
+
[[ $CODE -eq 0 ]] && exit 0
|
|
76
|
+
|
|
77
|
+
REASON="$(printf '%s' "$OUT" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{try{const v=JSON.parse(s);console.log(`${v.status||"error"}: ${v.reason||"unknown"}`)}catch{console.log("unparseable verdict")}})' 2>/dev/null)"
|
|
78
|
+
MSG=":rotating_light: factory canary FAILED for ${ISSUE} — ${REASON}. Sync fidelity may have regressed (issue no longer dispatch-ready)."
|
|
79
|
+
echo "[$TS] $MSG" >&2
|
|
80
|
+
|
|
81
|
+
if [[ -n "${FACTORY_CANARY_SLACK_WEBHOOK:-}" ]]; then
|
|
82
|
+
curl -sS -m 15 -X POST -H 'Content-type: application/json' \
|
|
83
|
+
--data "$(node -e 'process.stdout.write(JSON.stringify({text:process.argv[1]}))' "$MSG")" \
|
|
84
|
+
"$FACTORY_CANARY_SLACK_WEBHOOK" >/dev/null 2>&1 \
|
|
85
|
+
&& echo "[$TS] factory-canary: posted Slack alert" >&2 \
|
|
86
|
+
|| echo "[$TS] factory-canary: Slack alert post failed" >&2
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
exit 1
|
package/index.d.ts
DELETED
package/index.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
// @agent-relay/factory — placeholder reservation.
|
|
2
|
-
//
|
|
3
|
-
// The real package (orchestrator, triage, github merge-gate, fleet, state,
|
|
4
|
-
// config) lands here via the p4 extraction of pear/packages/factory-sdk.
|
|
5
|
-
// Until then this stub reserves the npm name and lets the publish workflow
|
|
6
|
-
// + trusted-publisher setup land ahead of the real first release (0.1.0).
|
|
7
|
-
export {};
|