@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,132 @@
1
+ /**
2
+ * Starts a new agent session for a task.
3
+ *
4
+ * Extracted from the former WebSocket bridge module. This is the non-gRPC
5
+ * entry point used by the root-task auto-start flow and the cron scheduler.
6
+ * The gRPC `StartTask` handler in `grpc-service.ts` has its own inline
7
+ * implementation with additional validation and pipe support.
8
+ *
9
+ * @module
10
+ */
11
+ import { create } from "@bufbuild/protobuf";
12
+ import { powerline } from "@grackle-ai/common";
13
+ import { envRegistry, sessionStore, workspaceStore, taskStore, grackleHome } from "@grackle-ai/database";
14
+ import * as adapterManager from "./adapter-manager.js";
15
+ import * as tokenPush from "./token-push.js";
16
+ import { v4 as uuid } from "uuid";
17
+ import { join } from "node:path";
18
+ import { LOGS_DIR, DEFAULT_MCP_PORT, ROOT_TASK_ID, } from "@grackle-ai/common";
19
+ import { resolvePersona, fetchOrchestratorContext, SystemPromptBuilder, buildTaskPrompt } from "@grackle-ai/prompt";
20
+ import { logger } from "./logger.js";
21
+ import { processEventStream } from "./event-processor.js";
22
+ import { buildMcpServersJson, toDialableHost } from "./grpc-service.js";
23
+ import { emit } from "./event-bus.js";
24
+ import { createScopedToken, loadOrCreateApiKey } from "@grackle-ai/auth";
25
+ /**
26
+ * Start a new agent session for a task.
27
+ *
28
+ * Resolves the persona, creates a session record, pushes tokens, and spawns
29
+ * the runtime on the environment's PowerLine connection. The environment must
30
+ * already be connected — this function does not auto-provision.
31
+ *
32
+ * @returns An error message string on failure, `undefined` on success.
33
+ */
34
+ export async function startTaskSession(task, options) {
35
+ const workspace = task.workspaceId ? workspaceStore.getWorkspace(task.workspaceId) : undefined;
36
+ if (task.workspaceId && !workspace) {
37
+ logger.warn({ taskId: task.id }, "startTaskSession failed: workspace not found");
38
+ return `Workspace not found: ${task.workspaceId}`;
39
+ }
40
+ const environmentId = options?.environmentId || workspace?.environmentId || "";
41
+ const env = envRegistry.getEnvironment(environmentId);
42
+ if (!env) {
43
+ logger.warn({ taskId: task.id, environmentId }, "startTaskSession failed: environment not found");
44
+ return `Environment not found: ${environmentId}`;
45
+ }
46
+ const conn = adapterManager.getConnection(environmentId) ?? undefined;
47
+ if (!conn) {
48
+ return `Environment not connected: ${environmentId}`;
49
+ }
50
+ // Resolve persona via cascade (request → task → workspace → app default)
51
+ let resolved;
52
+ try {
53
+ resolved = resolvePersona(options?.personaId || "", task.defaultPersonaId, workspace?.defaultPersonaId || "");
54
+ }
55
+ catch (err) {
56
+ return err.message;
57
+ }
58
+ const sessionId = uuid();
59
+ const { runtime, model, maxTurns, systemPrompt, persona: resolvedPersonaRow } = resolved;
60
+ const logPath = join(grackleHome, LOGS_DIR, sessionId);
61
+ const freshTask = taskStore.getTask(task.id) || task;
62
+ // For the root/System task, use the user's chat message (passed as notes)
63
+ // as the initial prompt instead of the task title "System".
64
+ // For regular tasks, build the prompt from title + description.
65
+ const taskPrompt = freshTask.id === ROOT_TASK_ID
66
+ ? (options?.notes || "")
67
+ : buildTaskPrompt(freshTask.title, freshTask.description, options?.notes);
68
+ const orchestratorCtx = freshTask.canDecompose && freshTask.depth <= 1
69
+ ? fetchOrchestratorContext(freshTask.workspaceId || "") : undefined;
70
+ const systemContext = new SystemPromptBuilder({
71
+ task: { title: freshTask.title, description: freshTask.description, notes: freshTask.id === ROOT_TASK_ID ? "" : (options?.notes || "") },
72
+ taskId: freshTask.id, canDecompose: freshTask.canDecompose, personaPrompt: systemPrompt,
73
+ taskDepth: freshTask.depth, ...orchestratorCtx,
74
+ ...(orchestratorCtx && { triggerMode: "fresh" }),
75
+ }).build();
76
+ sessionStore.createSession(sessionId, environmentId, runtime, freshTask.title, model, logPath, freshTask.id, resolved.personaId);
77
+ emit("task.started", {
78
+ taskId: freshTask.id,
79
+ sessionId,
80
+ workspaceId: freshTask.workspaceId || "",
81
+ });
82
+ // Re-push stored tokens + provider credentials (scoped to runtime) so they're fresh for this session.
83
+ // For local envs, skip file tokens — the PowerLine is on the same machine.
84
+ await tokenPush.refreshTokensForTask(environmentId, runtime, env.adapterType === "local" ? { excludeFileTokens: true } : undefined);
85
+ let mcpServersJson = "";
86
+ try {
87
+ const parsed = JSON.parse(resolvedPersonaRow.mcpServers || "[]");
88
+ if (Array.isArray(parsed)) {
89
+ const mcpServers = parsed;
90
+ if (mcpServers.length > 0) {
91
+ mcpServersJson = buildMcpServersJson(mcpServers);
92
+ }
93
+ }
94
+ }
95
+ catch {
96
+ logger.warn("Failed to parse persona.mcpServers JSON; ignoring");
97
+ }
98
+ // Build MCP broker URL + scoped token so runtimes can call the MCP server.
99
+ const mcpPort = parseInt(process.env.GRACKLE_MCP_PORT || String(DEFAULT_MCP_PORT), 10);
100
+ const mcpDialHost = toDialableHost(process.env.GRACKLE_HOST || "127.0.0.1");
101
+ const mcpUrl = `http://${mcpDialHost}:${mcpPort}/mcp`;
102
+ const mcpToken = createScopedToken({ sub: freshTask.id, pid: freshTask.workspaceId || "", per: resolved.personaId, sid: sessionId }, loadOrCreateApiKey(grackleHome));
103
+ const useWorktrees = workspace?.useWorktrees ?? false;
104
+ const powerlineReq = create(powerline.SpawnRequestSchema, {
105
+ sessionId,
106
+ runtime,
107
+ prompt: taskPrompt,
108
+ model,
109
+ maxTurns,
110
+ branch: freshTask.branch,
111
+ workingDirectory: freshTask.branch
112
+ ? (workspace?.workingDirectory || process.env.GRACKLE_WORKING_DIRECTORY || process.env.GRACKLE_WORKTREE_BASE || "/workspace")
113
+ : "",
114
+ useWorktrees,
115
+ systemContext,
116
+ workspaceId: freshTask.workspaceId ?? undefined,
117
+ taskId: freshTask.id,
118
+ mcpServersJson,
119
+ mcpUrl,
120
+ mcpToken,
121
+ });
122
+ processEventStream(conn.client.spawn(powerlineReq), {
123
+ sessionId,
124
+ logPath,
125
+ workspaceId: freshTask.workspaceId ?? undefined,
126
+ taskId: freshTask.id,
127
+ systemContext,
128
+ prompt: taskPrompt,
129
+ });
130
+ return undefined;
131
+ }
132
+ //# sourceMappingURL=task-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-session.js","sourceRoot":"","sources":["../src/task-session.ts"],"names":[],"mappings":"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"}
@@ -55,6 +55,8 @@ export declare function createDatabaseMock(): {
55
55
  getDescendants: import("vitest").Mock<() => never[]>;
56
56
  getAncestors: import("vitest").Mock<() => never[]>;
57
57
  getChildStatusCounts: import("vitest").Mock<() => {}>;
58
+ reparentTask: import("vitest").Mock<(...args: any[]) => any>;
59
+ getOrphanedTasks: import("vitest").Mock<() => never[]>;
58
60
  };
