@aicalas/loopy 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/LICENSE +21 -0
- package/README.md +101 -0
- package/dist/adapters.d.ts +111 -0
- package/dist/adapters.d.ts.map +1 -0
- package/dist/adapters.js +27 -0
- package/dist/adapters.js.map +1 -0
- package/dist/attention/github.d.ts +57 -0
- package/dist/attention/github.d.ts.map +1 -0
- package/dist/attention/github.js +162 -0
- package/dist/attention/github.js.map +1 -0
- package/dist/authoring/attention-config.d.ts +16 -0
- package/dist/authoring/attention-config.d.ts.map +1 -0
- package/dist/authoring/attention-config.js +19 -0
- package/dist/authoring/attention-config.js.map +1 -0
- package/dist/authoring/channel-config.d.ts +16 -0
- package/dist/authoring/channel-config.d.ts.map +1 -0
- package/dist/authoring/channel-config.js +16 -0
- package/dist/authoring/channel-config.js.map +1 -0
- package/dist/authoring/define.d.ts +13 -0
- package/dist/authoring/define.d.ts.map +1 -0
- package/dist/authoring/define.js +13 -0
- package/dist/authoring/define.js.map +1 -0
- package/dist/authoring/effect-config.d.ts +16 -0
- package/dist/authoring/effect-config.d.ts.map +1 -0
- package/dist/authoring/effect-config.js +17 -0
- package/dist/authoring/effect-config.js.map +1 -0
- package/dist/authoring/harness-config.d.ts +30 -0
- package/dist/authoring/harness-config.d.ts.map +1 -0
- package/dist/authoring/harness-config.js +36 -0
- package/dist/authoring/harness-config.js.map +1 -0
- package/dist/authoring/index.d.ts +10 -0
- package/dist/authoring/index.d.ts.map +1 -0
- package/dist/authoring/index.js +9 -0
- package/dist/authoring/index.js.map +1 -0
- package/dist/authoring/schema.d.ts +9 -0
- package/dist/authoring/schema.d.ts.map +1 -0
- package/dist/authoring/schema.js +28 -0
- package/dist/authoring/schema.js.map +1 -0
- package/dist/authoring/types.d.ts +115 -0
- package/dist/authoring/types.d.ts.map +1 -0
- package/dist/authoring/types.js +2 -0
- package/dist/authoring/types.js.map +1 -0
- package/dist/authoring/watcher-config.d.ts +33 -0
- package/dist/authoring/watcher-config.d.ts.map +1 -0
- package/dist/authoring/watcher-config.js +61 -0
- package/dist/authoring/watcher-config.js.map +1 -0
- package/dist/build/discover.d.ts +34 -0
- package/dist/build/discover.d.ts.map +1 -0
- package/dist/build/discover.js +165 -0
- package/dist/build/discover.js.map +1 -0
- package/dist/build/identity.d.ts +9 -0
- package/dist/build/identity.d.ts.map +1 -0
- package/dist/build/identity.js +0 -0
- package/dist/build/identity.js.map +1 -0
- package/dist/channels/github.d.ts +14 -0
- package/dist/channels/github.d.ts.map +1 -0
- package/dist/channels/github.js +118 -0
- package/dist/channels/github.js.map +1 -0
- package/dist/channels/index.d.ts +2 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +2 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/cli-help.d.ts +23 -0
- package/dist/cli-help.d.ts.map +1 -0
- package/dist/cli-help.js +186 -0
- package/dist/cli-help.js.map +1 -0
- package/dist/cli.d.ts +37 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +385 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +71 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +426 -0
- package/dist/config.js.map +1 -0
- package/dist/core/calls.d.ts +67 -0
- package/dist/core/calls.d.ts.map +1 -0
- package/dist/core/calls.js +109 -0
- package/dist/core/calls.js.map +1 -0
- package/dist/core/identifiers.d.ts +24 -0
- package/dist/core/identifiers.d.ts.map +1 -0
- package/dist/core/identifiers.js +129 -0
- package/dist/core/identifiers.js.map +1 -0
- package/dist/core/prompt.d.ts +5 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +47 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/reconcile.d.ts +27 -0
- package/dist/core/reconcile.d.ts.map +1 -0
- package/dist/core/reconcile.js +36 -0
- package/dist/core/reconcile.js.map +1 -0
- package/dist/core/wire.d.ts +332 -0
- package/dist/core/wire.d.ts.map +1 -0
- package/dist/core/wire.js +543 -0
- package/dist/core/wire.js.map +1 -0
- package/dist/emitters/github.d.ts +15 -0
- package/dist/emitters/github.d.ts.map +1 -0
- package/dist/emitters/github.js +43 -0
- package/dist/emitters/github.js.map +1 -0
- package/dist/emitters/index.d.ts +2 -0
- package/dist/emitters/index.d.ts.map +1 -0
- package/dist/emitters/index.js +2 -0
- package/dist/emitters/index.js.map +1 -0
- package/dist/git.d.ts +17 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +122 -0
- package/dist/git.js.map +1 -0
- package/dist/github/client.d.ts +53 -0
- package/dist/github/client.d.ts.map +1 -0
- package/dist/github/client.js +169 -0
- package/dist/github/client.js.map +1 -0
- package/dist/github/trigger.d.ts +12 -0
- package/dist/github/trigger.d.ts.map +1 -0
- package/dist/github/trigger.js +21 -0
- package/dist/github/trigger.js.map +1 -0
- package/dist/github/writes.d.ts +4 -0
- package/dist/github/writes.d.ts.map +1 -0
- package/dist/github/writes.js +21 -0
- package/dist/github/writes.js.map +1 -0
- package/dist/harnesses/base.d.ts +41 -0
- package/dist/harnesses/base.d.ts.map +1 -0
- package/dist/harnesses/base.js +182 -0
- package/dist/harnesses/base.js.map +1 -0
- package/dist/harnesses/claude-executable.d.ts +42 -0
- package/dist/harnesses/claude-executable.d.ts.map +1 -0
- package/dist/harnesses/claude-executable.js +138 -0
- package/dist/harnesses/claude-executable.js.map +1 -0
- package/dist/harnesses/claude.d.ts +35 -0
- package/dist/harnesses/claude.d.ts.map +1 -0
- package/dist/harnesses/claude.js +160 -0
- package/dist/harnesses/claude.js.map +1 -0
- package/dist/harnesses/codex.d.ts +40 -0
- package/dist/harnesses/codex.d.ts.map +1 -0
- package/dist/harnesses/codex.js +118 -0
- package/dist/harnesses/codex.js.map +1 -0
- package/dist/harnesses/index.d.ts +2 -0
- package/dist/harnesses/index.d.ts.map +1 -0
- package/dist/harnesses/index.js +2 -0
- package/dist/harnesses/index.js.map +1 -0
- package/dist/harnesses/opencode.d.ts +33 -0
- package/dist/harnesses/opencode.d.ts.map +1 -0
- package/dist/harnesses/opencode.js +203 -0
- package/dist/harnesses/opencode.js.map +1 -0
- package/dist/identifiers.d.ts +26 -0
- package/dist/identifiers.d.ts.map +1 -0
- package/dist/identifiers.js +62 -0
- package/dist/identifiers.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/log.d.ts +10 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +44 -0
- package/dist/log.js.map +1 -0
- package/dist/settings.d.ts +43 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +128 -0
- package/dist/settings.js.map +1 -0
- package/dist/temporal/activities.d.ts +57 -0
- package/dist/temporal/activities.d.ts.map +1 -0
- package/dist/temporal/activities.js +366 -0
- package/dist/temporal/activities.js.map +1 -0
- package/dist/temporal/answers.d.ts +48 -0
- package/dist/temporal/answers.d.ts.map +1 -0
- package/dist/temporal/answers.js +78 -0
- package/dist/temporal/answers.js.map +1 -0
- package/dist/temporal/client.d.ts +13 -0
- package/dist/temporal/client.d.ts.map +1 -0
- package/dist/temporal/client.js +20 -0
- package/dist/temporal/client.js.map +1 -0
- package/dist/temporal/contracts.d.ts +19 -0
- package/dist/temporal/contracts.d.ts.map +1 -0
- package/dist/temporal/contracts.js +22 -0
- package/dist/temporal/contracts.js.map +1 -0
- package/dist/temporal/drain.d.ts +19 -0
- package/dist/temporal/drain.d.ts.map +1 -0
- package/dist/temporal/drain.js +109 -0
- package/dist/temporal/drain.js.map +1 -0
- package/dist/temporal/executions.d.ts +18 -0
- package/dist/temporal/executions.d.ts.map +1 -0
- package/dist/temporal/executions.js +15 -0
- package/dist/temporal/executions.js.map +1 -0
- package/dist/temporal/handle.d.ts +39 -0
- package/dist/temporal/handle.d.ts.map +1 -0
- package/dist/temporal/handle.js +95 -0
- package/dist/temporal/handle.js.map +1 -0
- package/dist/temporal/history.d.ts +75 -0
- package/dist/temporal/history.d.ts.map +1 -0
- package/dist/temporal/history.js +310 -0
- package/dist/temporal/history.js.map +1 -0
- package/dist/temporal/observe.d.ts +85 -0
- package/dist/temporal/observe.d.ts.map +1 -0
- package/dist/temporal/observe.js +110 -0
- package/dist/temporal/observe.js.map +1 -0
- package/dist/temporal/schedules.d.ts +26 -0
- package/dist/temporal/schedules.d.ts.map +1 -0
- package/dist/temporal/schedules.js +200 -0
- package/dist/temporal/schedules.js.map +1 -0
- package/dist/temporal/status.d.ts +63 -0
- package/dist/temporal/status.d.ts.map +1 -0
- package/dist/temporal/status.js +153 -0
- package/dist/temporal/status.js.map +1 -0
- package/dist/temporal/stuck.d.ts +58 -0
- package/dist/temporal/stuck.d.ts.map +1 -0
- package/dist/temporal/stuck.js +53 -0
- package/dist/temporal/stuck.js.map +1 -0
- package/dist/temporal/supervisor.d.ts +11 -0
- package/dist/temporal/supervisor.d.ts.map +1 -0
- package/dist/temporal/supervisor.js +506 -0
- package/dist/temporal/supervisor.js.map +1 -0
- package/dist/temporal/worker.d.ts +21 -0
- package/dist/temporal/worker.d.ts.map +1 -0
- package/dist/temporal/worker.js +82 -0
- package/dist/temporal/worker.js.map +1 -0
- package/dist/temporal/workflow-bundle.js +12742 -0
- package/dist/temporal/workflows.d.ts +9 -0
- package/dist/temporal/workflows.d.ts.map +1 -0
- package/dist/temporal/workflows.js +144 -0
- package/dist/temporal/workflows.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/dist/watchers/base.d.ts +4 -0
- package/dist/watchers/base.d.ts.map +1 -0
- package/dist/watchers/base.js +7 -0
- package/dist/watchers/base.js.map +1 -0
- package/dist/watchers/github/client.d.ts +52 -0
- package/dist/watchers/github/client.d.ts.map +1 -0
- package/dist/watchers/github/client.js +165 -0
- package/dist/watchers/github/client.js.map +1 -0
- package/dist/watchers/github/index.d.ts +19 -0
- package/dist/watchers/github/index.d.ts.map +1 -0
- package/dist/watchers/github/index.js +83 -0
- package/dist/watchers/github/index.js.map +1 -0
- package/dist/watchers/index.d.ts +2 -0
- package/dist/watchers/index.d.ts.map +1 -0
- package/dist/watchers/index.js +2 -0
- package/dist/watchers/index.js.map +1 -0
- package/dist/worker-lock.d.ts +11 -0
- package/dist/worker-lock.d.ts.map +1 -0
- package/dist/worker-lock.js +53 -0
- package/dist/worker-lock.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { parseChannelPollResult, parseInstanceState, } from "../core/wire.js";
|
|
2
|
+
import { instanceIdPrefix } from "../identifiers.js";
|
|
3
|
+
import { log } from "../log.js";
|
|
4
|
+
import { ANSWER_INSTANCE_UPDATE, INSTANCE_STATE_QUERY } from "./contracts.js";
|
|
5
|
+
/**
|
|
6
|
+
* Find this workflow's open instances parked on an ask, and the opaque correlation each awaiting
|
|
7
|
+
* call carries. Discovery is query-each-open-instance — list by built-in attributes, Query each —
|
|
8
|
+
* rather than a custom Search Attribute: cheap at the low-tens scale asks reach, and it reuses the
|
|
9
|
+
* `report_stuck` enumeration. An instance whose Query cannot be read (stuck, or transiently
|
|
10
|
+
* unavailable) is skipped this scan; the level-triggered tick re-observes it next time.
|
|
11
|
+
*/
|
|
12
|
+
export async function findAwaitingInstances(client, repository, workflow) {
|
|
13
|
+
const prefix = `${instanceIdPrefix(repository)}${workflow}:`;
|
|
14
|
+
const query = `ExecutionStatus="Running" AND WorkflowId STARTS_WITH ${JSON.stringify(prefix)}`;
|
|
15
|
+
const awaiting = [];
|
|
16
|
+
for await (const info of client.list({ query })) {
|
|
17
|
+
let state;
|
|
18
|
+
try {
|
|
19
|
+
state = parseInstanceState(await client.getHandle(info.workflowId).query(INSTANCE_STATE_QUERY));
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
log.warning(`ask poll: cannot read state for ${info.workflowId}: ${message(error)}`);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const calls = state.calls
|
|
26
|
+
.filter((call) => call.kind === "awaiting_answer")
|
|
27
|
+
.map((call) => ({
|
|
28
|
+
callId: call.callId,
|
|
29
|
+
channel: call.channel,
|
|
30
|
+
correlation: call.correlation,
|
|
31
|
+
}));
|
|
32
|
+
if (calls.length > 0)
|
|
33
|
+
awaiting.push({ workflowId: info.workflowId, calls });
|
|
34
|
+
}
|
|
35
|
+
return awaiting;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Poll each awaiting call's channel for a reply and deliver any answer as an `answer_instance`
|
|
39
|
+
* Update. Every instance and call is isolated in its own try/catch: a channel error, a rejected
|
|
40
|
+
* Update (the call was already answered), or a closed Execution fails that one item and the scan
|
|
41
|
+
* continues, returning partial results rather than re-driving the whole set. The Update ID is
|
|
42
|
+
* derived from the workflow and call so an Activity retry dedups against the server.
|
|
43
|
+
*/
|
|
44
|
+
export async function pollAnswers(client, channels, repository, workflow) {
|
|
45
|
+
const awaiting = await findAwaitingInstances(client, repository, workflow);
|
|
46
|
+
const answered = [];
|
|
47
|
+
for (const instance of awaiting) {
|
|
48
|
+
for (const call of instance.calls) {
|
|
49
|
+
try {
|
|
50
|
+
const spec = channels.get(call.channel);
|
|
51
|
+
if (spec === undefined) {
|
|
52
|
+
log.warning(`ask poll: unknown channel ${JSON.stringify(call.channel)} for ${instance.workflowId} ${call.callId}`);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const result = parseChannelPollResult(await spec.poll({ correlation: call.correlation }));
|
|
56
|
+
if (result.status !== "answered")
|
|
57
|
+
continue;
|
|
58
|
+
const answer = { callId: call.callId, answer: result.answer };
|
|
59
|
+
await client.getHandle(instance.workflowId).executeUpdate(ANSWER_INSTANCE_UPDATE, {
|
|
60
|
+
args: [answer],
|
|
61
|
+
updateId: answerUpdateId(instance.workflowId, call.callId),
|
|
62
|
+
});
|
|
63
|
+
answered.push(`${instance.workflowId}:${call.callId}`);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
log.warning(`ask poll: ${instance.workflowId} ${call.callId}: ${message(error)}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return answered;
|
|
71
|
+
}
|
|
72
|
+
function answerUpdateId(workflowId, callId) {
|
|
73
|
+
return `answer:${workflowId}:${callId}`;
|
|
74
|
+
}
|
|
75
|
+
function message(error) {
|
|
76
|
+
return error instanceof Error ? error.message : String(error);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=answers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answers.js","sourceRoot":"","sources":["../../src/temporal/answers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Client, type ClientOptions } from "@temporalio/client";
|
|
2
|
+
import { NativeConnection } from "@temporalio/worker";
|
|
3
|
+
import type { TemporalSettings } from "../settings.js";
|
|
4
|
+
type Connect = typeof NativeConnection.connect;
|
|
5
|
+
type ClientFactory = (options: ClientOptions) => Client;
|
|
6
|
+
export interface TemporalClientConnection {
|
|
7
|
+
readonly nativeConnection: NativeConnection;
|
|
8
|
+
readonly client: Client;
|
|
9
|
+
close(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare function connectClient(settings: TemporalSettings, connect?: Connect, createClient?: ClientFactory): Promise<TemporalClientConnection>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/temporal/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,KAAK,OAAO,GAAG,OAAO,gBAAgB,CAAC,OAAO,CAAC;AAC/C,KAAK,aAAa,GAAG,CAAC,OAAO,EAAE,aAAa,KAAK,MAAM,CAAC;AAExD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,gBAAgB,EAE1B,OAAO,GAAE,OAAyD,EAElE,YAAY,GAAE,aAAgD,GAC7D,OAAO,CAAC,wBAAwB,CAAC,CAYnC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Client } from "@temporalio/client";
|
|
2
|
+
import { NativeConnection } from "@temporalio/worker";
|
|
3
|
+
export async function connectClient(settings,
|
|
4
|
+
/* istanbul ignore next -- production native connection boundary */
|
|
5
|
+
connect = NativeConnection.connect.bind(NativeConnection),
|
|
6
|
+
/* istanbul ignore next -- production Client wiring; tests inject a deterministic factory */
|
|
7
|
+
createClient = (options) => new Client(options)) {
|
|
8
|
+
const nativeConnection = await connect({
|
|
9
|
+
address: settings.address,
|
|
10
|
+
tls: settings.tls,
|
|
11
|
+
...(settings.apiKey === undefined ? {} : { apiKey: settings.apiKey }),
|
|
12
|
+
});
|
|
13
|
+
const client = createClient({ connection: nativeConnection, namespace: settings.namespace });
|
|
14
|
+
return {
|
|
15
|
+
nativeConnection,
|
|
16
|
+
client,
|
|
17
|
+
close: () => nativeConnection.close(),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/temporal/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAsB,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAatD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAA0B;AAC1B,mEAAmE;AACnE,OAAO,GAAY,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAClE,4FAA4F;AAC5F,YAAY,GAAkB,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;IAE9D,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC;QACrC,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;KACtE,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IAC7F,OAAO;QACL,gBAAgB;QAChB,MAAM;QACN,KAAK,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE;KACtC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const RUN_AGENT_ACTIVITY_TYPE = "run_agent";
|
|
2
|
+
export declare const RUN_WATCHER_ACTIVITY_TYPE = "run_watcher";
|
|
3
|
+
export declare const EMIT_EFFECT_ACTIVITY_TYPE = "emit_effect";
|
|
4
|
+
export declare const CLEANUP_WORKSPACE_ACTIVITY_TYPE = "cleanup_workspace";
|
|
5
|
+
export declare const EMIT_ATTENTION_ACTIVITY_TYPE = "emit_attention";
|
|
6
|
+
export declare const OBSERVE_INSTANCES_ACTIVITY_TYPE = "observe_instances";
|
|
7
|
+
export declare const DELIVER_QUESTION_ACTIVITY_TYPE = "deliver_question";
|
|
8
|
+
export declare const POLL_WORKFLOW_TYPE = "PollWorkflow";
|
|
9
|
+
/** Every user workflow is its own Workflow Type, so status selects on this Workflow ID prefix. */
|
|
10
|
+
export declare const INSTANCE_ID_PREFIX = "loopy:instance:";
|
|
11
|
+
export declare const INSTANCE_STATE_QUERY = "loopy_instance_state";
|
|
12
|
+
export declare const RESOLVE_INSTANCE_UPDATE = "loopy_resolve";
|
|
13
|
+
export declare const ANSWER_INSTANCE_UPDATE = "loopy_answer_instance";
|
|
14
|
+
export declare const AGENT_CONFIGURATION_FAILURE_TYPE = "AgentActivityConfigurationError";
|
|
15
|
+
export declare const EFFECT_PERMANENT_FAILURE_TYPE = "EffectPermanentError";
|
|
16
|
+
export declare const WORKSPACE_PROVISIONING_FAILURE_TYPE = "WorkspaceProvisioningError";
|
|
17
|
+
export declare const UNEXPECTED_AGENT_FAILURE_TYPE = "UnexpectedAgentActivityError";
|
|
18
|
+
export declare const DEFINITIVE_AGENT_ACTIVITY_FAILURE_TYPES: ReadonlySet<string>;
|
|
19
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/temporal/contracts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,cAAc,CAAC;AACnD,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;AACvD,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;AACvD,eAAO,MAAM,+BAA+B,sBAAsB,CAAC;AACnE,eAAO,MAAM,4BAA4B,mBAAmB,CAAC;AAC7D,eAAO,MAAM,+BAA+B,sBAAsB,CAAC;AACnE,eAAO,MAAM,8BAA8B,qBAAqB,CAAC;AACjE,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD,kGAAkG;AAClG,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AAEpD,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAC3D,eAAO,MAAM,uBAAuB,kBAAkB,CAAC;AACvD,eAAO,MAAM,sBAAsB,0BAA0B,CAAC;AAE9D,eAAO,MAAM,gCAAgC,oCAAoC,CAAC;AAClF,eAAO,MAAM,6BAA6B,yBAAyB,CAAC;AACpE,eAAO,MAAM,mCAAmC,+BAA+B,CAAC;AAChF,eAAO,MAAM,6BAA6B,iCAAiC,CAAC;AAE5E,eAAO,MAAM,uCAAuC,EAAE,WAAW,CAAC,MAAM,CAGtE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const RUN_AGENT_ACTIVITY_TYPE = "run_agent";
|
|
2
|
+
export const RUN_WATCHER_ACTIVITY_TYPE = "run_watcher";
|
|
3
|
+
export const EMIT_EFFECT_ACTIVITY_TYPE = "emit_effect";
|
|
4
|
+
export const CLEANUP_WORKSPACE_ACTIVITY_TYPE = "cleanup_workspace";
|
|
5
|
+
export const EMIT_ATTENTION_ACTIVITY_TYPE = "emit_attention";
|
|
6
|
+
export const OBSERVE_INSTANCES_ACTIVITY_TYPE = "observe_instances";
|
|
7
|
+
export const DELIVER_QUESTION_ACTIVITY_TYPE = "deliver_question";
|
|
8
|
+
export const POLL_WORKFLOW_TYPE = "PollWorkflow";
|
|
9
|
+
/** Every user workflow is its own Workflow Type, so status selects on this Workflow ID prefix. */
|
|
10
|
+
export const INSTANCE_ID_PREFIX = "loopy:instance:";
|
|
11
|
+
export const INSTANCE_STATE_QUERY = "loopy_instance_state";
|
|
12
|
+
export const RESOLVE_INSTANCE_UPDATE = "loopy_resolve";
|
|
13
|
+
export const ANSWER_INSTANCE_UPDATE = "loopy_answer_instance";
|
|
14
|
+
export const AGENT_CONFIGURATION_FAILURE_TYPE = "AgentActivityConfigurationError";
|
|
15
|
+
export const EFFECT_PERMANENT_FAILURE_TYPE = "EffectPermanentError";
|
|
16
|
+
export const WORKSPACE_PROVISIONING_FAILURE_TYPE = "WorkspaceProvisioningError";
|
|
17
|
+
export const UNEXPECTED_AGENT_FAILURE_TYPE = "UnexpectedAgentActivityError";
|
|
18
|
+
export const DEFINITIVE_AGENT_ACTIVITY_FAILURE_TYPES = new Set([
|
|
19
|
+
AGENT_CONFIGURATION_FAILURE_TYPE,
|
|
20
|
+
WORKSPACE_PROVISIONING_FAILURE_TYPE,
|
|
21
|
+
]);
|
|
22
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/temporal/contracts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,WAAW,CAAC;AACnD,MAAM,CAAC,MAAM,yBAAyB,GAAG,aAAa,CAAC;AACvD,MAAM,CAAC,MAAM,yBAAyB,GAAG,aAAa,CAAC;AACvD,MAAM,CAAC,MAAM,+BAA+B,GAAG,mBAAmB,CAAC;AACnE,MAAM,CAAC,MAAM,4BAA4B,GAAG,gBAAgB,CAAC;AAC7D,MAAM,CAAC,MAAM,+BAA+B,GAAG,mBAAmB,CAAC;AACnE,MAAM,CAAC,MAAM,8BAA8B,GAAG,kBAAkB,CAAC;AACjE,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAEjD,kGAAkG;AAClG,MAAM,CAAC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAEpD,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAC3D,MAAM,CAAC,MAAM,uBAAuB,GAAG,eAAe,CAAC;AACvD,MAAM,CAAC,MAAM,sBAAsB,GAAG,uBAAuB,CAAC;AAE9D,MAAM,CAAC,MAAM,gCAAgC,GAAG,iCAAiC,CAAC;AAClF,MAAM,CAAC,MAAM,6BAA6B,GAAG,sBAAsB,CAAC;AACpE,MAAM,CAAC,MAAM,mCAAmC,GAAG,4BAA4B,CAAC;AAChF,MAAM,CAAC,MAAM,6BAA6B,GAAG,8BAA8B,CAAC;AAE5E,MAAM,CAAC,MAAM,uCAAuC,GAAwB,IAAI,GAAG,CAAC;IAClF,gCAAgC;IAChC,mCAAmC;CACpC,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Settings } from "../settings.js";
|
|
2
|
+
import { type VisibilityClient } from "./executions.js";
|
|
3
|
+
import { type ScheduleClientLike } from "./schedules.js";
|
|
4
|
+
export interface DrainHandle {
|
|
5
|
+
/** Resolves when the drain finishes, times out, or a second signal aborts the wait. */
|
|
6
|
+
readonly stopped: Promise<void>;
|
|
7
|
+
/** Detach the signal handlers. Required, because `stopped` may never settle. */
|
|
8
|
+
release(): void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Shut down by draining: pause polling so no new instance starts, then keep serving until the open
|
|
12
|
+
* Executions close. The drain has to run here, on the process that still holds the old bundle -
|
|
13
|
+
* once a new build is serving, the work being drained would finish under code it did not start on.
|
|
14
|
+
*
|
|
15
|
+
* On timeout the process exits with polling still paused, which is the safe half-state: no new work
|
|
16
|
+
* starts until an operator deliberately runs `loopy loop` again.
|
|
17
|
+
*/
|
|
18
|
+
export declare function drainOnSignal(settings: Settings, schedules: ScheduleClientLike, workflows: VisibilityClient): DrainHandle;
|
|
19
|
+
//# sourceMappingURL=drain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drain.d.ts","sourceRoot":"","sources":["../../src/temporal/drain.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAyC,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAkBhG,MAAM,WAAW,WAAW;IAC1B,uFAAuF;IACvF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,gFAAgF;IAChF,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,kBAAkB,EAC7B,SAAS,EAAE,gBAAgB,GAC1B,WAAW,CA2Bb"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { log } from "../log.js";
|
|
2
|
+
import { countOpenExecutions } from "./executions.js";
|
|
3
|
+
import { DRAIN_PAUSE_NOTE, pauseOwnedSchedules } from "./schedules.js";
|
|
4
|
+
const DRAIN_SIGNALS = ["SIGINT", "SIGTERM"];
|
|
5
|
+
const DRAIN_POLL_INTERVAL_MS = 2_000;
|
|
6
|
+
/**
|
|
7
|
+
* Zero has to hold across two reads. A poll completes as soon as it has started its children, and
|
|
8
|
+
* Visibility indexes those children asynchronously, so a single zero can land in the gap between
|
|
9
|
+
* the poll closing and its instance appearing - reporting drained while the instance it just
|
|
10
|
+
* started is still invisible.
|
|
11
|
+
*/
|
|
12
|
+
const DRAIN_CONFIRMATIONS = 2;
|
|
13
|
+
/**
|
|
14
|
+
* Enough retries to ride out a blip, few enough that a Visibility store which cannot answer at all
|
|
15
|
+
* - one without advanced Visibility, where `CountWorkflowExecutions` is unimplemented - costs
|
|
16
|
+
* seconds at shutdown rather than the whole drain timeout.
|
|
17
|
+
*/
|
|
18
|
+
const MAX_COUNT_FAILURES = 5;
|
|
19
|
+
/**
|
|
20
|
+
* Shut down by draining: pause polling so no new instance starts, then keep serving until the open
|
|
21
|
+
* Executions close. The drain has to run here, on the process that still holds the old bundle -
|
|
22
|
+
* once a new build is serving, the work being drained would finish under code it did not start on.
|
|
23
|
+
*
|
|
24
|
+
* On timeout the process exits with polling still paused, which is the safe half-state: no new work
|
|
25
|
+
* starts until an operator deliberately runs `loopy loop` again.
|
|
26
|
+
*/
|
|
27
|
+
export function drainOnSignal(settings, schedules, workflows) {
|
|
28
|
+
const stopped = Promise.withResolvers();
|
|
29
|
+
let draining = false;
|
|
30
|
+
const onSignal = () => {
|
|
31
|
+
if (draining) {
|
|
32
|
+
log.warning("second signal: stopping without finishing the drain");
|
|
33
|
+
stopped.resolve();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
draining = true;
|
|
37
|
+
void drain(settings, schedules, workflows).then(() => stopped.resolve(), (error) => {
|
|
38
|
+
log.error("drain failed; stopping anyway", error);
|
|
39
|
+
stopped.resolve();
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
for (const signal of DRAIN_SIGNALS)
|
|
43
|
+
process.on(signal, onSignal);
|
|
44
|
+
return {
|
|
45
|
+
stopped: stopped.promise,
|
|
46
|
+
// Not `stopped.promise.finally(…)`: a caller can stop waiting on a drain that never settles -
|
|
47
|
+
// a Worker rejecting ends the run - and the handlers would outlive it.
|
|
48
|
+
release: () => {
|
|
49
|
+
for (const signal of DRAIN_SIGNALS)
|
|
50
|
+
process.removeListener(signal, onSignal);
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async function drain(settings, schedules, workflows) {
|
|
55
|
+
if (settings.drainTimeoutSeconds === 0)
|
|
56
|
+
return;
|
|
57
|
+
const paused = await pauseOwnedSchedules(schedules, settings.repository, DRAIN_PAUSE_NOTE);
|
|
58
|
+
log.info(`draining: paused ${paused.length} Schedule(s)`);
|
|
59
|
+
const deadline = Date.now() + settings.drainTimeoutSeconds * 1_000;
|
|
60
|
+
let confirmations = 0;
|
|
61
|
+
let failures = 0;
|
|
62
|
+
let last = "unknown";
|
|
63
|
+
for (;;) {
|
|
64
|
+
let open;
|
|
65
|
+
try {
|
|
66
|
+
open = await countOpenExecutions(workflows, settings.repository);
|
|
67
|
+
failures = 0;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
// Never abandon the drain on one unreadable answer. Visibility is the only thing that can say
|
|
71
|
+
// the deployment is empty, so a blip has to be retried rather than treated as a verdict - and
|
|
72
|
+
// stopping early is precisely the outcome the drain exists to avoid.
|
|
73
|
+
failures += 1;
|
|
74
|
+
confirmations = 0;
|
|
75
|
+
if (failures >= MAX_COUNT_FAILURES) {
|
|
76
|
+
// A store that cannot answer at all is not a blip, and retrying it to the deadline would
|
|
77
|
+
// make every shutdown wait the full timeout to learn what it knew in the first ten seconds.
|
|
78
|
+
log.warning(`drain giving up: open Executions could not be counted ${failures} times in a row; polling stays paused so no new work starts`, errorMessage(error));
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
log.info("draining: could not count open Executions, retrying", errorMessage(error));
|
|
82
|
+
}
|
|
83
|
+
if (open === 0) {
|
|
84
|
+
confirmations += 1;
|
|
85
|
+
if (confirmations >= DRAIN_CONFIRMATIONS) {
|
|
86
|
+
log.info("drained: nothing open, polling stays paused until the next start");
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else if (open !== undefined) {
|
|
91
|
+
confirmations = 0;
|
|
92
|
+
}
|
|
93
|
+
if (open !== undefined)
|
|
94
|
+
last = `${open}`;
|
|
95
|
+
if (Date.now() >= deadline) {
|
|
96
|
+
log.warning(`drain timed out with ${last} Execution(s) still open; polling stays paused so no new work starts`);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (open !== 0)
|
|
100
|
+
log.info(`draining: ${last} Execution(s) still open`);
|
|
101
|
+
await new Promise((resolve) => {
|
|
102
|
+
setTimeout(resolve, DRAIN_POLL_INTERVAL_MS).unref();
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function errorMessage(error) {
|
|
107
|
+
return error instanceof Error ? error.message : String(error);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=drain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drain.js","sourceRoot":"","sources":["../../src/temporal/drain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Visibility surface these readers need. A real `WorkflowClient` is assignable to it - the
|
|
3
|
+
* assignment in `cli.ts` is what proves that - while a test double only has to supply what is
|
|
4
|
+
* declared here, rather than construct the SDK's response classes.
|
|
5
|
+
*/
|
|
6
|
+
export interface VisibilityClient {
|
|
7
|
+
count(query: string): Promise<{
|
|
8
|
+
count: number;
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Count everything this deployment is serving: its instances, and the control runs its own
|
|
13
|
+
* Schedules start. Pausing a Schedule does not stop a `PollWorkflow` already running, so a drain
|
|
14
|
+
* that waited only on instances could exit while a poll is mid-watcher and leave it to resume under
|
|
15
|
+
* the next build - the hazard the drain exists to prevent, applied to loopy's own control flow.
|
|
16
|
+
*/
|
|
17
|
+
export declare function countOpenExecutions(client: VisibilityClient, repository: string): Promise<number>;
|
|
18
|
+
//# sourceMappingURL=executions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executions.d.ts","sourceRoot":"","sources":["../../src/temporal/executions.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAMjB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ownedWorkflowIdPrefixes } from "../identifiers.js";
|
|
2
|
+
/**
|
|
3
|
+
* Count everything this deployment is serving: its instances, and the control runs its own
|
|
4
|
+
* Schedules start. Pausing a Schedule does not stop a `PollWorkflow` already running, so a drain
|
|
5
|
+
* that waited only on instances could exit while a poll is mid-watcher and leave it to resume under
|
|
6
|
+
* the next build - the hazard the drain exists to prevent, applied to loopy's own control flow.
|
|
7
|
+
*/
|
|
8
|
+
export async function countOpenExecutions(client, repository) {
|
|
9
|
+
const owned = ownedWorkflowIdPrefixes(repository)
|
|
10
|
+
.map((prefix) => `WorkflowId STARTS_WITH ${JSON.stringify(prefix)}`)
|
|
11
|
+
.join(" OR ");
|
|
12
|
+
// `count` is one RPC returning the number; listing would paginate every open Execution per tick.
|
|
13
|
+
return (await client.count(`ExecutionStatus="Running" AND (${owned})`)).count;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=executions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executions.js","sourceRoot":"","sources":["../../src/temporal/executions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAW5D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAwB,EACxB,UAAkB;IAElB,MAAM,KAAK,GAAG,uBAAuB,CAAC,UAAU,CAAC;SAC9C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;SACnE,IAAI,CAAC,MAAM,CAAC,CAAC;IAChB,iGAAiG;IACjG,OAAO,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,kCAAkC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { AgentHandle, AgentRequest, InferOutput, OutputSchema } from "../authoring/types.js";
|
|
2
|
+
import type { AgentCallResult, CallState, HarnessConfig, JsonObject, PromptPart } from "../core/wire.js";
|
|
3
|
+
export declare const DEFAULT_AGENT_TIMEOUT_MS = 1800000;
|
|
4
|
+
export interface AgentInvocation {
|
|
5
|
+
handleId: string;
|
|
6
|
+
callId: string;
|
|
7
|
+
ordinal: number;
|
|
8
|
+
invocation: number;
|
|
9
|
+
harness: HarnessConfig;
|
|
10
|
+
promptParts: PromptPart[];
|
|
11
|
+
schema: JsonObject;
|
|
12
|
+
timeoutMs: number;
|
|
13
|
+
resumeSessionId: string | undefined;
|
|
14
|
+
}
|
|
15
|
+
export interface AgentCallHost {
|
|
16
|
+
halt(reason: string): never;
|
|
17
|
+
consumeCall(): void;
|
|
18
|
+
setCall(state: CallState): void;
|
|
19
|
+
awaitResolution(callId: string): Promise<void>;
|
|
20
|
+
takeResolution(callId: string): "retry" | "halt";
|
|
21
|
+
/** Surface a parked call through the attention port; never throws on emission failure. */
|
|
22
|
+
reportParked(callId: string, reason: string): Promise<void>;
|
|
23
|
+
invokeAgent(invocation: AgentInvocation): Promise<AgentCallResult>;
|
|
24
|
+
}
|
|
25
|
+
export declare class SupervisedAgentHandle implements AgentHandle {
|
|
26
|
+
readonly id: string;
|
|
27
|
+
private readonly host;
|
|
28
|
+
private readonly harness;
|
|
29
|
+
private ordinal;
|
|
30
|
+
private sessionId;
|
|
31
|
+
private busy;
|
|
32
|
+
constructor(host: AgentCallHost, id: string, harness: HarnessConfig);
|
|
33
|
+
run<S extends OutputSchema>(request: AgentRequest<S>): Promise<InferOutput<S>>;
|
|
34
|
+
private invoke;
|
|
35
|
+
private describe;
|
|
36
|
+
private engineTask;
|
|
37
|
+
private settle;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=handle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../../src/temporal/handle.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAQlG,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACT,aAAa,EACb,UAAU,EACV,UAAU,EACX,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,wBAAwB,UAAY,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAC5B,WAAW,IAAI,IAAI,CAAC;IACpB,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAChC,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACjD,0FAA0F;IAC1F,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,WAAW,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CACpE;AAED,qBAAa,qBAAsB,YAAW,WAAW;IACvD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,IAAI,CAAS;IAErB,YAAY,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAIlE;IAED,GAAG,CAAC,CAAC,SAAS,YAAY,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAE7E;YAEa,MAAM;IAWpB,OAAO,CAAC,QAAQ;YAiBF,UAAU;IAkCxB,OAAO,CAAC,MAAM;CAoBf"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { msToNumber } from "@temporalio/common";
|
|
2
|
+
import { toJsonSchema } from "../authoring/schema.js";
|
|
3
|
+
import { agentDisposition, callAddress, concurrentCallReason, reconciliationHaltReason, } from "../core/calls.js";
|
|
4
|
+
export const DEFAULT_AGENT_TIMEOUT_MS = 1_800_000;
|
|
5
|
+
export class SupervisedAgentHandle {
|
|
6
|
+
id;
|
|
7
|
+
host;
|
|
8
|
+
harness;
|
|
9
|
+
ordinal = 0;
|
|
10
|
+
sessionId;
|
|
11
|
+
busy = false;
|
|
12
|
+
constructor(host, id, harness) {
|
|
13
|
+
this.host = host;
|
|
14
|
+
this.id = id;
|
|
15
|
+
this.harness = harness;
|
|
16
|
+
}
|
|
17
|
+
run(request) {
|
|
18
|
+
return this.invoke(request);
|
|
19
|
+
}
|
|
20
|
+
async invoke(request) {
|
|
21
|
+
if (this.busy)
|
|
22
|
+
throw new Error(concurrentCallReason(this.id));
|
|
23
|
+
this.busy = true;
|
|
24
|
+
try {
|
|
25
|
+
this.host.consumeCall();
|
|
26
|
+
return await this.engineTask(this.describe(request));
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
this.busy = false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
describe(request) {
|
|
33
|
+
this.ordinal += 1;
|
|
34
|
+
if (request.prompt.length === 0)
|
|
35
|
+
throw new Error("prompt must have at least one part");
|
|
36
|
+
return {
|
|
37
|
+
handleId: this.id,
|
|
38
|
+
callId: callAddress(this.id, this.ordinal),
|
|
39
|
+
ordinal: this.ordinal,
|
|
40
|
+
harness: this.harness,
|
|
41
|
+
promptParts: request.prompt.map((part) => (typeof part === "string" ? part : { ...part })),
|
|
42
|
+
schema: toJsonSchema(request.output),
|
|
43
|
+
timeoutMs: request.timeout === undefined ? DEFAULT_AGENT_TIMEOUT_MS : msToNumber(request.timeout),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
async engineTask(detail) {
|
|
47
|
+
const { callId, handleId } = detail;
|
|
48
|
+
for (let invocation = 1;; invocation += 1) {
|
|
49
|
+
this.host.setCall({ kind: "running", callId, operation: "agent", handleId, invocation });
|
|
50
|
+
const result = await this.host.invokeAgent({
|
|
51
|
+
...detail,
|
|
52
|
+
invocation,
|
|
53
|
+
resumeSessionId: this.sessionId,
|
|
54
|
+
});
|
|
55
|
+
if (result.status !== "indeterminate" && result.sessionId !== undefined) {
|
|
56
|
+
this.sessionId = result.sessionId;
|
|
57
|
+
}
|
|
58
|
+
const disposition = agentDisposition(result);
|
|
59
|
+
if (disposition.kind !== "indeterminate")
|
|
60
|
+
return this.settle(detail, disposition);
|
|
61
|
+
this.host.setCall({
|
|
62
|
+
kind: "parked",
|
|
63
|
+
callId,
|
|
64
|
+
operation: "agent",
|
|
65
|
+
handleId,
|
|
66
|
+
invocation,
|
|
67
|
+
reason: disposition.reason,
|
|
68
|
+
});
|
|
69
|
+
await this.host.reportParked(callId, disposition.reason);
|
|
70
|
+
await this.host.awaitResolution(callId);
|
|
71
|
+
if (this.host.takeResolution(callId) === "halt") {
|
|
72
|
+
this.host.halt(reconciliationHaltReason(callId));
|
|
73
|
+
}
|
|
74
|
+
// The lost invocation may hold a session identifier Temporal never received.
|
|
75
|
+
this.sessionId = undefined;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
settle(detail, disposition) {
|
|
79
|
+
const { callId, handleId } = detail;
|
|
80
|
+
if (disposition.kind === "returned") {
|
|
81
|
+
this.host.setCall({
|
|
82
|
+
kind: "returned",
|
|
83
|
+
callId,
|
|
84
|
+
operation: "agent",
|
|
85
|
+
handleId,
|
|
86
|
+
...(disposition.sessionId === undefined ? {} : { sessionId: disposition.sessionId }),
|
|
87
|
+
});
|
|
88
|
+
return disposition.value;
|
|
89
|
+
}
|
|
90
|
+
const reason = disposition.kind === "deadline_exceeded" ? "agent-deadline-exceeded" : disposition.reason;
|
|
91
|
+
this.host.setCall({ kind: "failed", callId, operation: "agent", handleId, reason });
|
|
92
|
+
this.host.halt(`agent-failed:${callId}:${reason}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=handle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle.js","sourceRoot":"","sources":["../../src/temporal/handle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { type JsonValue } from "../core/wire.js";
|
|
2
|
+
/**
|
|
3
|
+
* One rendered Event History line. Call addresses ride on `activityId`
|
|
4
|
+
* (`agent:<handle>:call:<n>:invocation:<i>`, `effect:<id>:call:1`), so calls and attempts need no
|
|
5
|
+
* fields of their own beyond `attempt`.
|
|
6
|
+
*/
|
|
7
|
+
export interface HistoryEventView {
|
|
8
|
+
eventId?: number;
|
|
9
|
+
time?: string;
|
|
10
|
+
event: string;
|
|
11
|
+
workflowType?: string;
|
|
12
|
+
attempt?: number;
|
|
13
|
+
/** The PollWorkflow Execution that started this instance. */
|
|
14
|
+
parent?: WorkflowLink;
|
|
15
|
+
/** An instance this poll started, tried to start, or observed closing. */
|
|
16
|
+
child?: WorkflowLink;
|
|
17
|
+
activityId?: string;
|
|
18
|
+
activityType?: string;
|
|
19
|
+
/** Ties an activity outcome back to its `activity-task-scheduled` line. */
|
|
20
|
+
scheduledEventId?: number;
|
|
21
|
+
signal?: string;
|
|
22
|
+
update?: UpdateView;
|
|
23
|
+
cause?: string;
|
|
24
|
+
reason?: string;
|
|
25
|
+
newRunId?: string;
|
|
26
|
+
input?: JsonValue;
|
|
27
|
+
result?: JsonValue;
|
|
28
|
+
details?: JsonValue;
|
|
29
|
+
failure?: FailureView;
|
|
30
|
+
note?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface WorkflowLink {
|
|
33
|
+
workflowId?: string;
|
|
34
|
+
runId?: string;
|
|
35
|
+
workflowType?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface FailureView {
|
|
38
|
+
type?: string;
|
|
39
|
+
message?: string;
|
|
40
|
+
stackTrace?: string;
|
|
41
|
+
cause?: FailureView;
|
|
42
|
+
}
|
|
43
|
+
export interface UpdateView {
|
|
44
|
+
id?: string;
|
|
45
|
+
name?: string;
|
|
46
|
+
}
|
|
47
|
+
interface LongValue {
|
|
48
|
+
toNumber(): number;
|
|
49
|
+
}
|
|
50
|
+
type IntegerValue = number | string | LongValue;
|
|
51
|
+
interface TimestampValue {
|
|
52
|
+
seconds?: IntegerValue | null;
|
|
53
|
+
nanos?: number | null;
|
|
54
|
+
}
|
|
55
|
+
/** The subset of a Temporal `HistoryEvent` that audit rendering reads. */
|
|
56
|
+
export interface HistoryEvent {
|
|
57
|
+
eventId?: IntegerValue | null;
|
|
58
|
+
eventTime?: TimestampValue | null;
|
|
59
|
+
/** Exactly one `<type>EventAttributes` field is set; it is located by name. */
|
|
60
|
+
[attribute: string]: unknown;
|
|
61
|
+
}
|
|
62
|
+
export interface ExecutionHistory {
|
|
63
|
+
events?: HistoryEvent[] | null;
|
|
64
|
+
}
|
|
65
|
+
export interface HistoryWorkflowHandle {
|
|
66
|
+
fetchHistory(): Promise<ExecutionHistory>;
|
|
67
|
+
}
|
|
68
|
+
export interface HistoryWorkflowClient {
|
|
69
|
+
getHandle(workflowId: string): HistoryWorkflowHandle;
|
|
70
|
+
}
|
|
71
|
+
/** Render the Event History of the latest Run behind one Workflow ID. */
|
|
72
|
+
export declare function fetchExecutionHistory(client: HistoryWorkflowClient, workflowId: string): Promise<HistoryEventView[]>;
|
|
73
|
+
export declare function renderHistory(history: ExecutionHistory): HistoryEventView[];
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/temporal/history.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAW9D;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,SAAS;IACjB,QAAQ,IAAI,MAAM,CAAC;CACpB;AACD,KAAK,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhD,UAAU,cAAc;IACtB,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAmBD,0EAA0E;AAC1E,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,SAAS,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,+EAA+E;IAC/E,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,qBAAqB,CAAC;CACtD;AAED,yEAAyE;AACzE,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,qBAAqB,EAC7B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAE7B;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,gBAAgB,EAAE,CAO3E"}
|