@grackle-ai/plugin-core 0.96.3
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/dist/codespace-handlers.d.ts +6 -0
- package/dist/codespace-handlers.d.ts.map +1 -0
- package/dist/codespace-handlers.js +66 -0
- package/dist/codespace-handlers.js.map +1 -0
- package/dist/cron-phase.d.ts +46 -0
- package/dist/cron-phase.d.ts.map +1 -0
- package/dist/cron-phase.js +88 -0
- package/dist/cron-phase.js.map +1 -0
- package/dist/dispatch-phase.d.ts +46 -0
- package/dist/dispatch-phase.d.ts.map +1 -0
- package/dist/dispatch-phase.js +99 -0
- package/dist/dispatch-phase.js.map +1 -0
- package/dist/environment-handlers.d.ts +16 -0
- package/dist/environment-handlers.d.ts.map +1 -0
- package/dist/environment-handlers.js +255 -0
- package/dist/environment-handlers.js.map +1 -0
- package/dist/environment-reconciliation.d.ts +35 -0
- package/dist/environment-reconciliation.d.ts.map +1 -0
- package/dist/environment-reconciliation.js +74 -0
- package/dist/environment-reconciliation.js.map +1 -0
- package/dist/escalation-handlers.d.ts +8 -0
- package/dist/escalation-handlers.d.ts.map +1 -0
- package/dist/escalation-handlers.js +60 -0
- package/dist/escalation-handlers.js.map +1 -0
- package/dist/finding-handlers.d.ts +8 -0
- package/dist/finding-handlers.d.ts.map +1 -0
- package/dist/finding-handlers.js +38 -0
- package/dist/finding-handlers.js.map +1 -0
- package/dist/grpc-proto-converters.d.ts +31 -0
- package/dist/grpc-proto-converters.d.ts.map +1 -0
- package/dist/grpc-proto-converters.js +222 -0
- package/dist/grpc-proto-converters.js.map +1 -0
- package/dist/grpc-service.d.ts +21 -0
- package/dist/grpc-service.d.ts.map +1 -0
- package/dist/grpc-service.js +50 -0
- package/dist/grpc-service.js.map +1 -0
- package/dist/grpc-shared.d.ts +22 -0
- package/dist/grpc-shared.d.ts.map +1 -0
- package/dist/grpc-shared.js +68 -0
- package/dist/grpc-shared.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge-handlers.d.ts +12 -0
- package/dist/knowledge-handlers.d.ts.map +1 -0
- package/dist/knowledge-handlers.js +149 -0
- package/dist/knowledge-handlers.js.map +1 -0
- package/dist/lifecycle-cleanup.d.ts +13 -0
- package/dist/lifecycle-cleanup.d.ts.map +1 -0
- package/dist/lifecycle-cleanup.js +35 -0
- package/dist/lifecycle-cleanup.js.map +1 -0
- package/dist/lifecycle.d.ts +28 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +132 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/orphan-phase.d.ts +27 -0
- package/dist/orphan-phase.d.ts.map +1 -0
- package/dist/orphan-phase.js +69 -0
- package/dist/orphan-phase.js.map +1 -0
- package/dist/persona-handlers.d.ts +12 -0
- package/dist/persona-handlers.d.ts.map +1 -0
- package/dist/persona-handlers.js +156 -0
- package/dist/persona-handlers.js.map +1 -0
- package/dist/root-task-boot.d.ts +67 -0
- package/dist/root-task-boot.d.ts.map +1 -0
- package/dist/root-task-boot.js +234 -0
- package/dist/root-task-boot.js.map +1 -0
- package/dist/schedule-expression.d.ts +43 -0
- package/dist/schedule-expression.d.ts.map +1 -0
- package/dist/schedule-expression.js +105 -0
- package/dist/schedule-expression.js.map +1 -0
- package/dist/schedule-handlers.d.ts +12 -0
- package/dist/schedule-handlers.d.ts.map +1 -0
- package/dist/schedule-handlers.js +122 -0
- package/dist/schedule-handlers.js.map +1 -0
- package/dist/session-handlers.d.ts +40 -0
- package/dist/session-handlers.d.ts.map +1 -0
- package/dist/session-handlers.js +610 -0
- package/dist/session-handlers.js.map +1 -0
- package/dist/settings-handlers.d.ts +10 -0
- package/dist/settings-handlers.d.ts.map +1 -0
- package/dist/settings-handlers.js +80 -0
- package/dist/settings-handlers.js.map +1 -0
- package/dist/signals/escalation-auto.d.ts +20 -0
- package/dist/signals/escalation-auto.d.ts.map +1 -0
- package/dist/signals/escalation-auto.js +126 -0
- package/dist/signals/escalation-auto.js.map +1 -0
- package/dist/signals/orphan-reparent.d.ts +31 -0
- package/dist/signals/orphan-reparent.d.ts.map +1 -0
- package/dist/signals/orphan-reparent.js +175 -0
- package/dist/signals/orphan-reparent.js.map +1 -0
- package/dist/signals/sigchld.d.ts +12 -0
- package/dist/signals/sigchld.d.ts.map +1 -0
- package/dist/signals/sigchld.js +177 -0
- package/dist/signals/sigchld.js.map +1 -0
- package/dist/task-handlers.d.ts +22 -0
- package/dist/task-handlers.d.ts.map +1 -0
- package/dist/task-handlers.js +517 -0
- package/dist/task-handlers.js.map +1 -0
- package/dist/test-utils/integration-setup.d.ts +11 -0
- package/dist/test-utils/integration-setup.d.ts.map +1 -0
- package/dist/test-utils/integration-setup.js +26 -0
- package/dist/test-utils/integration-setup.js.map +1 -0
- package/dist/test-utils/mock-database.d.ts +152 -0
- package/dist/test-utils/mock-database.d.ts.map +1 -0
- package/dist/test-utils/mock-database.js +169 -0
- package/dist/test-utils/mock-database.js.map +1 -0
- package/dist/token-handlers.d.ts +12 -0
- package/dist/token-handlers.d.ts.map +1 -0
- package/dist/token-handlers.js +85 -0
- package/dist/token-handlers.js.map +1 -0
- package/dist/tsdoc-metadata.json +11 -0
- package/dist/utils/format-gh-error.d.ts +6 -0
- package/dist/utils/format-gh-error.d.ts.map +1 -0
- package/dist/utils/format-gh-error.js +30 -0
- package/dist/utils/format-gh-error.js.map +1 -0
- package/dist/workspace-handlers.d.ts +16 -0
- package/dist/workspace-handlers.d.ts.map +1 -0
- package/dist/workspace-handlers.js +146 -0
- package/dist/workspace-handlers.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { grackle } from "@grackle-ai/common";
|
|
2
|
+
/** List available GitHub Codespaces. */
|
|
3
|
+
export declare function listCodespaces(): Promise<grackle.CodespaceList>;
|
|
4
|
+
/** Create a new GitHub Codespace. */
|
|
5
|
+
export declare function createCodespace(req: grackle.CreateCodespaceRequest): Promise<grackle.CreateCodespaceResponse>;
|
|
6
|
+
//# sourceMappingURL=codespace-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codespace-handlers.d.ts","sourceRoot":"","sources":["../src/codespace-handlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAc7C,wCAAwC;AACxC,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAgCrE;AAED,qCAAqC;AACrC,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAwBnH"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { ConnectError, Code } from "@connectrpc/connect";
|
|
2
|
+
import { create } from "@bufbuild/protobuf";
|
|
3
|
+
import { grackle } from "@grackle-ai/common";
|
|
4
|
+
import { exec } from "@grackle-ai/core";
|
|
5
|
+
import { formatGhError } from "./utils/format-gh-error.js";
|
|
6
|
+
import { logger } from "@grackle-ai/core";
|
|
7
|
+
/** Timeout for `gh codespace list` in milliseconds. */
|
|
8
|
+
const GH_CODESPACE_LIST_TIMEOUT_MS = 30_000;
|
|
9
|
+
/** Timeout for `gh codespace create` in milliseconds. */
|
|
10
|
+
const GH_CODESPACE_CREATE_TIMEOUT_MS = 300_000;
|
|
11
|
+
/** Maximum number of codespaces returned by `gh codespace list`. */
|
|
12
|
+
const GH_CODESPACE_LIST_LIMIT = 50;
|
|
13
|
+
/** List available GitHub Codespaces. */
|
|
14
|
+
export async function listCodespaces() {
|
|
15
|
+
try {
|
|
16
|
+
const result = await exec("gh", [
|
|
17
|
+
"codespace",
|
|
18
|
+
"list",
|
|
19
|
+
"--json",
|
|
20
|
+
"name,repository,state,gitStatus",
|
|
21
|
+
"--limit",
|
|
22
|
+
String(GH_CODESPACE_LIST_LIMIT),
|
|
23
|
+
], { timeout: GH_CODESPACE_LIST_TIMEOUT_MS });
|
|
24
|
+
const entries = JSON.parse(result.stdout || "[]");
|
|
25
|
+
return create(grackle.CodespaceListSchema, {
|
|
26
|
+
codespaces: entries.map((e) => create(grackle.CodespaceInfoSchema, {
|
|
27
|
+
name: String(e.name ?? ""),
|
|
28
|
+
repository: String(e.repository ?? ""),
|
|
29
|
+
state: String(e.state ?? ""),
|
|
30
|
+
gitStatus: String(e.gitStatus ?? ""),
|
|
31
|
+
})),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
logger.warn({ err }, "Failed to list codespaces");
|
|
36
|
+
return create(grackle.CodespaceListSchema, {
|
|
37
|
+
codespaces: [],
|
|
38
|
+
error: formatGhError(err, "list codespaces"),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Create a new GitHub Codespace. */
|
|
43
|
+
export async function createCodespace(req) {
|
|
44
|
+
if (!req.repo.trim()) {
|
|
45
|
+
throw new ConnectError("repo is required", Code.InvalidArgument);
|
|
46
|
+
}
|
|
47
|
+
const trimmedRepo = req.repo.trim();
|
|
48
|
+
const createArgs = ["codespace", "create", "--repo", trimmedRepo];
|
|
49
|
+
if (req.machine.trim()) {
|
|
50
|
+
createArgs.push("--machine", req.machine.trim());
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const result = await exec("gh", createArgs, {
|
|
54
|
+
timeout: GH_CODESPACE_CREATE_TIMEOUT_MS,
|
|
55
|
+
});
|
|
56
|
+
return create(grackle.CreateCodespaceResponseSchema, {
|
|
57
|
+
name: result.stdout.trim(),
|
|
58
|
+
repository: trimmedRepo,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
logger.error({ err, repo: trimmedRepo }, "Failed to create codespace");
|
|
63
|
+
throw new ConnectError(formatGhError(err, "create codespace"), Code.Internal);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=codespace-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codespace-handlers.js","sourceRoot":"","sources":["../src/codespace-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cron reconciliation phase — fires due schedules on each tick.
|
|
3
|
+
*
|
|
4
|
+
* Creates tasks for due schedules and enqueues them for dispatch.
|
|
5
|
+
* The dispatch phase (separate reconciliation phase) handles starting
|
|
6
|
+
* sessions, respecting concurrency limits, and environment resolution.
|
|
7
|
+
*/
|
|
8
|
+
import type { ScheduleRow } from "@grackle-ai/database";
|
|
9
|
+
import type { GrackleEventType } from "@grackle-ai/core";
|
|
10
|
+
import type { ReconciliationPhase } from "@grackle-ai/core";
|
|
11
|
+
/** Dependencies injected into the cron phase for testability. */
|
|
12
|
+
export interface CronPhaseDeps {
|
|
13
|
+
/** Query the schedule store for due entries. */
|
|
14
|
+
getDueSchedules: () => ScheduleRow[];
|
|
15
|
+
/** Advance a schedule after firing (update lastRunAt, nextRunAt, runCount). */
|
|
16
|
+
advanceSchedule: (id: string, lastRunAt: string, nextRunAt: string) => void;
|
|
17
|
+
/** Create a new task in the task store. */
|
|
18
|
+
createTask: (id: string, workspaceId: string | undefined, title: string, description: string, dependsOn: string[], workspaceSlug: string, parentTaskId?: string, canDecompose?: boolean, defaultPersonaId?: string) => void;
|
|
19
|
+
/** Set the schedule_id FK on a task. */
|
|
20
|
+
setTaskScheduleId: (taskId: string, scheduleId: string) => void;
|
|
21
|
+
/** Enqueue a task for the dispatch phase to start. */
|
|
22
|
+
enqueueForDispatch: (entry: {
|
|
23
|
+
id: string;
|
|
24
|
+
taskId: string;
|
|
25
|
+
environmentId?: string;
|
|
26
|
+
personaId?: string;
|
|
27
|
+
}) => void;
|
|
28
|
+
/** Emit a domain event. */
|
|
29
|
+
emit: (type: GrackleEventType, payload: Record<string, unknown>) => void;
|
|
30
|
+
/** Look up a persona by ID. */
|
|
31
|
+
getPersona: (id: string) => {
|
|
32
|
+
id: string;
|
|
33
|
+
name: string;
|
|
34
|
+
runtime: string;
|
|
35
|
+
} | undefined;
|
|
36
|
+
/** Enable or disable a schedule, setting or clearing nextRunAt. */
|
|
37
|
+
setScheduleEnabled: (id: string, enabled: boolean, nextRunAt: string | null) => void;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Create a ReconciliationPhase that fires due schedules.
|
|
41
|
+
*
|
|
42
|
+
* @param deps - Injected dependencies
|
|
43
|
+
* @returns A phase to register with ReconciliationManager
|
|
44
|
+
*/
|
|
45
|
+
export declare function createCronPhase(deps: CronPhaseDeps): ReconciliationPhase;
|
|
46
|
+
//# sourceMappingURL=cron-phase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-phase.d.ts","sourceRoot":"","sources":["../src/cron-phase.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG5D,iEAAiE;AACjE,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,eAAe,EAAE,MAAM,WAAW,EAAE,CAAC;IACrC,+EAA+E;IAC/E,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5E,2CAA2C;IAC3C,UAAU,EAAE,CACV,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,aAAa,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,OAAO,EACtB,gBAAgB,CAAC,EAAE,MAAM,KACtB,IAAI,CAAC;IACV,wCAAwC;IACxC,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,sDAAsD;IACtD,kBAAkB,EAAE,CAAC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAChH,2BAA2B;IAC3B,IAAI,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACzE,+BAA+B;IAC/B,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACtF,mEAAmE;IAEnE,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACtF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,mBAAmB,CAcxE"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cron reconciliation phase — fires due schedules on each tick.
|
|
3
|
+
*
|
|
4
|
+
* Creates tasks for due schedules and enqueues them for dispatch.
|
|
5
|
+
* The dispatch phase (separate reconciliation phase) handles starting
|
|
6
|
+
* sessions, respecting concurrency limits, and environment resolution.
|
|
7
|
+
*/
|
|
8
|
+
import { v4 as uuidv4 } from "uuid";
|
|
9
|
+
import { logger } from "@grackle-ai/core";
|
|
10
|
+
import { computeNextRunAt } from "./schedule-expression.js";
|
|
11
|
+
import { ROOT_TASK_ID } from "@grackle-ai/common";
|
|
12
|
+
/**
|
|
13
|
+
* Create a ReconciliationPhase that fires due schedules.
|
|
14
|
+
*
|
|
15
|
+
* @param deps - Injected dependencies
|
|
16
|
+
* @returns A phase to register with ReconciliationManager
|
|
17
|
+
*/
|
|
18
|
+
export function createCronPhase(deps) {
|
|
19
|
+
return {
|
|
20
|
+
name: "cron",
|
|
21
|
+
execute: async () => {
|
|
22
|
+
const due = deps.getDueSchedules();
|
|
23
|
+
if (due.length === 0) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
logger.debug({ count: due.length }, "Cron phase: due schedules");
|
|
27
|
+
for (const schedule of due) {
|
|
28
|
+
fireSchedule(deps, schedule);
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Fire a single schedule: create task, enqueue for dispatch, advance. */
|
|
34
|
+
function fireSchedule(deps, schedule) {
|
|
35
|
+
const now = new Date().toISOString();
|
|
36
|
+
let nextRunAt;
|
|
37
|
+
try {
|
|
38
|
+
// Anchor to the schedule's lastRunAt (not current time) to prevent drift
|
|
39
|
+
nextRunAt = computeNextRunAt(schedule.scheduleExpression, schedule.lastRunAt ?? undefined);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
logger.error({ scheduleId: schedule.id, scheduleExpression: schedule.scheduleExpression, err }, "Cron phase: failed to compute nextRunAt; disabling schedule");
|
|
43
|
+
// Disable the schedule to prevent error loop on every tick
|
|
44
|
+
deps.setScheduleEnabled(schedule.id, false, null);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
// Validate persona exists
|
|
49
|
+
const persona = deps.getPersona(schedule.personaId);
|
|
50
|
+
if (!persona) {
|
|
51
|
+
logger.warn({ scheduleId: schedule.id, personaId: schedule.personaId }, "Schedule fire skipped: persona not found");
|
|
52
|
+
deps.advanceSchedule(schedule.id, now, nextRunAt);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Create task
|
|
56
|
+
const taskId = uuidv4();
|
|
57
|
+
const taskTitle = `${schedule.title} @ ${now}`;
|
|
58
|
+
const parentTaskId = schedule.parentTaskId || ROOT_TASK_ID;
|
|
59
|
+
deps.createTask(taskId, schedule.workspaceId || undefined, taskTitle, schedule.description, [], // no dependencies
|
|
60
|
+
"", // no workspace slug
|
|
61
|
+
parentTaskId, false, // canDecompose
|
|
62
|
+
schedule.personaId);
|
|
63
|
+
deps.setTaskScheduleId(taskId, schedule.id);
|
|
64
|
+
// Enqueue for the dispatch phase to start (respects concurrency limits).
|
|
65
|
+
// Environment resolution is handled by the dispatch phase; we pass the
|
|
66
|
+
// schedule's preferred environmentId as a hint.
|
|
67
|
+
deps.enqueueForDispatch({
|
|
68
|
+
id: uuidv4(),
|
|
69
|
+
taskId,
|
|
70
|
+
environmentId: schedule.environmentId,
|
|
71
|
+
personaId: schedule.personaId,
|
|
72
|
+
});
|
|
73
|
+
// Advance schedule
|
|
74
|
+
deps.advanceSchedule(schedule.id, now, nextRunAt);
|
|
75
|
+
deps.emit("schedule.fired", {
|
|
76
|
+
scheduleId: schedule.id,
|
|
77
|
+
taskId,
|
|
78
|
+
firedAt: now,
|
|
79
|
+
});
|
|
80
|
+
logger.info({ scheduleId: schedule.id, taskId, title: schedule.title }, "Schedule fired");
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
logger.error({ scheduleId: schedule.id, err }, "Schedule fire failed with exception");
|
|
84
|
+
// Still advance to prevent retry storms
|
|
85
|
+
deps.advanceSchedule(schedule.id, now, nextRunAt);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=cron-phase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-phase.js","sourceRoot":"","sources":["../src/cron-phase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dispatch reconciliation phase — drains the dispatch queue on each tick.
|
|
3
|
+
*
|
|
4
|
+
* Picks up tasks that were enqueued (because the target environment was at
|
|
5
|
+
* concurrency capacity) and spawns them when capacity frees up. Follows the
|
|
6
|
+
* same dependency-injection pattern as cron-phase.ts for testability.
|
|
7
|
+
*/
|
|
8
|
+
import type { DispatchQueueRow, TaskRow } from "@grackle-ai/database";
|
|
9
|
+
import type { ReconciliationPhase } from "@grackle-ai/core";
|
|
10
|
+
/** Dependencies injected into the dispatch phase for testability. */
|
|
11
|
+
export interface DispatchPhaseDeps {
|
|
12
|
+
/** List all pending dispatch queue entries in FIFO order. */
|
|
13
|
+
listPendingEntries: () => DispatchQueueRow[];
|
|
14
|
+
/** Remove an entry from the dispatch queue by taskId. */
|
|
15
|
+
dequeueEntry: (taskId: string) => void;
|
|
16
|
+
/** Look up a task by ID. */
|
|
17
|
+
getTask: (taskId: string) => TaskRow | undefined;
|
|
18
|
+
/** Check whether an environment has capacity for another session. */
|
|
19
|
+
hasCapacity: (environmentId: string) => boolean;
|
|
20
|
+
/** Check whether an environment exists in the registry. */
|
|
21
|
+
environmentExists: (environmentId: string) => boolean;
|
|
22
|
+
/** Check if a task is eligible to start (deps met, no active session). */
|
|
23
|
+
isTaskEligible: (taskId: string) => boolean;
|
|
24
|
+
/** Start a task session. Returns error string on failure, undefined on success. */
|
|
25
|
+
startTaskSession: (task: TaskRow, options?: {
|
|
26
|
+
personaId?: string;
|
|
27
|
+
environmentId?: string;
|
|
28
|
+
notes?: string;
|
|
29
|
+
}) => Promise<string | undefined>;
|
|
30
|
+
/** Check if an environment is connected. */
|
|
31
|
+
isEnvironmentConnected: (environmentId: string) => boolean;
|
|
32
|
+
/** Resolve an environment for a task with no explicit environmentId. */
|
|
33
|
+
resolveEnvironment: (task: TaskRow) => string | undefined;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create a ReconciliationPhase that drains the dispatch queue.
|
|
37
|
+
*
|
|
38
|
+
* On each tick:
|
|
39
|
+
* 1. Lists pending entries in FIFO order
|
|
40
|
+
* 2. For each: dequeues orphans (deleted task/environment), skips if disconnected or at capacity
|
|
41
|
+
* 3. Verifies task eligibility (deps met, not already working) before spawning
|
|
42
|
+
* 4. Calls startTaskSession; on success dequeues, on failure keeps queued for retry
|
|
43
|
+
* 5. Each entry is wrapped in try/catch so one bad task doesn't block others
|
|
44
|
+
*/
|
|
45
|
+
export declare function createDispatchPhase(deps: DispatchPhaseDeps): ReconciliationPhase;
|
|
46
|
+
//# sourceMappingURL=dispatch-phase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-phase.d.ts","sourceRoot":"","sources":["../src/dispatch-phase.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,qEAAqE;AACrE,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,kBAAkB,EAAE,MAAM,gBAAgB,EAAE,CAAC;IAC7C,yDAAyD;IACzD,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,4BAA4B;IAC5B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,CAAC;IACjD,qEAAqE;IACrE,WAAW,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC;IAChD,2DAA2D;IAC3D,iBAAiB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC;IACtD,0EAA0E;IAC1E,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,mFAAmF;IACnF,gBAAgB,EAAE,CAChB,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KACrE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjC,4CAA4C;IAC5C,sBAAsB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3D,wEAAwE;IACxE,kBAAkB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;CAC3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,CAyBhF"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dispatch reconciliation phase — drains the dispatch queue on each tick.
|
|
3
|
+
*
|
|
4
|
+
* Picks up tasks that were enqueued (because the target environment was at
|
|
5
|
+
* concurrency capacity) and spawns them when capacity frees up. Follows the
|
|
6
|
+
* same dependency-injection pattern as cron-phase.ts for testability.
|
|
7
|
+
*/
|
|
8
|
+
import { logger } from "@grackle-ai/core";
|
|
9
|
+
/**
|
|
10
|
+
* Create a ReconciliationPhase that drains the dispatch queue.
|
|
11
|
+
*
|
|
12
|
+
* On each tick:
|
|
13
|
+
* 1. Lists pending entries in FIFO order
|
|
14
|
+
* 2. For each: dequeues orphans (deleted task/environment), skips if disconnected or at capacity
|
|
15
|
+
* 3. Verifies task eligibility (deps met, not already working) before spawning
|
|
16
|
+
* 4. Calls startTaskSession; on success dequeues, on failure keeps queued for retry
|
|
17
|
+
* 5. Each entry is wrapped in try/catch so one bad task doesn't block others
|
|
18
|
+
*/
|
|
19
|
+
export function createDispatchPhase(deps) {
|
|
20
|
+
return {
|
|
21
|
+
name: "dispatch",
|
|
22
|
+
execute: async () => {
|
|
23
|
+
const pending = deps.listPendingEntries();
|
|
24
|
+
if (pending.length === 0) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
logger.debug({ count: pending.length }, "Dispatch phase: pending entries");
|
|
28
|
+
for (const entry of pending) {
|
|
29
|
+
try {
|
|
30
|
+
await dispatchEntry(deps, entry);
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
// Catch unexpected throws so one bad entry doesn't abort the entire tick.
|
|
34
|
+
// Entry stays queued for retry on next tick.
|
|
35
|
+
logger.error({ taskId: entry.taskId, environmentId: entry.environmentId, err }, "Dispatch: unexpected error processing entry");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** Process a single dispatch queue entry. */
|
|
42
|
+
async function dispatchEntry(deps, entry) {
|
|
43
|
+
// Resolve environment if not explicitly set (auto-resolution cascade)
|
|
44
|
+
let environmentId = entry.environmentId;
|
|
45
|
+
if (!environmentId) {
|
|
46
|
+
const task = deps.getTask(entry.taskId);
|
|
47
|
+
if (!task) {
|
|
48
|
+
deps.dequeueEntry(entry.taskId);
|
|
49
|
+
logger.debug({ taskId: entry.taskId }, "Dispatch: dequeued stale entry (task deleted, pre-resolve)");
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
environmentId = deps.resolveEnvironment(task) || "";
|
|
53
|
+
if (!environmentId) {
|
|
54
|
+
// No environment available — stay queued for retry next tick
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Dequeue entries whose environment has been removed entirely (not just disconnected)
|
|
59
|
+
if (!deps.environmentExists(environmentId)) {
|
|
60
|
+
deps.dequeueEntry(entry.taskId);
|
|
61
|
+
logger.debug({ taskId: entry.taskId, environmentId }, "Dispatch: dequeued orphan (environment removed)");
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// Skip if environment is disconnected (may reconnect later)
|
|
65
|
+
if (!deps.isEnvironmentConnected(environmentId)) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// Skip if environment is at capacity
|
|
69
|
+
if (!deps.hasCapacity(environmentId)) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Look up the task (may have been deleted since enqueue — check again after resolution)
|
|
73
|
+
const task = deps.getTask(entry.taskId);
|
|
74
|
+
if (!task) {
|
|
75
|
+
deps.dequeueEntry(entry.taskId);
|
|
76
|
+
logger.debug({ taskId: entry.taskId }, "Dispatch: dequeued stale entry (task deleted)");
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Verify the task is still eligible (deps met, not already working from a concurrent start).
|
|
80
|
+
// Skip rather than dequeue — eligibility may change (e.g. deps become met on a later tick).
|
|
81
|
+
if (!deps.isTaskEligible(entry.taskId)) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const error = await deps.startTaskSession(task, {
|
|
85
|
+
environmentId,
|
|
86
|
+
personaId: entry.personaId,
|
|
87
|
+
notes: entry.notes,
|
|
88
|
+
});
|
|
89
|
+
if (error) {
|
|
90
|
+
logger.warn({ taskId: entry.taskId, environmentId, error }, "Dispatch: session start failed — entry stays queued for retry");
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// Dequeue only after successful start to avoid losing tasks on transient failures.
|
|
94
|
+
// startTaskSession already emits "task.started" so we don't emit it here.
|
|
95
|
+
deps.dequeueEntry(entry.taskId);
|
|
96
|
+
logger.info({ taskId: entry.taskId, environmentId }, "Dispatch: task started");
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=dispatch-phase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-phase.js","sourceRoot":"","sources":["../src/dispatch-phase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { grackle } from "@grackle-ai/common";
|
|
2
|
+
/** List all registered environments. */
|
|
3
|
+
export declare function listEnvironments(): Promise<grackle.EnvironmentList>;
|
|
4
|
+
/** Register a new environment. */
|
|
5
|
+
export declare function addEnvironment(req: grackle.AddEnvironmentRequest): Promise<grackle.Environment>;
|
|
6
|
+
/** Update an existing environment's display name and/or adapter config. */
|
|
7
|
+
export declare function updateEnvironment(req: grackle.UpdateEnvironmentRequest): Promise<grackle.Environment>;
|
|
8
|
+
/** Remove an environment after disconnecting it and cleaning up references. */
|
|
9
|
+
export declare function removeEnvironment(req: grackle.EnvironmentId): Promise<grackle.Empty>;
|
|
10
|
+
/** Provision (bootstrap + connect) an environment, streaming progress events. */
|
|
11
|
+
export declare function provisionEnvironment(req: grackle.ProvisionEnvironmentRequest): AsyncGenerator<grackle.ProvisionEvent>;
|
|
12
|
+
/** Stop (disconnect) an environment. */
|
|
13
|
+
export declare function stopEnvironment(req: grackle.EnvironmentId): Promise<grackle.Empty>;
|
|
14
|
+
/** Destroy an environment and its underlying resources. */
|
|
15
|
+
export declare function destroyEnvironment(req: grackle.EnvironmentId): Promise<grackle.Empty>;
|
|
16
|
+
//# sourceMappingURL=environment-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment-handlers.d.ts","sourceRoot":"","sources":["../src/environment-handlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAc7C,wCAAwC;AACxC,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAKzE;AAED,kCAAkC;AAClC,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAerG;AAED,2EAA2E;AAC3E,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAsC3G;AAED,+EAA+E;AAC/E,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CA0C1F;AAED,iFAAiF;AACjF,wBAAuB,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,2BAA2B,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC,CAiH5H;AAED,wCAAwC;AACxC,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAexF;AAED,2DAA2D;AAC3D,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAe3F"}
|