agent-tempo 1.2.0 → 1.4.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/CLAUDE.md +253 -219
- package/LICENSE +21 -21
- package/README.md +293 -289
- package/assets/icon-dark.svg +9 -9
- package/assets/icon.svg +9 -9
- package/assets/logo-dark.svg +11 -11
- package/assets/logo-light.svg +11 -11
- package/dashboard/README.md +91 -91
- package/dashboard/dist/assets/{index-D6Xyje_n.js → index-jmYe6rmS.js} +2 -2
- package/dashboard/dist/assets/index-jmYe6rmS.js.map +1 -0
- package/dashboard/dist/index.html +20 -20
- package/dashboard/package.json +47 -47
- package/dist/activities/outbox.d.ts +30 -1
- package/dist/activities/outbox.js +96 -3
- package/dist/adapters/base.js +5 -0
- package/dist/adapters/copilot/adapter.js +12 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/adapters/index.js +7 -0
- package/dist/adapters/pi/adapter.d.ts +2 -0
- package/dist/adapters/pi/adapter.js +43 -0
- package/dist/adapters/pi/index.d.ts +16 -0
- package/dist/adapters/pi/index.js +10 -0
- package/dist/cli/global-wrapper.d.ts +19 -0
- package/dist/cli/global-wrapper.js +169 -0
- package/dist/cli/help-text.js +97 -97
- package/dist/cli/startup.js +11 -0
- package/dist/cli/upgrade-command.js +81 -81
- package/dist/cli.js +12 -0
- package/dist/client/core.js +9 -2
- package/dist/client/interface.d.ts +6 -0
- package/dist/config.d.ts +79 -0
- package/dist/config.js +74 -0
- package/dist/daemon.js +37 -1
- package/dist/http/aggregate.d.ts +22 -1
- package/dist/http/aggregate.js +41 -0
- package/dist/http/auth.d.ts +94 -8
- package/dist/http/auth.js +93 -9
- package/dist/http/body.d.ts +4 -1
- package/dist/http/body.js +6 -3
- package/dist/http/event-bus.js +1 -0
- package/dist/http/event-types.d.ts +34 -2
- package/dist/http/event-types.js +1 -0
- package/dist/http/gate-audit.d.ts +12 -0
- package/dist/http/gate-audit.js +95 -0
- package/dist/http/gate-registry.d.ts +167 -0
- package/dist/http/gate-registry.js +163 -0
- package/dist/http/gate-routes.d.ts +48 -0
- package/dist/http/gate-routes.js +102 -0
- package/dist/http/ingest-registry.d.ts +30 -0
- package/dist/http/ingest-registry.js +108 -0
- package/dist/http/inner-loop-routes.d.ts +66 -0
- package/dist/http/inner-loop-routes.js +182 -0
- package/dist/http/inner-loop.d.ts +92 -0
- package/dist/http/inner-loop.js +155 -0
- package/dist/http/server.d.ts +38 -3
- package/dist/http/server.js +211 -6
- package/dist/http/snapshot.d.ts +6 -0
- package/dist/http/snapshot.js +6 -0
- package/dist/pi/cue-pump.d.ts +61 -0
- package/dist/pi/cue-pump.js +95 -0
- package/dist/pi/extension.d.ts +45 -0
- package/dist/pi/extension.js +407 -0
- package/dist/pi/gate-client.d.ts +54 -0
- package/dist/pi/gate-client.js +136 -0
- package/dist/pi/headless.d.ts +85 -0
- package/dist/pi/headless.js +224 -0
- package/dist/pi/index.d.ts +28 -0
- package/dist/pi/index.js +43 -0
- package/dist/pi/inner-loop-client.d.ts +67 -0
- package/dist/pi/inner-loop-client.js +164 -0
- package/dist/pi/inner-loop-publisher.d.ts +187 -0
- package/dist/pi/inner-loop-publisher.js +236 -0
- package/dist/pi/lazy-proxy.d.ts +37 -0
- package/dist/pi/lazy-proxy.js +55 -0
- package/dist/pi/mission-control/actions.d.ts +48 -0
- package/dist/pi/mission-control/actions.js +98 -0
- package/dist/pi/mission-control/board.d.ts +53 -0
- package/dist/pi/mission-control/board.js +104 -0
- package/dist/pi/mission-control/extension.d.ts +44 -0
- package/dist/pi/mission-control/extension.js +251 -0
- package/dist/pi/mission-control/index.d.ts +15 -0
- package/dist/pi/mission-control/index.js +32 -0
- package/dist/pi/mission-control/inner-tail.d.ts +48 -0
- package/dist/pi/mission-control/inner-tail.js +76 -0
- package/dist/pi/mission-control/pi-ui.d.ts +43 -0
- package/dist/pi/mission-control/pi-ui.js +10 -0
- package/dist/pi/mission-control/render.d.ts +6 -0
- package/dist/pi/mission-control/render.js +95 -0
- package/dist/pi/phase-driver.d.ts +74 -0
- package/dist/pi/phase-driver.js +122 -0
- package/dist/pi/pi-types.d.ts +208 -0
- package/dist/pi/pi-types.js +21 -0
- package/dist/pi/probe.d.ts +80 -0
- package/dist/pi/probe.js +154 -0
- package/dist/pi/render-tools.d.ts +17 -0
- package/dist/pi/render-tools.js +51 -0
- package/dist/pi/reset-pump.d.ts +47 -0
- package/dist/pi/reset-pump.js +85 -0
- package/dist/pi/tool-capability.d.ts +60 -0
- package/dist/pi/tool-capability.js +156 -0
- package/dist/pi/workflow-client.d.ts +158 -0
- package/dist/pi/workflow-client.js +289 -0
- package/dist/pi/zod-to-typebox.d.ts +74 -0
- package/dist/pi/zod-to-typebox.js +191 -0
- package/dist/scripts/verify-daemon-isolation-guard.js +24 -24
- package/dist/server-tools.d.ts +2 -0
- package/dist/server-tools.js +50 -46
- package/dist/server.js +4 -0
- package/dist/spawn.d.ts +55 -0
- package/dist/spawn.js +84 -12
- package/dist/tools/agent-types.d.ts +2 -2
- package/dist/tools/agent-types.js +22 -17
- package/dist/tools/attachment-info.d.ts +2 -2
- package/dist/tools/attachment-info.js +38 -33
- package/dist/tools/broadcast.d.ts +2 -2
- package/dist/tools/broadcast.js +69 -64
- package/dist/tools/cancel-stage.d.ts +2 -2
- package/dist/tools/cancel-stage.js +20 -15
- package/dist/tools/clear-state.d.ts +2 -2
- package/dist/tools/clear-state.js +25 -20
- package/dist/tools/coat-check-evict.d.ts +2 -2
- package/dist/tools/coat-check-evict.js +30 -25
- package/dist/tools/coat-check-get.d.ts +2 -2
- package/dist/tools/coat-check-get.js +39 -34
- package/dist/tools/coat-check-list.d.ts +2 -2
- package/dist/tools/coat-check-list.js +48 -43
- package/dist/tools/coat-check-put.d.ts +2 -2
- package/dist/tools/coat-check-put.js +41 -36
- package/dist/tools/cue.d.ts +2 -2
- package/dist/tools/cue.js +57 -52
- package/dist/tools/descriptor.d.ts +72 -0
- package/dist/tools/descriptor.js +39 -0
- package/dist/tools/destroy.d.ts +2 -2
- package/dist/tools/destroy.js +153 -148
- package/dist/tools/ensemble.d.ts +2 -2
- package/dist/tools/ensemble.js +71 -66
- package/dist/tools/evaluate-gate.d.ts +2 -2
- package/dist/tools/evaluate-gate.js +33 -27
- package/dist/tools/fetch-state.d.ts +2 -2
- package/dist/tools/fetch-state.js +43 -38
- package/dist/tools/gates.d.ts +2 -2
- package/dist/tools/gates.js +39 -34
- package/dist/tools/hosts.d.ts +2 -2
- package/dist/tools/hosts.js +25 -20
- package/dist/tools/listen.d.ts +2 -2
- package/dist/tools/listen.js +23 -18
- package/dist/tools/load-lineup.d.ts +2 -2
- package/dist/tools/load-lineup.js +324 -319
- package/dist/tools/migrate.d.ts +2 -2
- package/dist/tools/migrate.js +45 -40
- package/dist/tools/pause.d.ts +2 -2
- package/dist/tools/pause.js +34 -29
- package/dist/tools/play.d.ts +2 -2
- package/dist/tools/play.js +53 -48
- package/dist/tools/quality-gate.d.ts +2 -2
- package/dist/tools/quality-gate.js +26 -21
- package/dist/tools/recall.d.ts +2 -2
- package/dist/tools/recall.js +32 -27
- package/dist/tools/recruit.d.ts +2 -2
- package/dist/tools/recruit.js +325 -256
- package/dist/tools/release.d.ts +2 -2
- package/dist/tools/release.js +85 -80
- package/dist/tools/report.d.ts +2 -2
- package/dist/tools/report.js +28 -23
- package/dist/tools/reset.d.ts +3 -0
- package/dist/tools/reset.js +51 -0
- package/dist/tools/restart.d.ts +2 -2
- package/dist/tools/restart.js +51 -46
- package/dist/tools/restore.d.ts +2 -2
- package/dist/tools/restore.js +76 -71
- package/dist/tools/save-lineup.d.ts +2 -2
- package/dist/tools/save-lineup.js +32 -27
- package/dist/tools/save-state.d.ts +2 -2
- package/dist/tools/save-state.js +43 -38
- package/dist/tools/schedule.d.ts +2 -2
- package/dist/tools/schedule.js +133 -128
- package/dist/tools/schedules.d.ts +2 -2
- package/dist/tools/schedules.js +41 -36
- package/dist/tools/set-ensemble-description.d.ts +2 -2
- package/dist/tools/set-ensemble-description.js +26 -21
- package/dist/tools/set-name.d.ts +2 -2
- package/dist/tools/set-name.js +38 -33
- package/dist/tools/set-part.d.ts +2 -2
- package/dist/tools/set-part.js +20 -15
- package/dist/tools/shutdown.d.ts +2 -2
- package/dist/tools/shutdown.js +39 -34
- package/dist/tools/stage.d.ts +2 -2
- package/dist/tools/stage.js +28 -23
- package/dist/tools/stages.d.ts +2 -2
- package/dist/tools/stages.js +36 -31
- package/dist/tools/unschedule.d.ts +2 -2
- package/dist/tools/unschedule.js +30 -25
- package/dist/tools/who-am-i.d.ts +2 -2
- package/dist/tools/who-am-i.js +36 -31
- package/dist/tools/worktree.d.ts +2 -2
- package/dist/tools/worktree.js +134 -129
- package/dist/tui/index.js +6 -6
- package/dist/types.d.ts +47 -2
- package/dist/types.js +1 -1
- package/dist/utils/default-part.js +1 -0
- package/dist/utils/grpc-shutdown-guard.d.ts +52 -0
- package/dist/utils/grpc-shutdown-guard.js +88 -0
- package/dist/utils/sdk-probe.d.ts +23 -0
- package/dist/utils/sdk-probe.js +46 -7
- package/dist/worker.d.ts +3 -1
- package/dist/worker.js +6 -2
- package/dist/workflows/session.js +70 -2
- package/dist/workflows/signals.d.ts +32 -2
- package/dist/workflows/signals.js +25 -2
- package/examples/agents/tempo-composer.md +56 -56
- package/examples/agents/tempo-conductor.md +117 -117
- package/examples/agents/tempo-critic.md +73 -73
- package/examples/agents/tempo-improv.md +74 -74
- package/examples/agents/tempo-liner.md +75 -75
- package/examples/agents/tempo-roadie.md +61 -61
- package/examples/agents/tempo-soloist.md +71 -71
- package/examples/agents/tempo-tuner.md +94 -94
- package/examples/ensembles/tempo-big-band.yaml +146 -146
- package/examples/ensembles/tempo-dev-team.yaml +58 -58
- package/examples/ensembles/tempo-headless-jam.yaml +77 -77
- package/examples/ensembles/tempo-jam-session.yaml +41 -41
- package/examples/ensembles/tempo-mock-jam.yaml +79 -79
- package/examples/ensembles/tempo-review-squad.yaml +32 -32
- package/package.json +176 -173
- package/packaging/launchd/com.agent.tempo.plist +46 -46
- package/packaging/systemd/agent-tempo.service +32 -32
- package/packaging/windows/install-task.ps1 +71 -71
- package/scenarios/conductor-recruit-mock.yaml +33 -33
- package/scenarios/echo-roundtrip.yaml +15 -15
- package/scenarios/multi-player-handoff.yaml +38 -38
- package/scenarios/recruit-cascade.yaml +38 -38
- package/scenarios/two-player-conversation.yaml +33 -33
- package/workflow-bundle.js +97 -6
- package/dashboard/dist/assets/index-D6Xyje_n.js.map +0 -1
- package/dist/activities/claude-stop.d.ts +0 -21
- package/dist/activities/claude-stop.js +0 -94
- package/dist/channel.d.ts +0 -3
- package/dist/channel.js +0 -48
- package/dist/copilot-bridge.d.ts +0 -22
- package/dist/copilot-bridge.js +0 -565
- package/dist/scripts/258-spotcheck.js +0 -303
- package/dist/tools/detach.d.ts +0 -4
- package/dist/tools/detach.js +0 -45
- package/dist/tools/encore.d.ts +0 -4
- package/dist/tools/encore.js +0 -31
- package/dist/tools/helpers.d.ts +0 -21
- package/dist/tools/helpers.js +0 -25
- package/dist/tools/pause-ensemble.d.ts +0 -4
- package/dist/tools/pause-ensemble.js +0 -58
- package/dist/tools/resume-ensemble.d.ts +0 -4
- package/dist/tools/resume-ensemble.js +0 -79
- package/dist/tools/stop.d.ts +0 -4
- package/dist/tools/stop.js +0 -29
- package/dist/tui/client.d.ts +0 -6
- package/dist/tui/client.js +0 -9
- package/dist/tui/components/ActivityLog.d.ts +0 -16
- package/dist/tui/components/ActivityLog.js +0 -36
- package/dist/tui/components/CommandOverlay.d.ts +0 -15
- package/dist/tui/components/CommandOverlay.js +0 -34
- package/dist/tui/components/ConductorChat.d.ts +0 -16
- package/dist/tui/components/ConductorChat.js +0 -32
- package/dist/tui/components/EnsembleListView.d.ts +0 -14
- package/dist/tui/components/EnsembleListView.js +0 -32
- package/dist/tui/components/EnsemblePanel.d.ts +0 -12
- package/dist/tui/components/EnsemblePanel.js +0 -40
- package/dist/tui/components/InputBar.d.ts +0 -13
- package/dist/tui/components/InputBar.js +0 -58
- package/dist/tui/components/ScheduleOverlay.d.ts +0 -13
- package/dist/tui/components/ScheduleOverlay.js +0 -113
- package/dist/tui/components/TopBar.d.ts +0 -12
- package/dist/tui/components/TopBar.js +0 -15
- package/dist/tui/core-api.d.ts +0 -26
- package/dist/tui/core-api.js +0 -67
- package/dist/tui/hooks/useEnsembleDiscovery.d.ts +0 -3
- package/dist/tui/hooks/useEnsembleDiscovery.js +0 -30
- package/dist/tui/hooks/useMaestroPoller.d.ts +0 -3
- package/dist/tui/hooks/useMaestroPoller.js +0 -36
- package/dist/tui/hooks/useSendCommand.d.ts +0 -7
- package/dist/tui/hooks/useSendCommand.js +0 -29
- package/dist/utils/bg-preflight.d.ts +0 -25
- package/dist/utils/bg-preflight.js +0 -154
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export interface ClaudeStopInput {
|
|
2
|
-
/** Supervisor's 8-char short id from `SessionMetadata.bgShortId`. */
|
|
3
|
-
shortId: string;
|
|
4
|
-
/** Custom claude binary path (defaults to `'claude'` on PATH). */
|
|
5
|
-
claudeBin?: string;
|
|
6
|
-
}
|
|
7
|
-
export interface ClaudeStopResult {
|
|
8
|
-
success: boolean;
|
|
9
|
-
/** One of `'stopped'` | `'already-gone'` | `'error'`. */
|
|
10
|
-
outcome: 'stopped' | 'already-gone' | 'error';
|
|
11
|
-
/** Populated on `outcome === 'error'` — the raw stderr/stdout snippet for diagnostics. */
|
|
12
|
-
detail?: string;
|
|
13
|
-
/** Exit code from `claude stop`. Undefined on spawn-side failure. */
|
|
14
|
-
exitCode?: number;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Invoke `claude stop <shortId>` synchronously. Never throws — returns a
|
|
18
|
-
* structured `ClaudeStopResult` the workflow can act on. Routes through
|
|
19
|
-
* `resolveClaudePath` so the `claudeBin` config option is honoured.
|
|
20
|
-
*/
|
|
21
|
-
export declare function claudeStop(input: ClaudeStopInput): Promise<ClaudeStopResult>;
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.claudeStop = claudeStop;
|
|
4
|
-
/**
|
|
5
|
-
* #596 / ADR 0016 — `claude stop <shortId>` per-host activity.
|
|
6
|
-
*
|
|
7
|
-
* `claude --bg` hands the session to Anthropic's per-user Claude Code
|
|
8
|
-
* supervisor. We don't own the PID anymore (the supervisor does), so the
|
|
9
|
-
* existing `hard-terminate` PID-scan helper would always return
|
|
10
|
-
* `strategy: 'none'` and leak the supervisor job. Instead, ask the
|
|
11
|
-
* supervisor to stop the job via its documented CLI verb.
|
|
12
|
-
*
|
|
13
|
-
* **Routing**: registered on the per-host activity queue
|
|
14
|
-
* (`agent-tempo-{hostname}`) so the `claude` CLI runs on the same machine
|
|
15
|
-
* the supervisor lives on. The workflow proxy in `src/workflows/session.ts`
|
|
16
|
-
* picks the right host via `AgentTempoHostname` exactly the same way
|
|
17
|
-
* `hardTerminateAttachment` already does.
|
|
18
|
-
*
|
|
19
|
-
* **Idempotency**: `claude stop` exits 1 with `No job matching '<id>'` when
|
|
20
|
-
* the job is already gone. We classify that as success — destroy must be
|
|
21
|
-
* idempotent and a re-run of an already-stopped session is a normal flow.
|
|
22
|
-
* Any other non-zero exit (network/socket failure, supervisor itself wedged,
|
|
23
|
-
* unexpected CLI shape) is reported as `success: false` so the workflow's
|
|
24
|
-
* destroy path can fall back to the existing `hardTerminateAttachment`
|
|
25
|
-
* PID-scan as defense in depth.
|
|
26
|
-
*
|
|
27
|
-
* **Timing**: 15-second timeout. The supervisor responds in <100ms on a
|
|
28
|
-
* healthy host, but Windows process-spawn overhead and antivirus scanners
|
|
29
|
-
* can stretch the worst case. 15s leaves slack without holding up destroy.
|
|
30
|
-
*/
|
|
31
|
-
const child_process_1 = require("child_process");
|
|
32
|
-
const activity_1 = require("@temporalio/activity");
|
|
33
|
-
const spawn_1 = require("../spawn");
|
|
34
|
-
const log = (...args) => console.error('[agent-tempo:claude-stop]', ...args);
|
|
35
|
-
/**
|
|
36
|
-
* Validate the supervisor short id before shelling out. Anthropic uses
|
|
37
|
-
* lowercase hex from the full UUID's first 8 chars; reject anything else
|
|
38
|
-
* to avoid passing user-influenced strings into argv.
|
|
39
|
-
*/
|
|
40
|
-
function isValidShortId(s) {
|
|
41
|
-
return typeof s === 'string' && /^[0-9a-f]{8}$/.test(s);
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Invoke `claude stop <shortId>` synchronously. Never throws — returns a
|
|
45
|
-
* structured `ClaudeStopResult` the workflow can act on. Routes through
|
|
46
|
-
* `resolveClaudePath` so the `claudeBin` config option is honoured.
|
|
47
|
-
*/
|
|
48
|
-
async function claudeStop(input) {
|
|
49
|
-
const { shortId, claudeBin } = input;
|
|
50
|
-
if (!isValidShortId(shortId)) {
|
|
51
|
-
throw activity_1.ApplicationFailure.nonRetryable(`claudeStop: invalid shortId "${shortId}" (must be 8 lowercase hex chars). ` +
|
|
52
|
-
`This indicates corrupt SessionMetadata.bgShortId — check the recruit path.`);
|
|
53
|
-
}
|
|
54
|
-
const bin = (0, spawn_1.resolveClaudePath)(claudeBin);
|
|
55
|
-
let result;
|
|
56
|
-
try {
|
|
57
|
-
result = (0, child_process_1.spawnSync)(bin, ['stop', shortId], {
|
|
58
|
-
encoding: 'utf8',
|
|
59
|
-
timeout: 15_000,
|
|
60
|
-
shell: process.platform === 'win32',
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
catch (err) {
|
|
64
|
-
const detail = err instanceof Error ? err.message : String(err);
|
|
65
|
-
log(`claude stop ${shortId} failed to launch: ${detail}`);
|
|
66
|
-
return { success: false, outcome: 'error', detail };
|
|
67
|
-
}
|
|
68
|
-
if (result.error) {
|
|
69
|
-
log(`claude stop ${shortId} spawn error: ${result.error.message}`);
|
|
70
|
-
return { success: false, outcome: 'error', detail: result.error.message };
|
|
71
|
-
}
|
|
72
|
-
const exitCode = result.status ?? -1;
|
|
73
|
-
const stderr = (result.stderr || '').toString();
|
|
74
|
-
const stdout = (result.stdout || '').toString();
|
|
75
|
-
const combined = `${stderr}\n${stdout}`.trim();
|
|
76
|
-
if (exitCode === 0) {
|
|
77
|
-
log(`claude stop ${shortId} → stopped`);
|
|
78
|
-
return { success: true, outcome: 'stopped', exitCode };
|
|
79
|
-
}
|
|
80
|
-
// Anthropic's "already gone" signal — exit 1 with `No job matching '<id>'`
|
|
81
|
-
// somewhere in the combined output. Match case-insensitively to absorb
|
|
82
|
-
// small phrasing drift across CLI versions.
|
|
83
|
-
if (/no job matching/i.test(combined)) {
|
|
84
|
-
log(`claude stop ${shortId} → already-gone (exit ${exitCode}, idempotent success)`);
|
|
85
|
-
return { success: true, outcome: 'already-gone', exitCode };
|
|
86
|
-
}
|
|
87
|
-
log(`claude stop ${shortId} → error (exit ${exitCode}): ${combined || '(no output)'}`);
|
|
88
|
-
return {
|
|
89
|
-
success: false,
|
|
90
|
-
outcome: 'error',
|
|
91
|
-
exitCode,
|
|
92
|
-
detail: combined || `exit ${exitCode} with no output`,
|
|
93
|
-
};
|
|
94
|
-
}
|
package/dist/channel.d.ts
DELETED
package/dist/channel.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.startMessagePoller = startMessagePoller;
|
|
4
|
-
const log = (...args) => console.error('[claude-tempo:poller]', ...args);
|
|
5
|
-
const POLL_BASE_MS = 2000;
|
|
6
|
-
const POLL_BACKOFF_FACTOR = 1.5;
|
|
7
|
-
const POLL_MAX_MS = 30000;
|
|
8
|
-
function startMessagePoller(handle, onMessages) {
|
|
9
|
-
let stopped = false;
|
|
10
|
-
let timeout = null;
|
|
11
|
-
let currentInterval = POLL_BASE_MS;
|
|
12
|
-
let consecutiveErrors = 0;
|
|
13
|
-
const poll = async () => {
|
|
14
|
-
if (stopped)
|
|
15
|
-
return;
|
|
16
|
-
try {
|
|
17
|
-
const messages = await handle.query('pendingMessages');
|
|
18
|
-
if (messages.length > 0) {
|
|
19
|
-
const ids = messages.map((m) => m.id);
|
|
20
|
-
// Deliver messages first — only mark delivered after successful notification.
|
|
21
|
-
// If onMessages throws, messages stay undelivered and retry on next poll cycle.
|
|
22
|
-
await onMessages(messages);
|
|
23
|
-
await handle.signal('markDelivered', ids);
|
|
24
|
-
}
|
|
25
|
-
// Reset backoff on successful poll
|
|
26
|
-
currentInterval = POLL_BASE_MS;
|
|
27
|
-
consecutiveErrors = 0;
|
|
28
|
-
}
|
|
29
|
-
catch (err) {
|
|
30
|
-
consecutiveErrors++;
|
|
31
|
-
// Apply exponential backoff on errors
|
|
32
|
-
currentInterval = Math.min(currentInterval * POLL_BACKOFF_FACTOR, POLL_MAX_MS);
|
|
33
|
-
log(`Poll error (attempt ${consecutiveErrors}, next in ${Math.round(currentInterval)}ms):`, err);
|
|
34
|
-
}
|
|
35
|
-
if (!stopped) {
|
|
36
|
-
timeout = setTimeout(poll, currentInterval);
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
// Start the first poll
|
|
40
|
-
timeout = setTimeout(poll, POLL_BASE_MS);
|
|
41
|
-
return () => {
|
|
42
|
-
stopped = true;
|
|
43
|
-
if (timeout) {
|
|
44
|
-
clearTimeout(timeout);
|
|
45
|
-
timeout = null;
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
}
|
package/dist/copilot-bridge.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copilot Bridge — allows GitHub Copilot CLI sessions to participate
|
|
3
|
-
* as players in a claude-tempo ensemble.
|
|
4
|
-
*
|
|
5
|
-
* The bridge:
|
|
6
|
-
* 1. Spawns a Copilot CLI session via the Copilot SDK
|
|
7
|
-
* 2. Configures it with claude-tempo as an MCP server (so it gets all tools)
|
|
8
|
-
* 3. Polls the Temporal workflow for pending messages
|
|
9
|
-
* 4. Injects messages as prompts via the SDK
|
|
10
|
-
*
|
|
11
|
-
* Usage:
|
|
12
|
-
* npx ts-node src/copilot-bridge.ts
|
|
13
|
-
*
|
|
14
|
-
* Environment variables:
|
|
15
|
-
* CLAUDE_TEMPO_ENSEMBLE — ensemble name (default: "default")
|
|
16
|
-
* CLAUDE_TEMPO_PLAYER_NAME — player ID for workflow registration (set by spawner for deterministic workflow IDs)
|
|
17
|
-
* COPILOT_BRIDGE_NAME — player name for set_name (optional)
|
|
18
|
-
* COPILOT_BRIDGE_MODEL — model to use (optional)
|
|
19
|
-
* COPILOT_BRIDGE_SESSION_ID — deterministic session ID for resumable sessions (optional)
|
|
20
|
-
* GITHUB_TOKEN — GitHub auth token (optional, uses logged-in user by default)
|
|
21
|
-
*/
|
|
22
|
-
export {};
|