@grackle-ai/plugin-core 0.96.3 → 0.98.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -0
- package/dist/grpc-proto-converters.d.ts +1 -3
- package/dist/grpc-proto-converters.d.ts.map +1 -1
- package/dist/grpc-proto-converters.js +0 -19
- package/dist/grpc-proto-converters.js.map +1 -1
- package/dist/grpc-service.d.ts +18 -0
- package/dist/grpc-service.d.ts.map +1 -1
- package/dist/grpc-service.js +35 -2
- package/dist/grpc-service.js.map +1 -1
- package/dist/index.d.ts +1 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/package.json +9 -10
- package/dist/cron-phase.d.ts +0 -46
- package/dist/cron-phase.d.ts.map +0 -1
- package/dist/cron-phase.js +0 -88
- package/dist/cron-phase.js.map +0 -1
- package/dist/schedule-expression.d.ts +0 -43
- package/dist/schedule-expression.d.ts.map +0 -1
- package/dist/schedule-expression.js +0 -105
- package/dist/schedule-expression.js.map +0 -1
- package/dist/schedule-handlers.d.ts +0 -12
- package/dist/schedule-handlers.d.ts.map +0 -1
- package/dist/schedule-handlers.js +0 -122
- package/dist/schedule-handlers.js.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# @grackle-ai/plugin-core
|
|
2
|
+
|
|
3
|
+
Built-in Grackle plugin — gRPC handlers, reconciliation phases, and event subscribers for the core server capabilities (environments, sessions, workspaces, schedules, tokens, codespaces, knowledge, settings).
|
|
4
|
+
|
|
5
|
+
Handler files live in this package. Orchestration concerns (tasks, personas, findings, escalations) are in `@grackle-ai/plugin-orchestration`.
|
|
6
|
+
|
|
7
|
+
## Handler Collectors
|
|
8
|
+
|
|
9
|
+
### `createCoreCollector()`
|
|
10
|
+
|
|
11
|
+
Returns a `ServiceCollector` with the 8 core handler groups (environments, sessions, workspaces, schedules, tokens, codespaces, knowledge, settings). Used by `@grackle-ai/server`'s core plugin.
|
|
12
|
+
|
|
13
|
+
### `createOrchestrationCollector()`
|
|
14
|
+
|
|
15
|
+
Returns a `ServiceCollector` with the 4 orchestration handler groups (tasks, personas, findings, escalations). Used by `@grackle-ai/plugin-orchestration`.
|
|
16
|
+
|
|
17
|
+
### `createDefaultCollector()`
|
|
18
|
+
|
|
19
|
+
Returns a `ServiceCollector` with all 12 handler groups combined. Use this when you need all handlers without the plugin split.
|
|
20
|
+
|
|
21
|
+
## Subscriber Factories
|
|
22
|
+
|
|
23
|
+
| Export | Description |
|
|
24
|
+
|---|---|
|
|
25
|
+
| `createLifecycleSubscriber` | Manages session lifecycle state transitions |
|
|
26
|
+
| `createRootTaskBootSubscriber` | Auto-starts the root task on server boot |
|
|
27
|
+
| `createSigchldSubscriber` | Handles agent process exit events |
|
|
28
|
+
| `createEscalationAutoSubscriber` | Auto-detects and routes escalations |
|
|
29
|
+
| `createOrphanReparentSubscriber` | Re-parents orphaned tasks after agent reconnect |
|
|
30
|
+
|
|
31
|
+
## Reconciliation Phases
|
|
32
|
+
|
|
33
|
+
| Export | Description |
|
|
34
|
+
|---|---|
|
|
35
|
+
| `createDispatchPhase` | Dispatches queued tasks to available environments |
|
|
36
|
+
| `createCronPhase` | Fires scheduled tasks when due |
|
|
37
|
+
| `lifecycleCleanupPhase` | Cleans up stale session lifecycle streams |
|
|
38
|
+
| `createOrphanPhase` | Re-parents orphaned tasks (used by orchestration plugin) |
|
|
39
|
+
| `createEnvironmentReconciliationPhase` | Reconciles environment connection status |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { grackle } from "@grackle-ai/common";
|
|
2
2
|
import type { EnvironmentRow, SessionRow } from "@grackle-ai/database";
|
|
3
|
-
import { workspaceStore, taskStore, personaStore, findingStore, escalationStore
|
|
3
|
+
import { workspaceStore, taskStore, personaStore, findingStore, escalationStore } from "@grackle-ai/database";
|
|
4
4
|
import type { KnowledgeNode, KnowledgeEdge } from "@grackle-ai/knowledge";
|
|
5
5
|
/** Convert an environment database row to its proto representation. */
|
|
6
6
|
export declare function envRowToProto(row: EnvironmentRow): grackle.Environment;
|
|
@@ -14,8 +14,6 @@ export declare function sessionRowToProto(row: SessionRow): grackle.Session;
|
|
|
14
14
|
export declare function workspaceRowToProto(row: workspaceStore.WorkspaceRow, linkedEnvMap?: Map<string, string[]>): grackle.Workspace;
|
|
15
15
|
/** Convert a task database row to its proto representation. */
|
|
16
16
|
export declare function taskRowToProto(row: taskStore.TaskRow, childIds?: string[], computedStatus?: string, latestSessionId?: string): grackle.Task;
|
|
17
|
-
/** Convert a schedule database row to its proto representation. */
|
|
18
|
-
export declare function scheduleRowToProto(row: scheduleStore.ScheduleRow): grackle.Schedule;
|
|
19
17
|
/** Convert a finding database row to its proto representation. */
|
|
20
18
|
export declare function findingRowToProto(row: findingStore.FindingRow): grackle.Finding;
|
|
21
19
|
/** Convert an escalation database row to its proto representation. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grpc-proto-converters.d.ts","sourceRoot":"","sources":["../src/grpc-proto-converters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAK7C,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"grpc-proto-converters.d.ts","sourceRoot":"","sources":["../src/grpc-proto-converters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAK7C,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAqD,MAAM,sBAAsB,CAAC;AACjK,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE1E,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAYtE;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAsBlE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,cAAc,CAAC,YAAY,EAChC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACnC,OAAO,CAAC,SAAS,CAoBnB;AAED,+DAA+D;AAC/D,wBAAgB,cAAc,CAC5B,GAAG,EAAE,SAAS,CAAC,OAAO,EACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,EACnB,cAAc,CAAC,EAAE,MAAM,EACvB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAyBd;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,CAK/E;AAED,sEAAsE;AACtE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,CAAC,aAAa,GAAG,OAAO,CAAC,UAAU,CAe3F;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAS1E;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,CAgE/E;AAED,2DAA2D;AAC3D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAepF;AAED,2DAA2D;AAC3D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAQpF"}
|
|
@@ -93,25 +93,6 @@ export function taskRowToProto(row, childIds, computedStatus, latestSessionId) {
|
|
|
93
93
|
costBudgetMillicents: row.costBudgetMillicents,
|
|
94
94
|
});
|
|
95
95
|
}
|
|
96
|
-
/** Convert a schedule database row to its proto representation. */
|
|
97
|
-
export function scheduleRowToProto(row) {
|
|
98
|
-
return create(grackle.ScheduleSchema, {
|
|
99
|
-
id: row.id,
|
|
100
|
-
title: row.title,
|
|
101
|
-
description: row.description,
|
|
102
|
-
scheduleExpression: row.scheduleExpression,
|
|
103
|
-
personaId: row.personaId,
|
|
104
|
-
environmentId: row.environmentId,
|
|
105
|
-
workspaceId: row.workspaceId,
|
|
106
|
-
parentTaskId: row.parentTaskId,
|
|
107
|
-
enabled: row.enabled,
|
|
108
|
-
lastRunAt: row.lastRunAt ?? "",
|
|
109
|
-
nextRunAt: row.nextRunAt ?? "",
|
|
110
|
-
runCount: row.runCount,
|
|
111
|
-
createdAt: row.createdAt,
|
|
112
|
-
updatedAt: row.updatedAt,
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
96
|
/** Convert a finding database row to its proto representation. */
|
|
116
97
|
export function findingRowToProto(row) {
|
|
117
98
|
return create(grackle.FindingSchema, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grpc-proto-converters.js","sourceRoot":"","sources":["../src/grpc-proto-converters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACL,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAkB,SAAS,
|
|
1
|
+
{"version":3,"file":"grpc-proto-converters.js","sourceRoot":"","sources":["../src/grpc-proto-converters.ts"],"names":[],"mappings":"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"}
|
package/dist/grpc-service.d.ts
CHANGED
|
@@ -16,6 +16,24 @@ import type { ConnectRouter } from "@connectrpc/connect";
|
|
|
16
16
|
* to add plugin-contributed handlers before calling `buildRoutes()`).
|
|
17
17
|
*/
|
|
18
18
|
export declare function createDefaultCollector(): ServiceCollector;
|
|
19
|
+
/**
|
|
20
|
+
* Create a `ServiceCollector` pre-loaded with only the core (non-orchestration,
|
|
21
|
+
* non-scheduling) Grackle handler groups: environments, sessions, workspaces,
|
|
22
|
+
* tokens, codespaces, knowledge, and settings.
|
|
23
|
+
*
|
|
24
|
+
* Orchestration handlers (tasks, personas, findings, escalations) are contributed
|
|
25
|
+
* by `@grackle-ai/plugin-orchestration` via {@link createOrchestrationCollector}.
|
|
26
|
+
* Schedule handlers are contributed by `@grackle-ai/plugin-scheduling`.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createCoreCollector(): ServiceCollector;
|
|
29
|
+
/**
|
|
30
|
+
* Create a `ServiceCollector` pre-loaded with only the orchestration handler
|
|
31
|
+
* groups: tasks, personas, findings, and escalations.
|
|
32
|
+
*
|
|
33
|
+
* Use this in `@grackle-ai/plugin-orchestration` to contribute the 21
|
|
34
|
+
* orchestration RPCs without duplicating the handler imports.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createOrchestrationCollector(): ServiceCollector;
|
|
19
37
|
/** Register all Grackle gRPC service handlers on the given ConnectRPC router. */
|
|
20
38
|
export declare function registerGrackleRoutes(router: ConnectRouter): void;
|
|
21
39
|
//# sourceMappingURL=grpc-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grpc-service.d.ts","sourceRoot":"","sources":["../src/grpc-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"grpc-service.d.ts","sourceRoot":"","sources":["../src/grpc-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAazD;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAczD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAUtD;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,IAAI,gBAAgB,CAO/D;AAED,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAEjE"}
|
package/dist/grpc-service.js
CHANGED
|
@@ -14,7 +14,6 @@ import * as sessions from "./session-handlers.js";
|
|
|
14
14
|
import * as tasks from "./task-handlers.js";
|
|
15
15
|
import * as workspaces from "./workspace-handlers.js";
|
|
16
16
|
import * as personas from "./persona-handlers.js";
|
|
17
|
-
import * as schedules from "./schedule-handlers.js";
|
|
18
17
|
import * as tokens from "./token-handlers.js";
|
|
19
18
|
import * as findings from "./finding-handlers.js";
|
|
20
19
|
import * as escalations from "./escalation-handlers.js";
|
|
@@ -34,7 +33,6 @@ export function createDefaultCollector() {
|
|
|
34
33
|
collector.addHandlers(grackle.Grackle, tasks);
|
|
35
34
|
collector.addHandlers(grackle.Grackle, workspaces);
|
|
36
35
|
collector.addHandlers(grackle.Grackle, personas);
|
|
37
|
-
collector.addHandlers(grackle.Grackle, schedules);
|
|
38
36
|
collector.addHandlers(grackle.Grackle, tokens);
|
|
39
37
|
collector.addHandlers(grackle.Grackle, findings);
|
|
40
38
|
collector.addHandlers(grackle.Grackle, escalations);
|
|
@@ -43,6 +41,41 @@ export function createDefaultCollector() {
|
|
|
43
41
|
collector.addHandlers(grackle.Grackle, settings);
|
|
44
42
|
return collector;
|
|
45
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Create a `ServiceCollector` pre-loaded with only the core (non-orchestration,
|
|
46
|
+
* non-scheduling) Grackle handler groups: environments, sessions, workspaces,
|
|
47
|
+
* tokens, codespaces, knowledge, and settings.
|
|
48
|
+
*
|
|
49
|
+
* Orchestration handlers (tasks, personas, findings, escalations) are contributed
|
|
50
|
+
* by `@grackle-ai/plugin-orchestration` via {@link createOrchestrationCollector}.
|
|
51
|
+
* Schedule handlers are contributed by `@grackle-ai/plugin-scheduling`.
|
|
52
|
+
*/
|
|
53
|
+
export function createCoreCollector() {
|
|
54
|
+
const collector = createServiceCollector();
|
|
55
|
+
collector.addHandlers(grackle.Grackle, environments);
|
|
56
|
+
collector.addHandlers(grackle.Grackle, sessions);
|
|
57
|
+
collector.addHandlers(grackle.Grackle, workspaces);
|
|
58
|
+
collector.addHandlers(grackle.Grackle, tokens);
|
|
59
|
+
collector.addHandlers(grackle.Grackle, codespaces);
|
|
60
|
+
collector.addHandlers(grackle.Grackle, knowledge);
|
|
61
|
+
collector.addHandlers(grackle.Grackle, settings);
|
|
62
|
+
return collector;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create a `ServiceCollector` pre-loaded with only the orchestration handler
|
|
66
|
+
* groups: tasks, personas, findings, and escalations.
|
|
67
|
+
*
|
|
68
|
+
* Use this in `@grackle-ai/plugin-orchestration` to contribute the 21
|
|
69
|
+
* orchestration RPCs without duplicating the handler imports.
|
|
70
|
+
*/
|
|
71
|
+
export function createOrchestrationCollector() {
|
|
72
|
+
const collector = createServiceCollector();
|
|
73
|
+
collector.addHandlers(grackle.Grackle, tasks);
|
|
74
|
+
collector.addHandlers(grackle.Grackle, personas);
|
|
75
|
+
collector.addHandlers(grackle.Grackle, findings);
|
|
76
|
+
collector.addHandlers(grackle.Grackle, escalations);
|
|
77
|
+
return collector;
|
|
78
|
+
}
|
|
46
79
|
/** Register all Grackle gRPC service handlers on the given ConnectRPC router. */
|
|
47
80
|
export function registerGrackleRoutes(router) {
|
|
48
81
|
createDefaultCollector().buildRoutes()(router);
|
package/dist/grpc-service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grpc-service.js","sourceRoot":"","sources":["../src/grpc-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAyB,MAAM,kBAAkB,CAAC;AAEjF,OAAO,KAAK,YAAY,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,QAAQ,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,KAAK,MAAM,oBAAoB,CAAC;AAC5C,OAAO,KAAK,UAAU,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,QAAQ,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"grpc-service.js","sourceRoot":"","sources":["../src/grpc-service.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
export { createDefaultCollector, registerGrackleRoutes } from "./grpc-service.js";
|
|
1
|
+
export { createCoreCollector, createOrchestrationCollector, createDefaultCollector, registerGrackleRoutes } from "./grpc-service.js";
|
|
2
2
|
export { createLifecycleSubscriber } from "./lifecycle.js";
|
|
3
3
|
export { createSigchldSubscriber } from "./signals/sigchld.js";
|
|
4
4
|
export { createEscalationAutoSubscriber } from "./signals/escalation-auto.js";
|
|
5
5
|
export { createOrphanReparentSubscriber, transferAllPipeSubscriptions } from "./signals/orphan-reparent.js";
|
|
6
6
|
export { createRootTaskBootSubscriber } from "./root-task-boot.js";
|
|
7
7
|
export type { RootTaskBootDeps } from "./root-task-boot.js";
|
|
8
|
-
export { createCronPhase } from "./cron-phase.js";
|
|
9
|
-
export type { CronPhaseDeps } from "./cron-phase.js";
|
|
10
8
|
export { createDispatchPhase } from "./dispatch-phase.js";
|
|
11
9
|
export type { DispatchPhaseDeps } from "./dispatch-phase.js";
|
|
12
10
|
export { createOrphanPhase } from "./orphan-phase.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAGrI,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5G,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,oCAAoC,EAAE,MAAM,iCAAiC,CAAC;AACvF,YAAY,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAGrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAGzD,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ─── gRPC Handler Aggregator ─────────────────────────────────
|
|
2
|
-
export { createDefaultCollector, registerGrackleRoutes } from "./grpc-service.js";
|
|
2
|
+
export { createCoreCollector, createOrchestrationCollector, createDefaultCollector, registerGrackleRoutes } from "./grpc-service.js";
|
|
3
3
|
// ─── Subscriber Factories ───────────────────────────────────
|
|
4
4
|
export { createLifecycleSubscriber } from "./lifecycle.js";
|
|
5
5
|
export { createSigchldSubscriber } from "./signals/sigchld.js";
|
|
@@ -7,7 +7,6 @@ export { createEscalationAutoSubscriber } from "./signals/escalation-auto.js";
|
|
|
7
7
|
export { createOrphanReparentSubscriber, transferAllPipeSubscriptions } from "./signals/orphan-reparent.js";
|
|
8
8
|
export { createRootTaskBootSubscriber } from "./root-task-boot.js";
|
|
9
9
|
// ─── Reconciliation Phases ──────────────────────────────────
|
|
10
|
-
export { createCronPhase } from "./cron-phase.js";
|
|
11
10
|
export { createDispatchPhase } from "./dispatch-phase.js";
|
|
12
11
|
export { createOrphanPhase } from "./orphan-phase.js";
|
|
13
12
|
export { lifecycleCleanupPhase } from "./lifecycle-cleanup.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAErI,+DAA+D;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5G,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAGnE,+DAA+D;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,oCAAoC,EAAE,MAAM,iCAAiC,CAAC;AAGvF,+DAA+D;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,+DAA+D;AAC/D,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grackle-ai/plugin-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.98.0",
|
|
4
4
|
"description": "Core plugin for Grackle — gRPC handlers, reconciliation phases, and event subscribers",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -30,18 +30,17 @@
|
|
|
30
30
|
"@bufbuild/protobuf": "^2.5.0",
|
|
31
31
|
"@connectrpc/connect": "^2.0.0",
|
|
32
32
|
"@connectrpc/connect-node": "^2.0.0",
|
|
33
|
-
"cron-parser": "^4.9.0",
|
|
34
33
|
"pino": "^10.3.1",
|
|
35
34
|
"ulid": "^2.3.0",
|
|
36
35
|
"uuid": "^11.0.0",
|
|
37
|
-
"@grackle-ai/adapter-sdk": "0.
|
|
38
|
-
"@grackle-ai/auth": "0.
|
|
39
|
-
"@grackle-ai/common": "0.
|
|
40
|
-
"@grackle-ai/database": "0.
|
|
41
|
-
"@grackle-ai/core": "0.
|
|
42
|
-
"@grackle-ai/
|
|
43
|
-
"@grackle-ai/
|
|
44
|
-
"@grackle-ai/prompt": "0.
|
|
36
|
+
"@grackle-ai/adapter-sdk": "0.98.0",
|
|
37
|
+
"@grackle-ai/auth": "0.98.0",
|
|
38
|
+
"@grackle-ai/common": "0.98.0",
|
|
39
|
+
"@grackle-ai/database": "0.98.0",
|
|
40
|
+
"@grackle-ai/core": "0.98.0",
|
|
41
|
+
"@grackle-ai/knowledge": "0.98.0",
|
|
42
|
+
"@grackle-ai/plugin-sdk": "0.98.0",
|
|
43
|
+
"@grackle-ai/prompt": "0.98.0"
|
|
45
44
|
},
|
|
46
45
|
"devDependencies": {
|
|
47
46
|
"@rushstack/heft": "1.2.7",
|
package/dist/cron-phase.d.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
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
|
package/dist/cron-phase.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/cron-phase.js
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
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
|
package/dist/cron-phase.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cron-phase.js","sourceRoot":"","sources":["../src/cron-phase.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Schedule expression parsing and next-run-time computation.
|
|
3
|
-
*
|
|
4
|
-
* Supports two formats:
|
|
5
|
-
* - **Interval shorthand**: `"<number><unit>"` where unit is s/m/h/d (min 10s)
|
|
6
|
-
* - **Cron expressions**: Standard 5-field cron syntax via `cron-parser`
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* Parse an interval shorthand expression to milliseconds.
|
|
10
|
-
*
|
|
11
|
-
* @param expr - e.g. "30s", "5m", "1h", "1d"
|
|
12
|
-
* @returns Duration in milliseconds
|
|
13
|
-
* @throws If the expression is invalid or below the minimum (10s)
|
|
14
|
-
*/
|
|
15
|
-
export declare function parseDuration(expr: string): number;
|
|
16
|
-
/**
|
|
17
|
-
* Detect whether an expression is interval shorthand (vs. cron).
|
|
18
|
-
*
|
|
19
|
-
* @param expr - Schedule expression string
|
|
20
|
-
* @returns true if the expression matches interval shorthand format
|
|
21
|
-
*/
|
|
22
|
-
export declare function isIntervalExpression(expr: string): boolean;
|
|
23
|
-
/**
|
|
24
|
-
* Compute the next run time for a schedule expression.
|
|
25
|
-
*
|
|
26
|
-
* For intervals: if `lastRunAt + interval` is in the future, use that (prevents
|
|
27
|
-
* drift). Otherwise use `now + interval` (prevents burst-firing after downtime).
|
|
28
|
-
*
|
|
29
|
-
* For cron: next occurrence after now.
|
|
30
|
-
*
|
|
31
|
-
* @param expr - Schedule expression (interval or cron)
|
|
32
|
-
* @param lastRunAt - ISO timestamp of the last fire (undefined for first fire)
|
|
33
|
-
* @returns ISO timestamp of the next fire
|
|
34
|
-
*/
|
|
35
|
-
export declare function computeNextRunAt(expr: string, lastRunAt?: string): string;
|
|
36
|
-
/**
|
|
37
|
-
* Validate a schedule expression. Throws if invalid.
|
|
38
|
-
*
|
|
39
|
-
* @param expr - Schedule expression to validate
|
|
40
|
-
* @throws If the expression is neither valid interval shorthand nor valid cron
|
|
41
|
-
*/
|
|
42
|
-
export declare function validateExpression(expr: string): void;
|
|
43
|
-
//# sourceMappingURL=schedule-expression.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schedule-expression.d.ts","sourceRoot":"","sources":["../src/schedule-expression.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBlD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAwBzE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAmBrD"}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Schedule expression parsing and next-run-time computation.
|
|
3
|
-
*
|
|
4
|
-
* Supports two formats:
|
|
5
|
-
* - **Interval shorthand**: `"<number><unit>"` where unit is s/m/h/d (min 10s)
|
|
6
|
-
* - **Cron expressions**: Standard 5-field cron syntax via `cron-parser`
|
|
7
|
-
*/
|
|
8
|
-
import cronParser from "cron-parser";
|
|
9
|
-
const INTERVAL_RE = /^(\d+)([smhd])$/;
|
|
10
|
-
const MINIMUM_INTERVAL_MS = 10_000; // 10 seconds
|
|
11
|
-
const UNIT_TO_MS = {
|
|
12
|
-
s: 1_000,
|
|
13
|
-
m: 60_000,
|
|
14
|
-
h: 3_600_000,
|
|
15
|
-
d: 86_400_000,
|
|
16
|
-
};
|
|
17
|
-
/**
|
|
18
|
-
* Parse an interval shorthand expression to milliseconds.
|
|
19
|
-
*
|
|
20
|
-
* @param expr - e.g. "30s", "5m", "1h", "1d"
|
|
21
|
-
* @returns Duration in milliseconds
|
|
22
|
-
* @throws If the expression is invalid or below the minimum (10s)
|
|
23
|
-
*/
|
|
24
|
-
export function parseDuration(expr) {
|
|
25
|
-
const match = INTERVAL_RE.exec(expr);
|
|
26
|
-
if (!match) {
|
|
27
|
-
throw new Error(`Invalid interval expression: "${expr}". Expected format: <number><s|m|h|d> (e.g. "30s", "5m")`);
|
|
28
|
-
}
|
|
29
|
-
const value = parseInt(match[1], 10);
|
|
30
|
-
const unit = match[2];
|
|
31
|
-
const ms = value * UNIT_TO_MS[unit];
|
|
32
|
-
if (ms <= 0) {
|
|
33
|
-
throw new Error(`Interval must be positive: "${expr}"`);
|
|
34
|
-
}
|
|
35
|
-
if (ms < MINIMUM_INTERVAL_MS) {
|
|
36
|
-
throw new Error(`Interval "${expr}" (${ms}ms) is below the minimum of ${MINIMUM_INTERVAL_MS}ms (10s)`);
|
|
37
|
-
}
|
|
38
|
-
return ms;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Detect whether an expression is interval shorthand (vs. cron).
|
|
42
|
-
*
|
|
43
|
-
* @param expr - Schedule expression string
|
|
44
|
-
* @returns true if the expression matches interval shorthand format
|
|
45
|
-
*/
|
|
46
|
-
export function isIntervalExpression(expr) {
|
|
47
|
-
return INTERVAL_RE.test(expr);
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Compute the next run time for a schedule expression.
|
|
51
|
-
*
|
|
52
|
-
* For intervals: if `lastRunAt + interval` is in the future, use that (prevents
|
|
53
|
-
* drift). Otherwise use `now + interval` (prevents burst-firing after downtime).
|
|
54
|
-
*
|
|
55
|
-
* For cron: next occurrence after now.
|
|
56
|
-
*
|
|
57
|
-
* @param expr - Schedule expression (interval or cron)
|
|
58
|
-
* @param lastRunAt - ISO timestamp of the last fire (undefined for first fire)
|
|
59
|
-
* @returns ISO timestamp of the next fire
|
|
60
|
-
*/
|
|
61
|
-
export function computeNextRunAt(expr, lastRunAt) {
|
|
62
|
-
const now = Date.now();
|
|
63
|
-
if (isIntervalExpression(expr)) {
|
|
64
|
-
const intervalMs = parseDuration(expr);
|
|
65
|
-
const nowPlusInterval = now + intervalMs;
|
|
66
|
-
if (lastRunAt) {
|
|
67
|
-
const lastRunMs = new Date(lastRunAt).getTime();
|
|
68
|
-
const anchored = lastRunMs + intervalMs;
|
|
69
|
-
// Anchored: use lastRunAt + interval if it's in the future (prevents drift).
|
|
70
|
-
// If it's in the past (server was down), cap to now + interval (prevents burst).
|
|
71
|
-
if (anchored > now) {
|
|
72
|
-
return new Date(anchored).toISOString();
|
|
73
|
-
}
|
|
74
|
-
return new Date(nowPlusInterval).toISOString();
|
|
75
|
-
}
|
|
76
|
-
return new Date(nowPlusInterval).toISOString();
|
|
77
|
-
}
|
|
78
|
-
// Cron expression: compute next occurrence after now
|
|
79
|
-
const interval = cronParser.parseExpression(expr, { utc: true });
|
|
80
|
-
return interval.next().toISOString();
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Validate a schedule expression. Throws if invalid.
|
|
84
|
-
*
|
|
85
|
-
* @param expr - Schedule expression to validate
|
|
86
|
-
* @throws If the expression is neither valid interval shorthand nor valid cron
|
|
87
|
-
*/
|
|
88
|
-
export function validateExpression(expr) {
|
|
89
|
-
if (!expr) {
|
|
90
|
-
throw new Error("Schedule expression cannot be empty");
|
|
91
|
-
}
|
|
92
|
-
if (isIntervalExpression(expr)) {
|
|
93
|
-
// parseDuration validates format and minimum
|
|
94
|
-
parseDuration(expr);
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
// Try to parse as cron
|
|
98
|
-
try {
|
|
99
|
-
cronParser.parseExpression(expr, { utc: true });
|
|
100
|
-
}
|
|
101
|
-
catch {
|
|
102
|
-
throw new Error(`Invalid schedule expression: "${expr}". Must be interval shorthand (e.g. "30s", "5m") or 5-field cron (e.g. "0 9 * * MON")`);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
//# sourceMappingURL=schedule-expression.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schedule-expression.js","sourceRoot":"","sources":["../src/schedule-expression.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { grackle } from "@grackle-ai/common";
|
|
2
|
-
/** Create a new schedule. */
|
|
3
|
-
export declare function createSchedule(req: grackle.CreateScheduleRequest): Promise<grackle.Schedule>;
|
|
4
|
-
/** List all schedules, optionally filtered by workspace. */
|
|
5
|
-
export declare function listSchedules(req: grackle.ListSchedulesRequest): Promise<grackle.ScheduleList>;
|
|
6
|
-
/** Get a schedule by ID. */
|
|
7
|
-
export declare function getSchedule(req: grackle.ScheduleId): Promise<grackle.Schedule>;
|
|
8
|
-
/** Update an existing schedule. */
|
|
9
|
-
export declare function updateSchedule(req: grackle.UpdateScheduleRequest): Promise<grackle.Schedule>;
|
|
10
|
-
/** Delete a schedule by ID. */
|
|
11
|
-
export declare function deleteSchedule(req: grackle.ScheduleId): Promise<grackle.Empty>;
|
|
12
|
-
//# sourceMappingURL=schedule-handlers.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schedule-handlers.d.ts","sourceRoot":"","sources":["../src/schedule-handlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAO7C,6BAA6B;AAC7B,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CA2ClG;AAED,4DAA4D;AAC5D,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAKpG;AAED,4BAA4B;AAC5B,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAMpF;AAED,mCAAmC;AACnC,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CA6DlG;AAED,+BAA+B;AAC/B,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAIpF"}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { ConnectError, Code } from "@connectrpc/connect";
|
|
2
|
-
import { create } from "@bufbuild/protobuf";
|
|
3
|
-
import { grackle } from "@grackle-ai/common";
|
|
4
|
-
import { personaStore, scheduleStore } from "@grackle-ai/database";
|
|
5
|
-
import { v4 as uuid } from "uuid";
|
|
6
|
-
import { validateExpression, computeNextRunAt } from "./schedule-expression.js";
|
|
7
|
-
import { emit } from "@grackle-ai/core";
|
|
8
|
-
import { scheduleRowToProto } from "./grpc-proto-converters.js";
|
|
9
|
-
/** Create a new schedule. */
|
|
10
|
-
export async function createSchedule(req) {
|
|
11
|
-
const title = req.title.trim();
|
|
12
|
-
const expr = req.scheduleExpression.trim();
|
|
13
|
-
const personaId = req.personaId.trim();
|
|
14
|
-
if (!title) {
|
|
15
|
-
throw new ConnectError("title is required", Code.InvalidArgument);
|
|
16
|
-
}
|
|
17
|
-
if (!expr) {
|
|
18
|
-
throw new ConnectError("schedule_expression is required", Code.InvalidArgument);
|
|
19
|
-
}
|
|
20
|
-
if (!personaId) {
|
|
21
|
-
throw new ConnectError("persona_id is required", Code.InvalidArgument);
|
|
22
|
-
}
|
|
23
|
-
// Validate persona exists
|
|
24
|
-
const persona = personaStore.getPersona(personaId);
|
|
25
|
-
if (!persona) {
|
|
26
|
-
throw new ConnectError(`Persona not found: ${personaId}`, Code.NotFound);
|
|
27
|
-
}
|
|
28
|
-
// Validate expression
|
|
29
|
-
try {
|
|
30
|
-
validateExpression(expr);
|
|
31
|
-
}
|
|
32
|
-
catch (err) {
|
|
33
|
-
throw new ConnectError(err instanceof Error ? err.message : "Invalid schedule expression", Code.InvalidArgument);
|
|
34
|
-
}
|
|
35
|
-
const id = uuid();
|
|
36
|
-
const nextRunAt = computeNextRunAt(expr);
|
|
37
|
-
scheduleStore.createSchedule(id, title, req.description, expr, personaId, req.environmentId, req.workspaceId, req.parentTaskId, nextRunAt);
|
|
38
|
-
emit("schedule.created", { scheduleId: id });
|
|
39
|
-
const row = scheduleStore.getSchedule(id);
|
|
40
|
-
return scheduleRowToProto(row);
|
|
41
|
-
}
|
|
42
|
-
/** List all schedules, optionally filtered by workspace. */
|
|
43
|
-
export async function listSchedules(req) {
|
|
44
|
-
const rows = scheduleStore.listSchedules(req.workspaceId || undefined);
|
|
45
|
-
return create(grackle.ScheduleListSchema, {
|
|
46
|
-
schedules: rows.map(scheduleRowToProto),
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
/** Get a schedule by ID. */
|
|
50
|
-
export async function getSchedule(req) {
|
|
51
|
-
const row = scheduleStore.getSchedule(req.id);
|
|
52
|
-
if (!row) {
|
|
53
|
-
throw new ConnectError(`Schedule not found: ${req.id}`, Code.NotFound);
|
|
54
|
-
}
|
|
55
|
-
return scheduleRowToProto(row);
|
|
56
|
-
}
|
|
57
|
-
/** Update an existing schedule. */
|
|
58
|
-
export async function updateSchedule(req) {
|
|
59
|
-
const existing = scheduleStore.getSchedule(req.id);
|
|
60
|
-
if (!existing) {
|
|
61
|
-
throw new ConnectError(`Schedule not found: ${req.id}`, Code.NotFound);
|
|
62
|
-
}
|
|
63
|
-
const update = {};
|
|
64
|
-
if (req.title !== undefined && req.title.trim() !== "") {
|
|
65
|
-
update.title = req.title.trim();
|
|
66
|
-
}
|
|
67
|
-
if (req.description !== undefined) {
|
|
68
|
-
update.description = req.description;
|
|
69
|
-
}
|
|
70
|
-
if (req.personaId !== undefined && req.personaId.trim() !== "") {
|
|
71
|
-
const trimmedPersonaId = req.personaId.trim();
|
|
72
|
-
const persona = personaStore.getPersona(trimmedPersonaId);
|
|
73
|
-
if (!persona) {
|
|
74
|
-
throw new ConnectError(`Persona not found: ${trimmedPersonaId}`, Code.NotFound);
|
|
75
|
-
}
|
|
76
|
-
update.personaId = trimmedPersonaId;
|
|
77
|
-
}
|
|
78
|
-
if (req.environmentId !== undefined) {
|
|
79
|
-
update.environmentId = req.environmentId;
|
|
80
|
-
}
|
|
81
|
-
// Handle schedule expression change
|
|
82
|
-
let expressionChanged = false;
|
|
83
|
-
if (req.scheduleExpression !== undefined && req.scheduleExpression !== "") {
|
|
84
|
-
const expr = req.scheduleExpression.trim();
|
|
85
|
-
try {
|
|
86
|
-
validateExpression(expr);
|
|
87
|
-
}
|
|
88
|
-
catch (err) {
|
|
89
|
-
throw new ConnectError(err instanceof Error ? err.message : "Invalid schedule expression", Code.InvalidArgument);
|
|
90
|
-
}
|
|
91
|
-
update.scheduleExpression = expr;
|
|
92
|
-
expressionChanged = true;
|
|
93
|
-
}
|
|
94
|
-
// Handle enable/disable
|
|
95
|
-
if (req.enabled !== undefined) {
|
|
96
|
-
update.enabled = req.enabled;
|
|
97
|
-
if (req.enabled) {
|
|
98
|
-
const expr = update.scheduleExpression ?? existing.scheduleExpression;
|
|
99
|
-
update.nextRunAt = computeNextRunAt(expr);
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
update.nextRunAt = null;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
else if (expressionChanged) {
|
|
106
|
-
// Recompute nextRunAt when expression changes (if currently enabled)
|
|
107
|
-
if (existing.enabled) {
|
|
108
|
-
update.nextRunAt = computeNextRunAt(update.scheduleExpression);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
scheduleStore.updateSchedule(req.id, update);
|
|
112
|
-
emit("schedule.updated", { scheduleId: req.id });
|
|
113
|
-
const row = scheduleStore.getSchedule(req.id);
|
|
114
|
-
return scheduleRowToProto(row);
|
|
115
|
-
}
|
|
116
|
-
/** Delete a schedule by ID. */
|
|
117
|
-
export async function deleteSchedule(req) {
|
|
118
|
-
scheduleStore.deleteSchedule(req.id);
|
|
119
|
-
emit("schedule.deleted", { scheduleId: req.id });
|
|
120
|
-
return create(grackle.EmptySchema, {});
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=schedule-handlers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schedule-handlers.js","sourceRoot":"","sources":["../src/schedule-handlers.ts"],"names":[],"mappings":"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"}
|