@usine/orchestrator 0.0.1 → 0.1.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 +123 -2
- package/dist/board/projection.d.ts +8 -0
- package/dist/board/projection.d.ts.map +1 -0
- package/dist/board/projection.js +151 -0
- package/dist/board/projection.js.map +1 -0
- package/dist/credentials.d.ts +12 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +62 -0
- package/dist/credentials.js.map +1 -0
- package/dist/exe-dev.d.ts +7 -0
- package/dist/exe-dev.d.ts.map +1 -0
- package/dist/exe-dev.js +16 -0
- package/dist/exe-dev.js.map +1 -0
- package/dist/idle-triggers.d.ts +6 -0
- package/dist/idle-triggers.d.ts.map +1 -0
- package/dist/idle-triggers.js +29 -0
- package/dist/idle-triggers.js.map +1 -0
- package/dist/index.d.ts +10 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -7
- package/dist/index.js.map +1 -1
- package/dist/local.d.ts +20 -0
- package/dist/local.d.ts.map +1 -0
- package/dist/local.js +46 -0
- package/dist/local.js.map +1 -0
- package/dist/operator/model.d.ts +280 -0
- package/dist/operator/model.d.ts.map +1 -0
- package/dist/operator/model.js +242 -0
- package/dist/operator/model.js.map +1 -0
- package/dist/operator/projection.d.ts +17 -0
- package/dist/operator/projection.d.ts.map +1 -0
- package/dist/operator/projection.js +130 -0
- package/dist/operator/projection.js.map +1 -0
- package/dist/operator/service.d.ts +36 -0
- package/dist/operator/service.d.ts.map +1 -0
- package/dist/operator/service.js +248 -0
- package/dist/operator/service.js.map +1 -0
- package/dist/orchestrator.d.ts +13 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +14 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/polling-triggers.d.ts +40 -0
- package/dist/polling-triggers.d.ts.map +1 -0
- package/dist/polling-triggers.js +394 -0
- package/dist/polling-triggers.js.map +1 -0
- package/dist/schedule-triggers.d.ts +65 -0
- package/dist/schedule-triggers.d.ts.map +1 -0
- package/dist/schedule-triggers.js +391 -0
- package/dist/schedule-triggers.js.map +1 -0
- package/dist/scheduler.d.ts +15 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +122 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/trigger-submission.d.ts +60 -0
- package/dist/trigger-submission.d.ts.map +1 -0
- package/dist/trigger-submission.js +105 -0
- package/dist/trigger-submission.js.map +1 -0
- package/package.json +28 -2
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import {} from "@usine/config";
|
|
2
|
+
import { Agent, AttemptChannel, Event, Item, Loop, Repository } from "@usine/core";
|
|
3
|
+
import { Submission } from "@usine/engine";
|
|
4
|
+
import { Effect, Match, Option, Result, Schema } from "effect";
|
|
5
|
+
/**
|
|
6
|
+
* The worker fetch target until per-loop revisions exist: `git fetch origin
|
|
7
|
+
* HEAD` resolves the remote's current default branch at prepare time.
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_BRANCH_REVISION = Repository.Revision.make("HEAD");
|
|
10
|
+
/** A loaded loop lost the roster member its authored agent name refers to. */
|
|
11
|
+
export class LoopAgentResolutionError extends Schema.TaggedError("@usine/orchestrator/LoopAgentResolutionError")("LoopAgentResolutionError", {
|
|
12
|
+
loop: Loop.LoopName,
|
|
13
|
+
agent: Agent.Name,
|
|
14
|
+
message: Schema.NonEmptyString,
|
|
15
|
+
}) {
|
|
16
|
+
}
|
|
17
|
+
/** Snapshot one authored loop's roster member and effective parent model. */
|
|
18
|
+
export const resolveTriggerLoop = Effect.fn("TriggerRouting.resolveLoop")(function* (instance, loop) {
|
|
19
|
+
yield* Effect.annotateCurrentSpan({ loop: loop.name, agent: loop.agent });
|
|
20
|
+
const roster = new Map(instance.agents.map((agent) => [agent.name, agent]));
|
|
21
|
+
const loaded = roster.get(loop.agent);
|
|
22
|
+
if (loaded === undefined) {
|
|
23
|
+
return yield* new LoopAgentResolutionError({
|
|
24
|
+
loop: loop.name,
|
|
25
|
+
agent: loop.agent,
|
|
26
|
+
message: `Loop ${loop.name} references missing Agent ${loop.agent}`,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const agent = new Agent.Agent({
|
|
30
|
+
name: loaded.name,
|
|
31
|
+
brain: new Agent.BrainSpec({
|
|
32
|
+
harness: loaded.harness,
|
|
33
|
+
model: loaded.model,
|
|
34
|
+
effort: loaded.effort,
|
|
35
|
+
}),
|
|
36
|
+
parentModel: loaded.parentModel,
|
|
37
|
+
persona: loaded.persona,
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
agent,
|
|
41
|
+
loop,
|
|
42
|
+
parentModel: Agent.resolveParentModel(agent, instance.config.settings.parentModel),
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
/**
|
|
46
|
+
* Snapshot the validated instance roster. `InstanceFolder.load` quarantines
|
|
47
|
+
* loops naming unknown Agents, so a miss here is config drift on a
|
|
48
|
+
* hand-assembled instance: the loop is skipped with a log every cycle while
|
|
49
|
+
* its siblings keep polling — the same isolation the schedule path applies.
|
|
50
|
+
*/
|
|
51
|
+
export const resolveTriggerLoops = Effect.fn("TriggerRouting.resolveLoops")(function* (instance) {
|
|
52
|
+
const resolved = [];
|
|
53
|
+
for (const loop of instance.loops) {
|
|
54
|
+
const result = yield* Effect.result(resolveTriggerLoop(instance, loop));
|
|
55
|
+
if (Result.isSuccess(result)) {
|
|
56
|
+
resolved.push(result.success);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
yield* Effect.logError("Loaded loop lost its rostered Agent; skipping the loop", {
|
|
60
|
+
loop: result.failure.loop,
|
|
61
|
+
agent: result.failure.agent,
|
|
62
|
+
errorTag: result.failure._tag,
|
|
63
|
+
message: result.failure.message,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return resolved;
|
|
67
|
+
});
|
|
68
|
+
/** The one routing contract shared by every trigger stream. */
|
|
69
|
+
export const triggerSubmission = (options) => new Submission({
|
|
70
|
+
event: new Event.Event({
|
|
71
|
+
id: Event.EventId.make(options.dedupKey),
|
|
72
|
+
dedupKey: options.dedupKey,
|
|
73
|
+
payload: options.payload,
|
|
74
|
+
receivedAt: options.receivedAt,
|
|
75
|
+
}),
|
|
76
|
+
itemKey: options.itemKey,
|
|
77
|
+
loop: options.loop.name,
|
|
78
|
+
step: options.loop.step,
|
|
79
|
+
approval: options.loop.approval,
|
|
80
|
+
repository: options.repository.name,
|
|
81
|
+
revision: DEFAULT_BRANCH_REVISION,
|
|
82
|
+
task: options.task,
|
|
83
|
+
agent: options.agent,
|
|
84
|
+
parentModel: options.parentModel,
|
|
85
|
+
});
|
|
86
|
+
/**
|
|
87
|
+
* What each submission outcome contributes to its log line: the run for a
|
|
88
|
+
* claim, the ignore reason for a superseded or revoked Event — never a
|
|
89
|
+
* sentinel value.
|
|
90
|
+
*/
|
|
91
|
+
export const submissionLogFields = (submission) => Match.valueTags(submission, {
|
|
92
|
+
Claimed: ({ runId }) => ({ runId }),
|
|
93
|
+
Queued: () => ({}),
|
|
94
|
+
Ignored: ({ reason }) => ({ reason }),
|
|
95
|
+
});
|
|
96
|
+
/** Safe structured context for a config-owned trigger failure. */
|
|
97
|
+
export const configFileErrorLogFields = (error) => Option.match(error.expression, {
|
|
98
|
+
onNone: () => ({ configFile: error.file, configStage: error.stage }),
|
|
99
|
+
onSome: (expression) => ({
|
|
100
|
+
configFile: error.file,
|
|
101
|
+
configStage: error.stage,
|
|
102
|
+
expression,
|
|
103
|
+
}),
|
|
104
|
+
});
|
|
105
|
+
//# sourceMappingURL=trigger-submission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-submission.js","sourceRoot":"","sources":["../src/trigger-submission.ts"],"names":[],"mappings":"AAAA,OAAO,EAKN,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,UAAU,EAAyB,MAAM,eAAe,CAAC;AAClE,OAAO,EAAiB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9E;;;GAGG;AACH,MAAM,uBAAuB,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAQjE,8EAA8E;AAC9E,MAAM,OAAO,wBAAyB,SAAQ,MAAM,CAAC,WAAW,CAC9D,8CAA8C,CAC/C,CAAC,0BAA0B,EAAE;IAC5B,IAAI,EAAE,IAAI,CAAC,QAAQ;IACnB,KAAK,EAAE,KAAK,CAAC,IAAI;IACjB,OAAO,EAAE,MAAM,CAAC,cAAc;CAC/B,CAAC;CAAG;AAEL,6EAA6E;AAC7E,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC,QAAQ,CAAC,EACjF,QAAwB,EACxB,IAAc;IAEd,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,CAAC,IAAI,wBAAwB,CAAC;YACzC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,QAAQ,IAAI,CAAC,IAAI,6BAA6B,IAAI,CAAC,KAAK,EAAE;SACpE,CAAC,CAAC;IACL,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,IAAI,KAAK,CAAC,SAAS,CAAC;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;QACF,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC;IACH,OAAO;QACL,KAAK;QACL,IAAI;QACJ,WAAW,EAAE,KAAK,CAAC,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;KAC5D,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC,6BAA6B,CAAC,CAAC,QAAQ,CAAC,EACnF,QAAwB;IAExB,MAAM,QAAQ,GAAwB,EAAE,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QACxE,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,wDAAwD,EAAE;YAC/E,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI;YACzB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK;YAC3B,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI;YAC7B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;SAChC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC,CAAC;AAcH,+DAA+D;AAC/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAiC,EAAc,EAAE,CACjF,IAAI,UAAU,CAAC;IACb,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC;QACrB,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC;IACF,OAAO,EAAE,OAAO,CAAC,OAAO;IACxB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;IACvB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;IACvB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ;IAC/B,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI;IACnC,QAAQ,EAAE,uBAAuB;IACjC,IAAI,EAAE,OAAO,CAAC,IAAI;IAClB,KAAK,EAAE,OAAO,CAAC,KAAK;IACpB,WAAW,EAAE,OAAO,CAAC,WAAW;CACjC,CAAC,CAAC;AAEL;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,UAA4B,EAA0B,EAAE,CAC1F,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE;IAC1B,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;IACnC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;IAClB,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;CACtC,CAAC,CAAC;AAEL,kEAAkE;AAClE,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAsB,EAAE,EAAE,CACjE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE;IAC7B,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IACpE,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACvB,UAAU,EAAE,KAAK,CAAC,IAAI;QACtB,WAAW,EAAE,KAAK,CAAC,KAAK;QACxB,UAAU;KACX,CAAC;CACH,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@usine/orchestrator",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "The embeddable usine composition: the full engine as an Effect layer, startable in-process.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -17,13 +17,34 @@
|
|
|
17
17
|
".": {
|
|
18
18
|
"types": "./dist/index.d.ts",
|
|
19
19
|
"default": "./dist/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./local": {
|
|
22
|
+
"types": "./dist/local.d.ts",
|
|
23
|
+
"default": "./dist/local.js"
|
|
24
|
+
},
|
|
25
|
+
"./exe-dev": {
|
|
26
|
+
"types": "./dist/exe-dev.d.ts",
|
|
27
|
+
"default": "./dist/exe-dev.js"
|
|
20
28
|
}
|
|
21
29
|
},
|
|
22
30
|
"publishConfig": {
|
|
23
31
|
"access": "public"
|
|
24
32
|
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@effect/platform-node": "4.0.0-rc.111",
|
|
35
|
+
"@usine/config": "0.1.0",
|
|
36
|
+
"@usine/core": "0.1.0",
|
|
37
|
+
"@usine/engine": "0.1.0",
|
|
38
|
+
"@usine/expression": "0.1.0",
|
|
39
|
+
"@usine/executor": "0.1.0",
|
|
40
|
+
"@usine/github": "0.1.0",
|
|
41
|
+
"@usine/run-host": "0.1.0"
|
|
42
|
+
},
|
|
25
43
|
"devDependencies": {
|
|
44
|
+
"@effect/vitest": "4.0.0-rc.111",
|
|
45
|
+
"effect": "4.0.0-rc.111",
|
|
26
46
|
"typescript": "7.0.2",
|
|
47
|
+
"vitest": "4.1.11",
|
|
27
48
|
"@usine/tsconfig": "0.0.0"
|
|
28
49
|
},
|
|
29
50
|
"peerDependencies": {
|
|
@@ -33,6 +54,11 @@
|
|
|
33
54
|
"node": ">=22"
|
|
34
55
|
},
|
|
35
56
|
"scripts": {
|
|
36
|
-
"build": "tsc -b"
|
|
57
|
+
"build": "tsc -b",
|
|
58
|
+
"check": "tsc -p tsconfig.check.json",
|
|
59
|
+
"test": "vitest run --exclude 'test/integration/**'",
|
|
60
|
+
"test:integration": "vitest run test/integration/polling-triggers.test.ts",
|
|
61
|
+
"test:integration:agent": "vitest run test/integration/agent-run.test.ts",
|
|
62
|
+
"test:exe-dev": "vitest run test/integration/exe-dev-worker.test.ts"
|
|
37
63
|
}
|
|
38
64
|
}
|