@grackle-ai/core 0.82.2 → 0.83.1

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.
Files changed (103) hide show
  1. package/dist/codespace-handlers.d.ts +6 -0
  2. package/dist/codespace-handlers.d.ts.map +1 -0
  3. package/dist/codespace-handlers.js +66 -0
  4. package/dist/codespace-handlers.js.map +1 -0
  5. package/dist/cron-phase.d.ts +1 -1
  6. package/dist/cron-phase.d.ts.map +1 -1
  7. package/dist/cron-phase.js +1 -1
  8. package/dist/cron-phase.js.map +1 -1
  9. package/dist/environment-handlers.d.ts +16 -0
  10. package/dist/environment-handlers.d.ts.map +1 -0
  11. package/dist/environment-handlers.js +237 -0
  12. package/dist/environment-handlers.js.map +1 -0
  13. package/dist/event-bus.d.ts +1 -1
  14. package/dist/event-bus.d.ts.map +1 -1
  15. package/dist/event-bus.js.map +1 -1
  16. package/dist/event-hub.d.ts +29 -0
  17. package/dist/event-hub.d.ts.map +1 -0
  18. package/dist/event-hub.js +89 -0
  19. package/dist/event-hub.js.map +1 -0
  20. package/dist/finding-handlers.d.ts +6 -0
  21. package/dist/finding-handlers.d.ts.map +1 -0
  22. package/dist/finding-handlers.js +27 -0
  23. package/dist/finding-handlers.js.map +1 -0
  24. package/dist/grpc-mcp-config.d.ts +11 -0
  25. package/dist/grpc-mcp-config.d.ts.map +1 -0
  26. package/dist/grpc-mcp-config.js +29 -0
  27. package/dist/grpc-mcp-config.js.map +1 -0
  28. package/dist/grpc-proto-converters.d.ts +25 -0
  29. package/dist/grpc-proto-converters.d.ts.map +1 -0
  30. package/dist/grpc-proto-converters.js +193 -0
  31. package/dist/grpc-proto-converters.js.map +1 -0
  32. package/dist/grpc-service.d.ts +3 -19
  33. package/dist/grpc-service.d.ts.map +1 -1
  34. package/dist/grpc-service.js +28 -1989
  35. package/dist/grpc-service.js.map +1 -1
  36. package/dist/grpc-shared.d.ts +25 -0
  37. package/dist/grpc-shared.d.ts.map +1 -0
  38. package/dist/grpc-shared.js +110 -0
  39. package/dist/grpc-shared.js.map +1 -0
  40. package/dist/index.d.ts +4 -2
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +4 -3
  43. package/dist/index.js.map +1 -1
  44. package/dist/knowledge-handlers.d.ts +12 -0
  45. package/dist/knowledge-handlers.d.ts.map +1 -0
  46. package/dist/knowledge-handlers.js +85 -0
  47. package/dist/knowledge-handlers.js.map +1 -0
  48. package/dist/orphan-phase.d.ts +27 -0
  49. package/dist/orphan-phase.d.ts.map +1 -0
  50. package/dist/orphan-phase.js +69 -0
  51. package/dist/orphan-phase.js.map +1 -0
  52. package/dist/persona-handlers.d.ts +12 -0
  53. package/dist/persona-handlers.d.ts.map +1 -0
  54. package/dist/persona-handlers.js +148 -0
  55. package/dist/persona-handlers.js.map +1 -0
  56. package/dist/schedule-handlers.d.ts +12 -0
  57. package/dist/schedule-handlers.d.ts.map +1 -0
  58. package/dist/schedule-handlers.js +122 -0
  59. package/dist/schedule-handlers.js.map +1 -0
  60. package/dist/session-handlers.d.ts +34 -0
  61. package/dist/session-handlers.d.ts.map +1 -0
  62. package/dist/session-handlers.js +488 -0
  63. package/dist/session-handlers.js.map +1 -0
  64. package/dist/settings-handlers.d.ts +10 -0
  65. package/dist/settings-handlers.d.ts.map +1 -0
  66. package/dist/settings-handlers.js +68 -0
  67. package/dist/settings-handlers.js.map +1 -0
  68. package/dist/signals/orphan-reparent.d.ts +30 -0
  69. package/dist/signals/orphan-reparent.d.ts.map +1 -0
  70. package/dist/signals/orphan-reparent.js +179 -0
  71. package/dist/signals/orphan-reparent.js.map +1 -0
  72. package/dist/signals/sigchld.d.ts.map +1 -1
  73. package/dist/signals/sigchld.js +4 -8
  74. package/dist/signals/sigchld.js.map +1 -1
  75. package/dist/task-handlers.d.ts +22 -0
  76. package/dist/task-handlers.d.ts.map +1 -0
  77. package/dist/task-handlers.js +463 -0
  78. package/dist/task-handlers.js.map +1 -0
  79. package/dist/task-session.d.ts +26 -0
  80. package/dist/task-session.d.ts.map +1 -0
  81. package/dist/task-session.js +132 -0
  82. package/dist/task-session.js.map +1 -0
  83. package/dist/test-utils/mock-database.d.ts +2 -0
  84. package/dist/test-utils/mock-database.d.ts.map +1 -1
  85. package/dist/test-utils/mock-database.js +2 -0
  86. package/dist/test-utils/mock-database.js.map +1 -1
  87. package/dist/token-handlers.d.ts +12 -0
  88. package/dist/token-handlers.d.ts.map +1 -0
  89. package/dist/token-handlers.js +85 -0
  90. package/dist/token-handlers.js.map +1 -0
  91. package/dist/workspace-handlers.d.ts +12 -0
  92. package/dist/workspace-handlers.d.ts.map +1 -0
  93. package/dist/workspace-handlers.js +86 -0
  94. package/dist/workspace-handlers.js.map +1 -0
  95. package/package.json +7 -9
  96. package/dist/ws-bridge.d.ts +0 -30
  97. package/dist/ws-bridge.d.ts.map +0 -1
  98. package/dist/ws-bridge.js +0 -372
  99. package/dist/ws-bridge.js.map +0 -1
  100. package/dist/ws-broadcast.d.ts +0 -19
  101. package/dist/ws-broadcast.d.ts.map +0 -1
  102. package/dist/ws-broadcast.js +0 -60
  103. package/dist/ws-broadcast.js.map +0 -1
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Orphan reconciliation phase — periodic safety net for orphaned tasks.
3
+ *
4
+ * Sweeps all tasks for children whose parent is in a terminal state but
5
+ * haven't been reparented by the event-driven handler. This catches edge
6
+ * cases like server restarts, race conditions, or missed events.
7
+ */
8
+ import { ROOT_TASK_ID, TASK_STATUS } from "@grackle-ai/common";
9
+ import { logger } from "./logger.js";
10
+ /** Terminal task statuses that indicate the parent is done. */
11
+ const TERMINAL_TASK_STATUSES = new Set([
12
+ TASK_STATUS.COMPLETE,
13
+ TASK_STATUS.FAILED,
14
+ ]);
15
+ /**
16
+ * Create the orphan reconciliation phase.
17
+ *
18
+ * @param deps - Injected dependencies for testability.
19
+ * @returns A ReconciliationPhase that can be registered with the ReconciliationManager.
20
+ */
21
+ export function createOrphanPhase(deps) {
22
+ return {
23
+ name: "orphan-reparent",
24
+ execute: async () => {
25
+ const allTasks = deps.listAllTasks();
26
+ // Build a lookup map for quick parent resolution
27
+ const taskById = new Map(allTasks.map((t) => [t.id, t]));
28
+ let reparentCount = 0;
29
+ for (const task of allTasks) {
30
+ // Skip root tasks and tasks with no parent
31
+ if (!task.parentTaskId || task.parentTaskId === ROOT_TASK_ID) {
32
+ continue;
33
+ }
34
+ // Skip terminal tasks (they don't need reparenting)
35
+ if (TERMINAL_TASK_STATUSES.has(task.status)) {
36
+ continue;
37
+ }
38
+ // Check if parent is terminal
39
+ const parent = taskById.get(task.parentTaskId);
40
+ if (!parent || !TERMINAL_TASK_STATUSES.has(parent.status)) {
41
+ continue;
42
+ }
43
+ // This is an orphan! Reparent to grandparent (or root)
44
+ const grandparentId = parent.parentTaskId || ROOT_TASK_ID;
45
+ try {
46
+ deps.reparentTask(task.id, grandparentId);
47
+ deps.emit("task.reparented", {
48
+ taskId: task.id,
49
+ oldParentTaskId: task.parentTaskId,
50
+ newParentTaskId: grandparentId,
51
+ workspaceId: task.workspaceId || "",
52
+ });
53
+ deps.emit("task.updated", {
54
+ taskId: task.id,
55
+ workspaceId: task.workspaceId || "",
56
+ });
57
+ reparentCount++;
58
+ }
59
+ catch (err) {
60
+ logger.error({ err, taskId: task.id, parentTaskId: task.parentTaskId, grandparentId }, "Orphan phase: failed to reparent task");
61
+ }
62
+ }
63
+ if (reparentCount > 0) {
64
+ logger.warn({ reparentCount }, "Orphan phase: reparented %d orphaned task(s) — these should have been caught by the event-driven handler", reparentCount);
65
+ }
66
+ },
67
+ };
68
+ }
69
+ //# sourceMappingURL=orphan-phase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphan-phase.js","sourceRoot":"","sources":["../src/orphan-phase.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAKrC,+DAA+D;AAC/D,MAAM,sBAAsB,GAAwB,IAAI,GAAG,CAAC;IAC1D,WAAW,CAAC,QAAQ;IACpB,WAAW,CAAC,MAAM;CACnB,CAAC,CAAC;AAYH;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAqB;IACrD,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAErC,iDAAiD;YACjD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAkB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAE1E,IAAI,aAAa,GAAG,CAAC,CAAC;YAEtB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,2CAA2C;gBAC3C,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;oBAC7D,SAAS;gBACX,CAAC;gBAED,oDAAoD;gBACpD,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC5C,SAAS;gBACX,CAAC;gBAED,8BAA8B;gBAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC/C,IAAI,CAAC,MAAM,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC1D,SAAS;gBACX,CAAC;gBAED,uDAAuD;gBACvD,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,IAAI,YAAY,CAAC;gBAE1D,IAAI,CAAC;oBACH,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;oBAC1C,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;wBAC3B,MAAM,EAAE,IAAI,CAAC,EAAE;wBACf,eAAe,EAAE,IAAI,CAAC,YAAY;wBAClC,eAAe,EAAE,aAAa;wBAC9B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;qBACpC,CAAC,CAAC;oBACH,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;wBACxB,MAAM,EAAE,IAAI,CAAC,EAAE;wBACf,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;qBACpC,CAAC,CAAC;oBACH,aAAa,EAAE,CAAC;gBAClB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,KAAK,CACV,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,EAAE,EACxE,uCAAuC,CACxC,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CACT,EAAE,aAAa,EAAE,EACjB,0GAA0G,EAC1G,aAAa,CACd,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { grackle } from "@grackle-ai/common";
2
+ /** List all personas. */
3
+ export declare function listPersonas(): Promise<grackle.PersonaList>;
4
+ /** Create a new persona. */
5
+ export declare function createPersona(req: grackle.CreatePersonaRequest): Promise<grackle.Persona>;
6
+ /** Get a persona by ID. */
7
+ export declare function getPersona(req: grackle.PersonaId): Promise<grackle.Persona>;
8
+ /** Update an existing persona. */
9
+ export declare function updatePersona(req: grackle.UpdatePersonaRequest): Promise<grackle.Persona>;
10
+ /** Delete a persona by ID. */
11
+ export declare function deletePersona(req: grackle.PersonaId): Promise<grackle.Empty>;
12
+ //# sourceMappingURL=persona-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona-handlers.d.ts","sourceRoot":"","sources":["../src/persona-handlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAQ7C,yBAAyB;AACzB,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAKjE;AAED,4BAA4B;AAC5B,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAsE/F;AAED,2BAA2B;AAC3B,wBAAsB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAMjF;AAED,kCAAkC;AAClC,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAuF/F;AAED,8BAA8B;AAC9B,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAIlF"}
@@ -0,0 +1,148 @@
1
+ import { ConnectError, Code } from "@connectrpc/connect";
2
+ import { create } from "@bufbuild/protobuf";
3
+ import { grackle } from "@grackle-ai/common";
4
+ import { ALL_MCP_TOOL_NAMES } from "@grackle-ai/common";
5
+ import { personaStore } from "@grackle-ai/database";
6
+ import { v4 as uuid } from "uuid";
7
+ import { slugify } from "@grackle-ai/database";
8
+ import { emit } from "./event-bus.js";
9
+ import { personaRowToProto } from "./grpc-proto-converters.js";
10
+ /** List all personas. */
11
+ export async function listPersonas() {
12
+ const rows = personaStore.listPersonas();
13
+ return create(grackle.PersonaListSchema, {
14
+ personas: rows.map(personaRowToProto),
15
+ });
16
+ }
17
+ /** Create a new persona. */
18
+ export async function createPersona(req) {
19
+ if (!req.name) {
20
+ throw new ConnectError("Persona name is required", Code.InvalidArgument);
21
+ }
22
+ const personaType = req.type || "agent";
23
+ if (personaType !== "agent" && personaType !== "script") {
24
+ throw new ConnectError(`Invalid persona type: "${personaType}". Must be "agent" or "script".`, Code.InvalidArgument);
25
+ }
26
+ if (personaType === "script") {
27
+ if (!req.script) {
28
+ throw new ConnectError("Script content is required for script personas", Code.InvalidArgument);
29
+ }
30
+ }
31
+ else {
32
+ if (!req.systemPrompt) {
33
+ throw new ConnectError("Persona system_prompt is required", Code.InvalidArgument);
34
+ }
35
+ }
36
+ // Enforce unique ID and unique name
37
+ let id = slugify(req.name) || uuid().slice(0, 8);
38
+ if (personaStore.getPersona(id)) {
39
+ id = `${id}-${uuid().slice(0, 4)}`;
40
+ }
41
+ if (personaStore.getPersonaByName(req.name)) {
42
+ throw new ConnectError(`Persona with name "${req.name}" already exists`, Code.AlreadyExists);
43
+ }
44
+ const toolConfigJson = JSON.stringify({
45
+ allowedTools: [...(req.toolConfig?.allowedTools || [])],
46
+ disallowedTools: [...(req.toolConfig?.disallowedTools || [])],
47
+ });
48
+ const mcpServersJson = JSON.stringify(req.mcpServers.map((s) => ({
49
+ name: s.name,
50
+ command: s.command,
51
+ args: [...s.args],
52
+ tools: [...s.tools],
53
+ })));
54
+ // Validate allowed MCP tools against the known tool registry
55
+ const allowedMcpTools = Array.isArray(req.allowedMcpTools) ? [...req.allowedMcpTools] : [];
56
+ if (allowedMcpTools.length > 0) {
57
+ const invalid = allowedMcpTools.filter((t) => !ALL_MCP_TOOL_NAMES.has(t));
58
+ if (invalid.length > 0) {
59
+ throw new ConnectError(`Invalid MCP tool name(s): ${invalid.join(", ")}`, Code.InvalidArgument);
60
+ }
61
+ }
62
+ const allowedMcpToolsJson = JSON.stringify(allowedMcpTools);
63
+ personaStore.createPersona(id, req.name, req.description, req.systemPrompt, toolConfigJson, req.runtime, req.model, req.maxTurns, mcpServersJson, personaType, req.script, allowedMcpToolsJson);
64
+ emit("persona.created", { personaId: id });
65
+ const row = personaStore.getPersona(id);
66
+ return personaRowToProto(row);
67
+ }
68
+ /** Get a persona by ID. */
69
+ export async function getPersona(req) {
70
+ const row = personaStore.getPersona(req.id);
71
+ if (!row) {
72
+ throw new ConnectError(`Persona not found: ${req.id}`, Code.NotFound);
73
+ }
74
+ return personaRowToProto(row);
75
+ }
76
+ /** Update an existing persona. */
77
+ export async function updatePersona(req) {
78
+ const existing = personaStore.getPersona(req.id);
79
+ if (!existing) {
80
+ throw new ConnectError(`Persona not found: ${req.id}`, Code.NotFound);
81
+ }
82
+ // Only update toolConfig/mcpServers if the request provides non-empty values;
83
+ // otherwise keep the existing stored value.
84
+ const hasNewToolConfig = !!req.toolConfig &&
85
+ (req.toolConfig.allowedTools.length > 0 ||
86
+ req.toolConfig.disallowedTools.length > 0);
87
+ const toolConfigJson = hasNewToolConfig
88
+ ? JSON.stringify({
89
+ allowedTools: [...(req.toolConfig?.allowedTools || [])],
90
+ disallowedTools: [...(req.toolConfig?.disallowedTools || [])],
91
+ })
92
+ : existing.toolConfig;
93
+ const hasNewMcpServers = Array.isArray(req.mcpServers) && req.mcpServers.length > 0;
94
+ const mcpServersJson = hasNewMcpServers
95
+ ? JSON.stringify(req.mcpServers.map((s) => ({
96
+ name: s.name,
97
+ command: s.command,
98
+ args: [...s.args],
99
+ tools: [...s.tools],
100
+ })))
101
+ : existing.mcpServers;
102
+ // Treat empty string / 0 as "not set" and keep existing value
103
+ const name = req.name || existing.name;
104
+ if (name !== existing.name && personaStore.getPersonaByName(name)) {
105
+ throw new ConnectError(`Persona with name "${name}" already exists`, Code.AlreadyExists);
106
+ }
107
+ const description = req.description || existing.description;
108
+ const systemPrompt = req.systemPrompt || existing.systemPrompt;
109
+ const runtime = req.runtime || existing.runtime;
110
+ const model = req.model || existing.model;
111
+ const maxTurns = req.maxTurns === 0 ? existing.maxTurns : req.maxTurns;
112
+ // Empty string means "keep existing", non-empty means "set to this value"
113
+ const updatedType = req.type || existing.type;
114
+ const updatedScript = req.script || existing.script;
115
+ // Preserve existing allowedMcpTools unless the request provides a non-empty list.
116
+ // Proto3 repeated fields default to [], so we treat [] as "not provided" (keep existing).
117
+ // To clear overrides (revert to default), callers should use a sentinel like ["__clear__"]
118
+ // or the web UI handles it explicitly via the McpToolSelector onChange.
119
+ const hasNewAllowedMcpTools = Array.isArray(req.allowedMcpTools) && req.allowedMcpTools.length > 0;
120
+ let allowedMcpToolsJson;
121
+ if (hasNewAllowedMcpTools) {
122
+ // Check for the clear sentinel: a single-element array ["__clear__"] resets to default
123
+ if (req.allowedMcpTools.length === 1 && req.allowedMcpTools[0] === "__clear__") {
124
+ allowedMcpToolsJson = "[]";
125
+ }
126
+ else {
127
+ const invalid = req.allowedMcpTools.filter((t) => !ALL_MCP_TOOL_NAMES.has(t));
128
+ if (invalid.length > 0) {
129
+ throw new ConnectError(`Invalid MCP tool name(s): ${invalid.join(", ")}`, Code.InvalidArgument);
130
+ }
131
+ allowedMcpToolsJson = JSON.stringify([...req.allowedMcpTools]);
132
+ }
133
+ }
134
+ else {
135
+ allowedMcpToolsJson = existing.allowedMcpTools;
136
+ }
137
+ personaStore.updatePersona(req.id, name, description, systemPrompt, toolConfigJson, runtime, model, maxTurns, mcpServersJson, updatedType, updatedScript, allowedMcpToolsJson);
138
+ emit("persona.updated", { personaId: req.id });
139
+ const row = personaStore.getPersona(req.id);
140
+ return personaRowToProto(row);
141
+ }
142
+ /** Delete a persona by ID. */
143
+ export async function deletePersona(req) {
144
+ personaStore.deletePersona(req.id);
145
+ emit("persona.deleted", { personaId: req.id });
146
+ return create(grackle.EmptySchema, {});
147
+ }
148
+ //# sourceMappingURL=persona-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona-handlers.js","sourceRoot":"","sources":["../src/persona-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,122 @@
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 "./event-bus.js";
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-handlers.js","sourceRoot":"","sources":["../src/schedule-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { grackle } from "@grackle-ai/common";
2
+ /** Spawn a new agent session in the given environment. */
3
+ export declare function spawnAgent(req: grackle.SpawnRequest): Promise<grackle.Session>;
4
+ /** Resume a previously suspended agent session. */
5
+ export declare function resumeAgent(req: grackle.ResumeRequest): Promise<grackle.Session>;
6
+ /** Send text input to a running session. */
7
+ export declare function sendInput(req: grackle.InputMessage): Promise<grackle.Empty>;
8
+ /** Kill (or gracefully stop) an agent session. */
9
+ export declare function killAgent(req: grackle.KillAgentRequest): Promise<grackle.Empty>;
10
+ /** Get aggregated usage stats for a session, task, task tree, workspace, or environment. */
11
+ export declare function getUsage(req: grackle.GetUsageRequest): Promise<grackle.UsageStats>;
12
+ /** Wait for a message on a synchronous pipe subscription. */
13
+ export declare function waitForPipe(req: grackle.WaitForPipeRequest): Promise<grackle.WaitForPipeResponse>;
14
+ /** Write a message to a pipe fd. */
15
+ export declare function writeToFd(req: grackle.WriteToFdRequest): Promise<grackle.Empty>;
16
+ /** Close a pipe file descriptor, optionally stopping child sessions. */
17
+ export declare function closeFd(req: grackle.CloseFdRequest): Promise<grackle.CloseFdResponse>;
18
+ /** Get all open file descriptors for a session. */
19
+ export declare function getSessionFds(req: grackle.SessionId): grackle.SessionFds;
20
+ /** List sessions with optional filters. */
21
+ export declare function listSessions(req: grackle.SessionFilter): Promise<grackle.SessionList>;
22
+ /** Get a session by ID. */
23
+ export declare function getSession(req: grackle.SessionId): Promise<grackle.Session>;
24
+ /** Get all events recorded for a session. */
25
+ export declare function getSessionEvents(req: grackle.SessionId): Promise<grackle.SessionEventList>;
26
+ /** Get all sessions for a task. */
27
+ export declare function getTaskSessions(req: grackle.TaskId): Promise<grackle.SessionList>;
28
+ /** Stream session events as they occur. */
29
+ export declare function streamSession(req: grackle.SessionId): AsyncGenerator<grackle.SessionEvent>;
30
+ /** Stream all session events across all sessions. */
31
+ export declare function streamAll(): AsyncGenerator<grackle.SessionEvent>;
32
+ /** Stream domain events (replaces WebSocket event broadcasting). */
33
+ export declare function streamEvents(): AsyncGenerator<grackle.ServerEvent>;
34
+ //# sourceMappingURL=session-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-handlers.d.ts","sourceRoot":"","sources":["../src/session-handlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAa,MAAM,oBAAoB,CAAC;AAkCxD,0DAA0D;AAC1D,wBAAsB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAsLpF;AAED,mDAAmD;AACnD,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAGtF;AAED,4CAA4C;AAC5C,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAsCjF;AAED,kDAAkD;AAClD,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAmCrF;AAED,4FAA4F;AAC5F,wBAAsB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CA0CxF;AAED,6DAA6D;AAC7D,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAsCvG;AAED,oCAAoC;AACpC,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAyCrF;AAED,wEAAwE;AACxE,wBAAsB,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAkD3F;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,UAAU,CAuBxE;AAED,2CAA2C;AAC3C,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAK3F;AAED,2BAA2B;AAC3B,wBAAsB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAMjF;AAED,6CAA6C;AAC7C,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAwBhG;AAED,mCAAmC;AACnC,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAQvF;AAED,2CAA2C;AAC3C,wBAAuB,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,CASjG;AAED,qDAAqD;AACrD,wBAAuB,SAAS,IAAI,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,CASvE;AAED,oEAAoE;AACpE,wBAAuB,YAAY,IAAI,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CASzE"}