59
61
  workspaceStore: {
60
62
  createWorkspace: import("vitest").Mock<(...args: any[]) => any>;
@@ -1 +1 @@
1
- {"version":3,"file":"mock-database.d.ts","sourceRoot":"","sources":["../../src/test-utils/mock-database.ts"],"names":[],"mappings":"AAeA,0EAA0E;AAE1E,wBAAgB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCA8HF,OAAO,KAAG,MAAM,EAAE;oBAS9B,MAAM,KAAG,MAAM;uCACZ,OAAO;uCACP,OAAO;EAE7B"}
1
+ {"version":3,"file":"mock-database.d.ts","sourceRoot":"","sources":["../../src/test-utils/mock-database.ts"],"names":[],"mappings":"AAeA,0EAA0E;AAE1E,wBAAgB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAgIF,OAAO,KAAG,MAAM,EAAE;oBAS9B,MAAM,KAAG,MAAM;uCACZ,OAAO;uCACP,OAAO;EAE7B"}
@@ -66,6 +66,8 @@ export function createDatabaseMock() {
66
66
  getDescendants: vi.fn(() => []),
67
67
  getAncestors: vi.fn(() => []),
68
68
  getChildStatusCounts: vi.fn(() => ({})),
69
+ reparentTask: vi.fn(),
70
+ getOrphanedTasks: vi.fn(() => []),
69
71
  },
70
72
  workspaceStore: {
71
73
  createWorkspace: vi.fn(),
@@ -1 +1 @@
1
- {"version":3,"file":"mock-database.js","sourceRoot":"","sources":["../../src/test-utils/mock-database.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mock-database.js","sourceRoot":"","sources":["../../src/test-utils/mock-database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { grackle } from "@grackle-ai/common";
2
+ /** Store or update a token. */
3
+ export declare function setToken(req: grackle.TokenEntry): Promise<grackle.Empty>;
4
+ /** List all stored tokens (without values). */
5
+ export declare function listTokens(): Promise<grackle.TokenList>;
6
+ /** Delete a token by name. */
7
+ export declare function deleteToken(req: grackle.TokenName): Promise<grackle.Empty>;
8
+ /** Get the current credential provider configuration. */
9
+ export declare function getCredentialProviders(): Promise<grackle.CredentialProviderConfig>;
10
+ /** Set a specific credential provider value. */
11
+ export declare function setCredentialProvider(req: grackle.SetCredentialProviderRequest): Promise<grackle.CredentialProviderConfig>;
12
+ //# sourceMappingURL=token-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-handlers.d.ts","sourceRoot":"","sources":["../src/token-handlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAM7C,+BAA+B;AAC/B,wBAAsB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAkB9E;AAED,+CAA+C;AAC/C,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAa7D;AAED,8BAA8B;AAC9B,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAQhF;AAED,yDAAyD;AACzD,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CASxF;AAED,gDAAgD;AAChD,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,4BAA4B,GAAG,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAgChI"}
@@ -0,0 +1,85 @@
1
+ import { ConnectError, Code } from "@connectrpc/connect";
2
+ import { create } from "@bufbuild/protobuf";
3
+ import { grackle } from "@grackle-ai/common";
4
+ import { claudeProviderModeToEnum, providerToggleToEnum } from "@grackle-ai/common";
5
+ import { tokenStore, credentialProviders } from "@grackle-ai/database";
6
+ import * as tokenPush from "./token-push.js";
7
+ import { emit } from "./event-bus.js";
8
+ /** Store or update a token. */
9
+ export async function setToken(req) {
10
+ if (!req.name) {
11
+ throw new ConnectError("name is required", Code.InvalidArgument);
12
+ }
13
+ if (!req.value) {
14
+ throw new ConnectError("value is required", Code.InvalidArgument);
15
+ }
16
+ tokenStore.setToken({
17
+ name: req.name,
18
+ type: req.type,
19
+ envVar: req.envVar,
20
+ filePath: req.filePath,
21
+ value: req.value,
22
+ expiresAt: req.expiresAt,
23
+ });
24
+ emit("token.changed", {});
25
+ await tokenPush.pushToAll();
26
+ return create(grackle.EmptySchema, {});
27
+ }
28
+ /** List all stored tokens (without values). */
29
+ export async function listTokens() {
30
+ const items = tokenStore.listTokens();
31
+ return create(grackle.TokenListSchema, {
32
+ tokens: items.map((t) => create(grackle.TokenInfoSchema, {
33
+ name: t.name,
34
+ type: t.type,
35
+ envVar: t.envVar || "",
36
+ filePath: t.filePath || "",
37
+ expiresAt: t.expiresAt || "",
38
+ })),
39
+ });
40
+ }
41
+ /** Delete a token by name. */
42
+ export async function deleteToken(req) {
43
+ if (!req.name) {
44
+ throw new ConnectError("name is required", Code.InvalidArgument);
45
+ }
46
+ tokenStore.deleteToken(req.name);
47
+ emit("token.changed", {});
48
+ await tokenPush.pushToAll();
49
+ return create(grackle.EmptySchema, {});
50
+ }
51
+ /** Get the current credential provider configuration. */
52
+ export async function getCredentialProviders() {
53
+ const config = credentialProviders.getCredentialProviders();
54
+ return create(grackle.CredentialProviderConfigSchema, {
55
+ claude: claudeProviderModeToEnum(config.claude),
56
+ github: providerToggleToEnum(config.github),
57
+ copilot: providerToggleToEnum(config.copilot),
58
+ codex: providerToggleToEnum(config.codex),
59
+ goose: providerToggleToEnum(config.goose),
60
+ });
61
+ }
62
+ /** Set a specific credential provider value. */
63
+ export async function setCredentialProvider(req) {
64
+ if (!credentialProviders.VALID_PROVIDERS.includes(req.provider)) {
65
+ throw new ConnectError(`Invalid provider: ${req.provider}. Must be one of: ${credentialProviders.VALID_PROVIDERS.join(", ")}`, Code.InvalidArgument);
66
+ }
67
+ const allowed = req.provider === "claude"
68
+ ? credentialProviders.VALID_CLAUDE_VALUES
69
+ : credentialProviders.VALID_TOGGLE_VALUES;
70
+ if (!allowed.has(req.value)) {
71
+ throw new ConnectError(`Invalid value for ${req.provider}: ${req.value}. Must be one of: ${[...allowed].join(", ")}`, Code.InvalidArgument);
72
+ }
73
+ const current = credentialProviders.getCredentialProviders();
74
+ const updated = { ...current, [req.provider]: req.value };
75
+ credentialProviders.setCredentialProviders(updated);
76
+ emit("credential.providers_changed", updated);
77
+ return create(grackle.CredentialProviderConfigSchema, {
78
+ claude: claudeProviderModeToEnum(updated.claude),
79
+ github: providerToggleToEnum(updated.github),
80
+ copilot: providerToggleToEnum(updated.copilot),
81
+ codex: providerToggleToEnum(updated.codex),
82
+ goose: providerToggleToEnum(updated.goose),
83
+ });
84
+ }
85
+ //# sourceMappingURL=token-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-handlers.js","sourceRoot":"","sources":["../src/token-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { grackle } from "@grackle-ai/common";
2
+ /** List all workspaces, optionally filtered by environment. */
3
+ export declare function listWorkspaces(req: grackle.ListWorkspacesRequest): Promise<grackle.WorkspaceList>;
4
+ /** Create a new workspace. */
5
+ export declare function createWorkspace(req: grackle.CreateWorkspaceRequest): Promise<grackle.Workspace>;
6
+ /** Get a workspace by ID. */
7
+ export declare function getWorkspace(req: grackle.WorkspaceId): Promise<grackle.Workspace>;
8
+ /** Archive a workspace. */
9
+ export declare function archiveWorkspace(req: grackle.WorkspaceId): Promise<grackle.Empty>;
10
+ /** Update workspace properties. */
11
+ export declare function updateWorkspace(req: grackle.UpdateWorkspaceRequest): Promise<grackle.Workspace>;
12
+ //# sourceMappingURL=workspace-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-handlers.d.ts","sourceRoot":"","sources":["../src/workspace-handlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAM7C,+DAA+D;AAC/D,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAKvG;AAED,8BAA8B;AAC9B,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CA+BrG;AAED,6BAA6B;AAC7B,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAMvF;AAED,2BAA2B;AAC3B,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAIvF;AAED,mCAAmC;AACnC,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CA+BrG"}
@@ -0,0 +1,86 @@
1
+ import { ConnectError, Code } from "@connectrpc/connect";
2
+ import { create } from "@bufbuild/protobuf";
3
+ import { grackle } from "@grackle-ai/common";
4
+ import { workspaceStore, envRegistry, slugify } from "@grackle-ai/database";
5
+ import { v4 as uuid } from "uuid";
6
+ import { emit } from "./event-bus.js";
7
+ import { workspaceRowToProto } from "./grpc-proto-converters.js";
8
+ /** List all workspaces, optionally filtered by environment. */
9
+ export async function listWorkspaces(req) {
10
+ const rows = workspaceStore.listWorkspaces(req.environmentId || undefined);
11
+ return create(grackle.WorkspaceListSchema, {
12
+ workspaces: rows.map(workspaceRowToProto),
13
+ });
14
+ }
15
+ /** Create a new workspace. */
16
+ export async function createWorkspace(req) {
17
+ if (!req.name) {
18
+ throw new ConnectError("name is required", Code.InvalidArgument);
19
+ }
20
+ if (!req.environmentId) {
21
+ throw new ConnectError("environment_id is required", Code.InvalidArgument);
22
+ }
23
+ const env = envRegistry.getEnvironment(req.environmentId);
24
+ if (!env) {
25
+ throw new ConnectError(`Environment not found: ${req.environmentId}`, Code.NotFound);
26
+ }
27
+ let id = slugify(req.name) || uuid().slice(0, 8);
28
+ // If slug already exists (e.g. archived workspace), append a short suffix
29
+ if (workspaceStore.getWorkspace(id)) {
30
+ id = `${id}-${uuid().slice(0, 4)}`;
31
+ }
32
+ // useWorktrees defaults to true when not specified
33
+ const useWorktrees = req.useWorktrees ?? true;
34
+ workspaceStore.createWorkspace(id, req.name, req.description, req.repoUrl, req.environmentId, useWorktrees, req.workingDirectory ?? "", req.defaultPersonaId ?? "");
35
+ emit("workspace.created", { workspaceId: id });
36
+ const row = workspaceStore.getWorkspace(id);
37
+ return workspaceRowToProto(row);
38
+ }
39
+ /** Get a workspace by ID. */
40
+ export async function getWorkspace(req) {
41
+ const row = workspaceStore.getWorkspace(req.id);
42
+ if (!row) {
43
+ throw new ConnectError(`Workspace not found: ${req.id}`, Code.NotFound);
44
+ }
45
+ return workspaceRowToProto(row);
46
+ }
47
+ /** Archive a workspace. */
48
+ export async function archiveWorkspace(req) {
49
+ workspaceStore.archiveWorkspace(req.id);
50
+ emit("workspace.archived", { workspaceId: req.id });
51
+ return create(grackle.EmptySchema, {});
52
+ }
53
+ /** Update workspace properties. */
54
+ export async function updateWorkspace(req) {
55
+ const existing = workspaceStore.getWorkspace(req.id);
56
+ if (!existing) {
57
+ throw new ConnectError(`Workspace not found: ${req.id}`, Code.NotFound);
58
+ }
59
+ if (req.name?.trim() === "") {
60
+ throw new ConnectError("Workspace name cannot be empty", Code.InvalidArgument);
61
+ }
62
+ if (req.repoUrl !== undefined && req.repoUrl !== "" && !/^https?:\/\//i.test(req.repoUrl)) {
63
+ throw new ConnectError("Repository URL must use http or https scheme", Code.InvalidArgument);
64
+ }
65
+ if (req.environmentId !== undefined) {
66
+ const env = envRegistry.getEnvironment(req.environmentId);
67
+ if (!env) {
68
+ throw new ConnectError(`Environment not found: ${req.environmentId}`, Code.NotFound);
69
+ }
70
+ }
71
+ const row = workspaceStore.updateWorkspace(req.id, {
72
+ name: req.name !== undefined ? req.name.trim() : undefined,
73
+ description: req.description,
74
+ repoUrl: req.repoUrl,
75
+ environmentId: req.environmentId,
76
+ useWorktrees: req.useWorktrees ?? undefined,
77
+ workingDirectory: req.workingDirectory,
78
+ defaultPersonaId: req.defaultPersonaId,
79
+ });
80
+ if (!row) {
81
+ throw new ConnectError(`Workspace not found after update: ${req.id}`, Code.NotFound);
82
+ }
83
+ emit("workspace.updated", { workspaceId: req.id });
84
+ return workspaceRowToProto(row);
85
+ }
86
+ //# sourceMappingURL=workspace-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-handlers.js","sourceRoot":"","sources":["../src/workspace-handlers.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grackle-ai/core",
3
- "version": "0.82.2",
3
+ "version": "0.83.1",
4
4
  "description": "Core gRPC business logic for Grackle — RPC handlers, event system, streaming, session lifecycle",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -36,19 +36,17 @@
36
36
  "pino": "^10.3.1",
37
37
  "ulid": "^2.3.0",
38
38
  "uuid": "^11.0.0",
39
- "ws": "^8.0.0",
40
- "@grackle-ai/adapter-sdk": "0.82.2",
41
- "@grackle-ai/auth": "0.82.2",
42
- "@grackle-ai/database": "0.82.2",
43
- "@grackle-ai/knowledge": "0.82.2",
44
- "@grackle-ai/common": "0.82.2",
45
- "@grackle-ai/prompt": "0.82.2"
39
+ "@grackle-ai/auth": "0.83.1",
40
+ "@grackle-ai/database": "0.83.1",
41
+ "@grackle-ai/common": "0.83.1",
42
+ "@grackle-ai/knowledge": "0.83.1",
43
+ "@grackle-ai/adapter-sdk": "0.83.1",
44
+ "@grackle-ai/prompt": "0.83.1"
46
45
  },
47
46
  "devDependencies": {
48
47
  "@rushstack/heft": "1.2.7",
49
48
  "@types/node": "^22.0.0",
50
49
  "@types/uuid": "^10.0.0",
51
- "@types/ws": "^8.0.0",
52
50
  "vitest": "^3.1.1",
53
51
  "@grackle-ai/heft-rig": "0.0.1"
54
52
  },
@@ -1,30 +0,0 @@
1
- import { WebSocketServer, WebSocket } from "ws";
2
- import type { Server as HttpServer } from "node:http";
3
- import { taskStore } from "@grackle-ai/database";
4
- /**
5
- * Check whether a WebSocket Origin header is allowed.
6
- *
7
- * Rules:
8
- * - Missing origin (non-browser clients, extensions) → always allowed
9
- * - Origin port must match the web server port
10
- * - In local mode (`allowNetwork === false`), hostname must be loopback
11
- * - In network mode (`allowNetwork === true`), any hostname on the right port is allowed
12
- */
13
- export declare function isAllowedOrigin(origin: string | undefined, webPort: number, allowNetwork: boolean): boolean;
14
- /** Options for creating the WebSocket bridge. */
15
- interface WsBridgeOptions {
16
- verifyApiKey: (token: string) => boolean;
17
- validateCookie?: (cookieHeader: string) => boolean;
18
- webPort?: number;
19
- allowNetwork?: boolean;
20
- }
21
- /** Create a WebSocket server on top of an HTTP server for real-time event streaming. */
22
- export declare function createWsBridge(httpServer: HttpServer, options: WsBridgeOptions): WebSocketServer;
23
- /** Start a new agent session for a task. Returns an error message string on failure, undefined on success. */
24
- export declare function startTaskSession(ws: WebSocket | undefined, task: taskStore.TaskRow, options?: {
25
- personaId?: string;
26
- environmentId?: string;
27
- notes?: string;
28
- }): Promise<string | undefined>;
29
- export {};
30
- //# sourceMappingURL=ws-bridge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ws-bridge.d.ts","sourceRoot":"","sources":["../src/ws-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAItD,OAAO,EAA6C,SAAS,EAAe,MAAM,sBAAsB,CAAC;AAqCzG;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,OAAO,GACpB,OAAO,CAyBT;AAQD,iDAAiD;AACjD,UAAU,eAAe;IACvB,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAC5B,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,eAAe,GACvB,eAAe,CAiDjB;AA6HD,8GAA8G;AAC9G,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,SAAS,GAAG,SAAS,EACzB,IAAI,EAAE,SAAS,CAAC,OAAO,EACvB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA6I7B"}