@grackle-ai/core 0.96.2 → 0.96.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/event-processor.js +1 -1
- package/dist/event-processor.js.map +1 -1
- package/dist/{grpc-shared.d.ts → grpc-shared-utils.d.ts} +6 -10
- package/dist/grpc-shared-utils.d.ts.map +1 -0
- package/dist/grpc-shared-utils.js +57 -0
- package/dist/grpc-shared-utils.js.map +1 -0
- package/dist/index.d.ts +33 -27
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -31
- package/dist/index.js.map +1 -1
- package/dist/lifecycle-streams.d.ts +27 -0
- package/dist/lifecycle-streams.d.ts.map +1 -0
- package/dist/lifecycle-streams.js +46 -0
- package/dist/lifecycle-streams.js.map +1 -0
- package/dist/reanimate-agent.js +1 -1
- package/dist/reanimate-agent.js.map +1 -1
- package/dist/task-session.js +1 -1
- package/dist/task-session.js.map +1 -1
- package/package.json +8 -8
- package/dist/codespace-handlers.d.ts +0 -6
- package/dist/codespace-handlers.d.ts.map +0 -1
- package/dist/codespace-handlers.js +0 -66
- package/dist/codespace-handlers.js.map +0 -1
- 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/dispatch-phase.d.ts +0 -46
- package/dist/dispatch-phase.d.ts.map +0 -1
- package/dist/dispatch-phase.js +0 -99
- package/dist/dispatch-phase.js.map +0 -1
- package/dist/environment-handlers.d.ts +0 -16
- package/dist/environment-handlers.d.ts.map +0 -1
- package/dist/environment-handlers.js +0 -255
- package/dist/environment-handlers.js.map +0 -1
- package/dist/environment-reconciliation.d.ts +0 -35
- package/dist/environment-reconciliation.d.ts.map +0 -1
- package/dist/environment-reconciliation.js +0 -74
- package/dist/environment-reconciliation.js.map +0 -1
- package/dist/escalation-handlers.d.ts +0 -8
- package/dist/escalation-handlers.d.ts.map +0 -1
- package/dist/escalation-handlers.js +0 -60
- package/dist/escalation-handlers.js.map +0 -1
- package/dist/finding-handlers.d.ts +0 -8
- package/dist/finding-handlers.d.ts.map +0 -1
- package/dist/finding-handlers.js +0 -38
- package/dist/finding-handlers.js.map +0 -1
- package/dist/grpc-proto-converters.d.ts +0 -31
- package/dist/grpc-proto-converters.d.ts.map +0 -1
- package/dist/grpc-proto-converters.js +0 -222
- package/dist/grpc-proto-converters.js.map +0 -1
- package/dist/grpc-service.d.ts +0 -14
- package/dist/grpc-service.d.ts.map +0 -1
- package/dist/grpc-service.js +0 -46
- package/dist/grpc-service.js.map +0 -1
- package/dist/grpc-shared.d.ts.map +0 -1
- package/dist/grpc-shared.js +0 -110
- package/dist/grpc-shared.js.map +0 -1
- package/dist/knowledge-handlers.d.ts +0 -12
- package/dist/knowledge-handlers.d.ts.map +0 -1
- package/dist/knowledge-handlers.js +0 -149
- package/dist/knowledge-handlers.js.map +0 -1
- package/dist/lifecycle-cleanup.d.ts +0 -13
- package/dist/lifecycle-cleanup.d.ts.map +0 -1
- package/dist/lifecycle-cleanup.js +0 -35
- package/dist/lifecycle-cleanup.js.map +0 -1
- package/dist/lifecycle.d.ts +0 -44
- package/dist/lifecycle.d.ts.map +0 -1
- package/dist/lifecycle.js +0 -169
- package/dist/lifecycle.js.map +0 -1
- package/dist/orphan-phase.d.ts +0 -27
- package/dist/orphan-phase.d.ts.map +0 -1
- package/dist/orphan-phase.js +0 -69
- package/dist/orphan-phase.js.map +0 -1
- package/dist/persona-handlers.d.ts +0 -12
- package/dist/persona-handlers.d.ts.map +0 -1
- package/dist/persona-handlers.js +0 -156
- package/dist/persona-handlers.js.map +0 -1
- package/dist/root-task-boot.d.ts +0 -67
- package/dist/root-task-boot.d.ts.map +0 -1
- package/dist/root-task-boot.js +0 -234
- package/dist/root-task-boot.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/dist/session-handlers.d.ts +0 -40
- package/dist/session-handlers.d.ts.map +0 -1
- package/dist/session-handlers.js +0 -610
- package/dist/session-handlers.js.map +0 -1
- package/dist/settings-handlers.d.ts +0 -10
- package/dist/settings-handlers.d.ts.map +0 -1
- package/dist/settings-handlers.js +0 -80
- package/dist/settings-handlers.js.map +0 -1
- package/dist/signals/escalation-auto.d.ts +0 -20
- package/dist/signals/escalation-auto.d.ts.map +0 -1
- package/dist/signals/escalation-auto.js +0 -126
- package/dist/signals/escalation-auto.js.map +0 -1
- package/dist/signals/orphan-reparent.d.ts +0 -31
- package/dist/signals/orphan-reparent.d.ts.map +0 -1
- package/dist/signals/orphan-reparent.js +0 -175
- package/dist/signals/orphan-reparent.js.map +0 -1
- package/dist/signals/sigchld.d.ts +0 -12
- package/dist/signals/sigchld.d.ts.map +0 -1
- package/dist/signals/sigchld.js +0 -177
- package/dist/signals/sigchld.js.map +0 -1
- package/dist/task-handlers.d.ts +0 -22
- package/dist/task-handlers.d.ts.map +0 -1
- package/dist/task-handlers.js +0 -518
- package/dist/task-handlers.js.map +0 -1
- package/dist/test-utils/integration-setup.d.ts +0 -11
- package/dist/test-utils/integration-setup.d.ts.map +0 -1
- package/dist/test-utils/integration-setup.js +0 -26
- package/dist/test-utils/integration-setup.js.map +0 -1
- package/dist/token-handlers.d.ts +0 -12
- package/dist/token-handlers.d.ts.map +0 -1
- package/dist/token-handlers.js +0 -85
- package/dist/token-handlers.js.map +0 -1
- package/dist/utils/format-gh-error.d.ts +0 -6
- package/dist/utils/format-gh-error.d.ts.map +0 -1
- package/dist/utils/format-gh-error.js +0 -30
- package/dist/utils/format-gh-error.js.map +0 -1
- package/dist/workspace-handlers.d.ts +0 -16
- package/dist/workspace-handlers.d.ts.map +0 -1
- package/dist/workspace-handlers.js +0 -146
- package/dist/workspace-handlers.js.map +0 -1
package/dist/token-handlers.js
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"token-handlers.js","sourceRoot":"","sources":["../src/token-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"format-gh-error.d.ts","sourceRoot":"","sources":["../../src/utils/format-gh-error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CA4BrE"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Translate a raw `gh` CLI error into a user-friendly message.
|
|
3
|
-
* The raw error is still logged server-side for diagnostics.
|
|
4
|
-
*/
|
|
5
|
-
export function formatGhError(err, operation) {
|
|
6
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
7
|
-
const rawStderr = err instanceof Error && "stderr" in err
|
|
8
|
-
? err.stderr
|
|
9
|
-
: undefined;
|
|
10
|
-
const stderr = typeof rawStderr === "string" && rawStderr.length > 0
|
|
11
|
-
? rawStderr
|
|
12
|
-
: Buffer.isBuffer(rawStderr) && rawStderr.length > 0
|
|
13
|
-
? rawStderr.toString()
|
|
14
|
-
: "";
|
|
15
|
-
const code = err instanceof Error && "code" in err
|
|
16
|
-
? String(err.code)
|
|
17
|
-
: "";
|
|
18
|
-
if (code === "ENOENT" || message.includes("ENOENT")) {
|
|
19
|
-
return "Could not find the `gh` CLI. Ensure GitHub CLI is installed and available on your system PATH, then restart the Grackle server.";
|
|
20
|
-
}
|
|
21
|
-
if (code === "EACCES" || message.includes("EACCES")) {
|
|
22
|
-
return "`gh` CLI found but not executable. Check file permissions.";
|
|
23
|
-
}
|
|
24
|
-
const combined = `${stderr} ${message}`.toLowerCase();
|
|
25
|
-
if (combined.includes("auth") || combined.includes("login")) {
|
|
26
|
-
return "GitHub CLI is not authenticated. Run `gh auth login` and restart.";
|
|
27
|
-
}
|
|
28
|
-
return `Failed to ${operation}: ${stderr || message}`;
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=format-gh-error.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"format-gh-error.js","sourceRoot":"","sources":["../../src/utils/format-gh-error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY,EAAE,SAAiB;IAC3D,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,SAAS,GACb,GAAG,YAAY,KAAK,IAAI,QAAQ,IAAI,GAAG;QACrC,CAAC,CAAE,GAAmC,CAAC,MAAM;QAC7C,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,MAAM,GACV,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QACnD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAClD,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE;YACtB,CAAC,CAAC,EAAE,CAAC;IACX,MAAM,IAAI,GACR,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG;QACnC,CAAC,CAAC,MAAM,CAAE,GAAiC,CAAC,IAAI,CAAC;QACjD,CAAC,CAAC,EAAE,CAAC;IAET,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,OAAO,iIAAiI,CAAC;IAC3I,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,OAAO,4DAA4D,CAAC;IACtE,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC;IACtD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,OAAO,mEAAmE,CAAC;IAC7E,CAAC;IACD,OAAO,aAAa,SAAS,KAAK,MAAM,IAAI,OAAO,EAAE,CAAC;AACxD,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
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
|
-
/** Link an additional environment to a workspace's pool. */
|
|
13
|
-
export declare function linkEnvironment(req: grackle.LinkEnvironmentRequest): Promise<grackle.Workspace>;
|
|
14
|
-
/** Remove a linked environment from a workspace's pool. */
|
|
15
|
-
export declare function unlinkEnvironment(req: grackle.UnlinkEnvironmentRequest): Promise<grackle.Workspace>;
|
|
16
|
-
//# sourceMappingURL=workspace-handlers.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-handlers.d.ts","sourceRoot":"","sources":["../src/workspace-handlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAO7C,+DAA+D;AAC/D,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CASvG;AAED,8BAA8B;AAC9B,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAqCrG;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,CAKvF;AAED,mCAAmC;AACnC,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAoCrG;AAED,4DAA4D;AAC5D,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAuCrG;AAED,2DAA2D;AAC3D,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAezG"}
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { ConnectError, Code } from "@connectrpc/connect";
|
|
2
|
-
import { create } from "@bufbuild/protobuf";
|
|
3
|
-
import { grackle } from "@grackle-ai/common";
|
|
4
|
-
import { workspaceStore, envRegistry, workspaceEnvironmentLinkStore, slugify } from "@grackle-ai/database";
|
|
5
|
-
import { v4 as uuid } from "uuid";
|
|
6
|
-
import { emit } from "./event-bus.js";
|
|
7
|
-
import { logger } from "./logger.js";
|
|
8
|
-
import { workspaceRowToProto } from "./grpc-proto-converters.js";
|
|
9
|
-
/** List all workspaces, optionally filtered by environment. */
|
|
10
|
-
export async function listWorkspaces(req) {
|
|
11
|
-
const rows = workspaceStore.listWorkspaces(req.environmentId || undefined);
|
|
12
|
-
// Batch-fetch linked environment IDs to avoid N+1 queries
|
|
13
|
-
const linkedEnvMap = workspaceEnvironmentLinkStore.getLinkedEnvironmentIdsByWorkspaces(rows.map((r) => r.id));
|
|
14
|
-
return create(grackle.WorkspaceListSchema, {
|
|
15
|
-
workspaces: rows.map((row) => workspaceRowToProto(row, linkedEnvMap)),
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
/** Create a new workspace. */
|
|
19
|
-
export async function createWorkspace(req) {
|
|
20
|
-
if (!req.name) {
|
|
21
|
-
throw new ConnectError("name is required", Code.InvalidArgument);
|
|
22
|
-
}
|
|
23
|
-
if (!req.environmentId) {
|
|
24
|
-
throw new ConnectError("environment_id is required", Code.InvalidArgument);
|
|
25
|
-
}
|
|
26
|
-
const env = envRegistry.getEnvironment(req.environmentId);
|
|
27
|
-
if (!env) {
|
|
28
|
-
throw new ConnectError(`Environment not found: ${req.environmentId}`, Code.NotFound);
|
|
29
|
-
}
|
|
30
|
-
let id = slugify(req.name) || uuid().slice(0, 8);
|
|
31
|
-
// If slug already exists (e.g. archived workspace), append a short suffix
|
|
32
|
-
if (workspaceStore.getWorkspace(id)) {
|
|
33
|
-
id = `${id}-${uuid().slice(0, 4)}`;
|
|
34
|
-
}
|
|
35
|
-
if ((req.tokenBudget ?? 0) < 0 || (req.costBudgetMillicents ?? 0) < 0) {
|
|
36
|
-
throw new ConnectError("Budget values must be >= 0", Code.InvalidArgument);
|
|
37
|
-
}
|
|
38
|
-
// useWorktrees defaults to true when not specified
|
|
39
|
-
const useWorktrees = req.useWorktrees ?? true;
|
|
40
|
-
workspaceStore.createWorkspace(id, req.name, req.description, req.repoUrl, req.environmentId, useWorktrees, req.workingDirectory ?? "", req.defaultPersonaId ?? "", req.tokenBudget ?? 0, req.costBudgetMillicents ?? 0);
|
|
41
|
-
emit("workspace.created", { workspaceId: id });
|
|
42
|
-
logger.info({ workspaceId: id }, "Workspace created");
|
|
43
|
-
const row = workspaceStore.getWorkspace(id);
|
|
44
|
-
return workspaceRowToProto(row);
|
|
45
|
-
}
|
|
46
|
-
/** Get a workspace by ID. */
|
|
47
|
-
export async function getWorkspace(req) {
|
|
48
|
-
const row = workspaceStore.getWorkspace(req.id);
|
|
49
|
-
if (!row) {
|
|
50
|
-
throw new ConnectError(`Workspace not found: ${req.id}`, Code.NotFound);
|
|
51
|
-
}
|
|
52
|
-
return workspaceRowToProto(row);
|
|
53
|
-
}
|
|
54
|
-
/** Archive a workspace. */
|
|
55
|
-
export async function archiveWorkspace(req) {
|
|
56
|
-
workspaceStore.archiveWorkspace(req.id);
|
|
57
|
-
emit("workspace.archived", { workspaceId: req.id });
|
|
58
|
-
logger.info({ workspaceId: req.id }, "Workspace archived");
|
|
59
|
-
return create(grackle.EmptySchema, {});
|
|
60
|
-
}
|
|
61
|
-
/** Update workspace properties. */
|
|
62
|
-
export async function updateWorkspace(req) {
|
|
63
|
-
const existing = workspaceStore.getWorkspace(req.id);
|
|
64
|
-
if (!existing) {
|
|
65
|
-
throw new ConnectError(`Workspace not found: ${req.id}`, Code.NotFound);
|
|
66
|
-
}
|
|
67
|
-
if (req.name?.trim() === "") {
|
|
68
|
-
throw new ConnectError("Workspace name cannot be empty", Code.InvalidArgument);
|
|
69
|
-
}
|
|
70
|
-
if (req.repoUrl !== undefined && req.repoUrl !== "" && !/^https?:\/\//i.test(req.repoUrl)) {
|
|
71
|
-
throw new ConnectError("Repository URL must use http or https scheme", Code.InvalidArgument);
|
|
72
|
-
}
|
|
73
|
-
if (req.environmentId !== undefined) {
|
|
74
|
-
const env = envRegistry.getEnvironment(req.environmentId);
|
|
75
|
-
if (!env) {
|
|
76
|
-
throw new ConnectError(`Environment not found: ${req.environmentId}`, Code.NotFound);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
if ((req.tokenBudget !== undefined && req.tokenBudget < 0) || (req.costBudgetMillicents !== undefined && req.costBudgetMillicents < 0)) {
|
|
80
|
-
throw new ConnectError("Budget values must be >= 0", Code.InvalidArgument);
|
|
81
|
-
}
|
|
82
|
-
const row = workspaceStore.updateWorkspace(req.id, {
|
|
83
|
-
name: req.name !== undefined ? req.name.trim() : undefined,
|
|
84
|
-
description: req.description,
|
|
85
|
-
repoUrl: req.repoUrl,
|
|
86
|
-
environmentId: req.environmentId,
|
|
87
|
-
useWorktrees: req.useWorktrees ?? undefined,
|
|
88
|
-
workingDirectory: req.workingDirectory,
|
|
89
|
-
defaultPersonaId: req.defaultPersonaId,
|
|
90
|
-
tokenBudget: req.tokenBudget,
|
|
91
|
-
costBudgetMillicents: req.costBudgetMillicents,
|
|
92
|
-
});
|
|
93
|
-
if (!row) {
|
|
94
|
-
throw new ConnectError(`Workspace not found after update: ${req.id}`, Code.NotFound);
|
|
95
|
-
}
|
|
96
|
-
emit("workspace.updated", { workspaceId: req.id });
|
|
97
|
-
return workspaceRowToProto(row);
|
|
98
|
-
}
|
|
99
|
-
/** Link an additional environment to a workspace's pool. */
|
|
100
|
-
export async function linkEnvironment(req) {
|
|
101
|
-
const workspace = workspaceStore.getWorkspace(req.workspaceId);
|
|
102
|
-
if (!workspace) {
|
|
103
|
-
throw new ConnectError(`Workspace not found: ${req.workspaceId}`, Code.NotFound);
|
|
104
|
-
}
|
|
105
|
-
const env = envRegistry.getEnvironment(req.environmentId);
|
|
106
|
-
if (!env) {
|
|
107
|
-
throw new ConnectError(`Environment not found: ${req.environmentId}`, Code.NotFound);
|
|
108
|
-
}
|
|
109
|
-
if (workspace.environmentId === req.environmentId) {
|
|
110
|
-
throw new ConnectError("Cannot link the primary environment — it is already in the pool", Code.InvalidArgument);
|
|
111
|
-
}
|
|
112
|
-
if (workspaceEnvironmentLinkStore.isLinked(req.workspaceId, req.environmentId)) {
|
|
113
|
-
throw new ConnectError(`Environment ${req.environmentId} is already linked to workspace ${req.workspaceId}`, Code.InvalidArgument);
|
|
114
|
-
}
|
|
115
|
-
try {
|
|
116
|
-
workspaceEnvironmentLinkStore.linkEnvironment(req.workspaceId, req.environmentId);
|
|
117
|
-
}
|
|
118
|
-
catch (err) {
|
|
119
|
-
// Handle race condition: concurrent requests may both pass isLinked() check
|
|
120
|
-
// but one hits the unique/PK constraint. Surface as InvalidArgument, not Internal.
|
|
121
|
-
// Narrow to UNIQUE/PRIMARYKEY violations only — FK failures should bubble as-is.
|
|
122
|
-
const message = err instanceof Error ? err.message : "";
|
|
123
|
-
if (/UNIQUE constraint failed|SQLITE_CONSTRAINT_PRIMARYKEY/i.test(message)) {
|
|
124
|
-
throw new ConnectError(`Environment ${req.environmentId} is already linked to workspace ${req.workspaceId}`, Code.InvalidArgument);
|
|
125
|
-
}
|
|
126
|
-
throw err;
|
|
127
|
-
}
|
|
128
|
-
emit("workspace.updated", { workspaceId: req.workspaceId });
|
|
129
|
-
logger.info({ workspaceId: req.workspaceId, environmentId: req.environmentId }, "Environment linked to workspace");
|
|
130
|
-
return workspaceRowToProto(workspace);
|
|
131
|
-
}
|
|
132
|
-
/** Remove a linked environment from a workspace's pool. */
|
|
133
|
-
export async function unlinkEnvironment(req) {
|
|
134
|
-
const workspace = workspaceStore.getWorkspace(req.workspaceId);
|
|
135
|
-
if (!workspace) {
|
|
136
|
-
throw new ConnectError(`Workspace not found: ${req.workspaceId}`, Code.NotFound);
|
|
137
|
-
}
|
|
138
|
-
if (!workspaceEnvironmentLinkStore.isLinked(req.workspaceId, req.environmentId)) {
|
|
139
|
-
throw new ConnectError(`Environment ${req.environmentId} is not linked to workspace ${req.workspaceId}`, Code.NotFound);
|
|
140
|
-
}
|
|
141
|
-
workspaceEnvironmentLinkStore.unlinkEnvironment(req.workspaceId, req.environmentId);
|
|
142
|
-
emit("workspace.updated", { workspaceId: req.workspaceId });
|
|
143
|
-
logger.info({ workspaceId: req.workspaceId, environmentId: req.environmentId }, "Environment unlinked from workspace");
|
|
144
|
-
return workspaceRowToProto(workspace);
|
|
145
|
-
}
|
|
146
|
-
//# sourceMappingURL=workspace-handlers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-handlers.js","sourceRoot":"","sources":["../src/workspace-handlers.ts"],"names":[],"mappings":"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"}
|