@grackle-ai/plugin-core 0.96.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) 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 +46 -0
  6. package/dist/cron-phase.d.ts.map +1 -0
  7. package/dist/cron-phase.js +88 -0
  8. package/dist/cron-phase.js.map +1 -0
  9. package/dist/dispatch-phase.d.ts +46 -0
  10. package/dist/dispatch-phase.d.ts.map +1 -0
  11. package/dist/dispatch-phase.js +99 -0
  12. package/dist/dispatch-phase.js.map +1 -0
  13. package/dist/environment-handlers.d.ts +16 -0
  14. package/dist/environment-handlers.d.ts.map +1 -0
  15. package/dist/environment-handlers.js +255 -0
  16. package/dist/environment-handlers.js.map +1 -0
  17. package/dist/environment-reconciliation.d.ts +35 -0
  18. package/dist/environment-reconciliation.d.ts.map +1 -0
  19. package/dist/environment-reconciliation.js +74 -0
  20. package/dist/environment-reconciliation.js.map +1 -0
  21. package/dist/escalation-handlers.d.ts +8 -0
  22. package/dist/escalation-handlers.d.ts.map +1 -0
  23. package/dist/escalation-handlers.js +60 -0
  24. package/dist/escalation-handlers.js.map +1 -0
  25. package/dist/finding-handlers.d.ts +8 -0
  26. package/dist/finding-handlers.d.ts.map +1 -0
  27. package/dist/finding-handlers.js +38 -0
  28. package/dist/finding-handlers.js.map +1 -0
  29. package/dist/grpc-proto-converters.d.ts +31 -0
  30. package/dist/grpc-proto-converters.d.ts.map +1 -0
  31. package/dist/grpc-proto-converters.js +222 -0
  32. package/dist/grpc-proto-converters.js.map +1 -0
  33. package/dist/grpc-service.d.ts +21 -0
  34. package/dist/grpc-service.d.ts.map +1 -0
  35. package/dist/grpc-service.js +50 -0
  36. package/dist/grpc-service.js.map +1 -0
  37. package/dist/grpc-shared.d.ts +22 -0
  38. package/dist/grpc-shared.d.ts.map +1 -0
  39. package/dist/grpc-shared.js +68 -0
  40. package/dist/grpc-shared.js.map +1 -0
  41. package/dist/index.d.ts +20 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +20 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/knowledge-handlers.d.ts +12 -0
  46. package/dist/knowledge-handlers.d.ts.map +1 -0
  47. package/dist/knowledge-handlers.js +149 -0
  48. package/dist/knowledge-handlers.js.map +1 -0
  49. package/dist/lifecycle-cleanup.d.ts +13 -0
  50. package/dist/lifecycle-cleanup.d.ts.map +1 -0
  51. package/dist/lifecycle-cleanup.js +35 -0
  52. package/dist/lifecycle-cleanup.js.map +1 -0
  53. package/dist/lifecycle.d.ts +28 -0
  54. package/dist/lifecycle.d.ts.map +1 -0
  55. package/dist/lifecycle.js +132 -0
  56. package/dist/lifecycle.js.map +1 -0
  57. package/dist/orphan-phase.d.ts +27 -0
  58. package/dist/orphan-phase.d.ts.map +1 -0
  59. package/dist/orphan-phase.js +69 -0
  60. package/dist/orphan-phase.js.map +1 -0
  61. package/dist/persona-handlers.d.ts +12 -0
  62. package/dist/persona-handlers.d.ts.map +1 -0
  63. package/dist/persona-handlers.js +156 -0
  64. package/dist/persona-handlers.js.map +1 -0
  65. package/dist/root-task-boot.d.ts +67 -0
  66. package/dist/root-task-boot.d.ts.map +1 -0
  67. package/dist/root-task-boot.js +234 -0
  68. package/dist/root-task-boot.js.map +1 -0
  69. package/dist/schedule-expression.d.ts +43 -0
  70. package/dist/schedule-expression.d.ts.map +1 -0
  71. package/dist/schedule-expression.js +105 -0
  72. package/dist/schedule-expression.js.map +1 -0
  73. package/dist/schedule-handlers.d.ts +12 -0
  74. package/dist/schedule-handlers.d.ts.map +1 -0
  75. package/dist/schedule-handlers.js +122 -0
  76. package/dist/schedule-handlers.js.map +1 -0
  77. package/dist/session-handlers.d.ts +40 -0
  78. package/dist/session-handlers.d.ts.map +1 -0
  79. package/dist/session-handlers.js +610 -0
  80. package/dist/session-handlers.js.map +1 -0
  81. package/dist/settings-handlers.d.ts +10 -0
  82. package/dist/settings-handlers.d.ts.map +1 -0
  83. package/dist/settings-handlers.js +80 -0
  84. package/dist/settings-handlers.js.map +1 -0
  85. package/dist/signals/escalation-auto.d.ts +20 -0
  86. package/dist/signals/escalation-auto.d.ts.map +1 -0
  87. package/dist/signals/escalation-auto.js +126 -0
  88. package/dist/signals/escalation-auto.js.map +1 -0
  89. package/dist/signals/orphan-reparent.d.ts +31 -0
  90. package/dist/signals/orphan-reparent.d.ts.map +1 -0
  91. package/dist/signals/orphan-reparent.js +175 -0
  92. package/dist/signals/orphan-reparent.js.map +1 -0
  93. package/dist/signals/sigchld.d.ts +12 -0
  94. package/dist/signals/sigchld.d.ts.map +1 -0
  95. package/dist/signals/sigchld.js +177 -0
  96. package/dist/signals/sigchld.js.map +1 -0
  97. package/dist/task-handlers.d.ts +22 -0
  98. package/dist/task-handlers.d.ts.map +1 -0
  99. package/dist/task-handlers.js +517 -0
  100. package/dist/task-handlers.js.map +1 -0
  101. package/dist/test-utils/integration-setup.d.ts +11 -0
  102. package/dist/test-utils/integration-setup.d.ts.map +1 -0
  103. package/dist/test-utils/integration-setup.js +26 -0
  104. package/dist/test-utils/integration-setup.js.map +1 -0
  105. package/dist/test-utils/mock-database.d.ts +152 -0
  106. package/dist/test-utils/mock-database.d.ts.map +1 -0
  107. package/dist/test-utils/mock-database.js +169 -0
  108. package/dist/test-utils/mock-database.js.map +1 -0
  109. package/dist/token-handlers.d.ts +12 -0
  110. package/dist/token-handlers.d.ts.map +1 -0
  111. package/dist/token-handlers.js +85 -0
  112. package/dist/token-handlers.js.map +1 -0
  113. package/dist/tsdoc-metadata.json +11 -0
  114. package/dist/utils/format-gh-error.d.ts +6 -0
  115. package/dist/utils/format-gh-error.d.ts.map +1 -0
  116. package/dist/utils/format-gh-error.js +30 -0
  117. package/dist/utils/format-gh-error.js.map +1 -0
  118. package/dist/workspace-handlers.d.ts +16 -0
  119. package/dist/workspace-handlers.d.ts.map +1 -0
  120. package/dist/workspace-handlers.js +146 -0
  121. package/dist/workspace-handlers.js.map +1 -0
  122. package/package.json +60 -0
@@ -0,0 +1,152 @@
1
+ /** Create a complete mock of the `@grackle-ai/database` barrel export. */
2
+ export declare function createDatabaseMock(): {
3
+ db: {};
4
+ sqlite: undefined;
5
+ openDatabase: import("vitest").Mock<(...args: any[]) => any>;
6
+ initDatabase: import("vitest").Mock<(...args: any[]) => any>;
7
+ seedDatabase: import("vitest").Mock<(...args: any[]) => any>;
8
+ schema: {};
9
+ sessionStore: {
10
+ createSession: import("vitest").Mock<(...args: any[]) => any>;
11
+ getSession: import("vitest").Mock<() => undefined>;
12
+ listSessions: import("vitest").Mock<() => never[]>;
13
+ listByEnv: import("vitest").Mock<() => never[]>;
14
+ listSessionsForTask: import("vitest").Mock<() => never[]>;
15
+ listSessionsByTaskIds: import("vitest").Mock<() => never[]>;
16
+ getLatestSessionForTask: import("vitest").Mock<() => undefined>;
17
+ getActiveForEnv: import("vitest").Mock<() => undefined>;
18
+ getActiveSessionsForTask: import("vitest").Mock<() => never[]>;
19
+ getSuspendedForEnv: import("vitest").Mock<() => never[]>;
20
+ getChildSessions: import("vitest").Mock<() => never[]>;
21
+ updateSession: import("vitest").Mock<(...args: any[]) => any>;
22
+ updateSessionStatus: import("vitest").Mock<(...args: any[]) => any>;
23
+ updateSessionUsage: import("vitest").Mock<(...args: any[]) => any>;
24
+ updateRuntimeSessionId: import("vitest").Mock<(...args: any[]) => any>;
25
+ incrementTurns: import("vitest").Mock<(...args: any[]) => any>;
26
+ suspendSession: import("vitest").Mock<(...args: any[]) => any>;
27
+ reanimateSession: import("vitest").Mock<(...args: any[]) => any>;
28
+ setSigtermSentAt: import("vitest").Mock<(...args: any[]) => any>;
29
+ clearSigtermSentAt: import("vitest").Mock<(...args: any[]) => any>;
30
+ setSessionTask: import("vitest").Mock<(...args: any[]) => any>;
31
+ deleteByEnvironment: import("vitest").Mock<(...args: any[]) => any>;
32
+ aggregateUsage: import("vitest").Mock<() => {
33
+ inputTokens: number;
34
+ outputTokens: number;
35
+ costUsd: number;
36
+ sessionCount: number;
37
+ }>;
38
+ };
39
+ taskStore: {
40
+ createTask: import("vitest").Mock<(...args: any[]) => any>;
41
+ insertTask: import("vitest").Mock<(...args: any[]) => any>;
42
+ getTask: import("vitest").Mock<() => undefined>;
43
+ listTasks: import("vitest").Mock<() => never[]>;
44
+ updateTask: import("vitest").Mock<(...args: any[]) => any>;
45
+ updateTaskStatus: import("vitest").Mock<(...args: any[]) => any>;
46
+ markTaskComplete: import("vitest").Mock<(...args: any[]) => any>;
47
+ deleteTask: import("vitest").Mock<(...args: any[]) => any>;
48
+ setTaskWorkspace: import("vitest").Mock<(...args: any[]) => any>;
49
+ setTaskDependsOn: import("vitest").Mock<(...args: any[]) => any>;
50
+ getUnblockedTasks: import("vitest").Mock<() => never[]>;
51
+ checkAndUnblock: import("vitest").Mock<() => never[]>;
52
+ areDependenciesMet: import("vitest").Mock<() => boolean>;
53
+ buildChildIdsMap: import("vitest").Mock<() => Map<any, any>>;
54
+ getChildren: import("vitest").Mock<() => never[]>;
55
+ getDescendants: import("vitest").Mock<() => never[]>;
56
+ getAncestors: import("vitest").Mock<() => never[]>;
57
+ getChildStatusCounts: import("vitest").Mock<() => {}>;
58
+ reparentTask: import("vitest").Mock<(...args: any[]) => any>;
59
+ getOrphanedTasks: import("vitest").Mock<() => never[]>;
60
+ };
61
+ workspaceStore: {
62
+ createWorkspace: import("vitest").Mock<(...args: any[]) => any>;
63
+ getWorkspace: import("vitest").Mock<() => undefined>;
64
+ listWorkspaces: import("vitest").Mock<() => never[]>;
65
+ updateWorkspace: import("vitest").Mock<(...args: any[]) => any>;
66
+ archiveWorkspace: import("vitest").Mock<(...args: any[]) => any>;
67
+ countWorkspacesByEnvironment: import("vitest").Mock<() => number>;
68
+ };
69
+ personaStore: {
70
+ createPersona: import("vitest").Mock<(...args: any[]) => any>;
71
+ getPersona: import("vitest").Mock<() => undefined>;
72
+ getPersonaByName: import("vitest").Mock<() => undefined>;
73
+ listPersonas: import("vitest").Mock<() => never[]>;
74
+ updatePersona: import("vitest").Mock<(...args: any[]) => any>;
75
+ deletePersona: import("vitest").Mock<(...args: any[]) => any>;
76
+ };
77
+ findingStore: {
78
+ postFinding: import("vitest").Mock<(...args: any[]) => any>;
79
+ queryFindings: import("vitest").Mock<() => never[]>;
80
+ };
81
+ settingsStore: {
82
+ getSetting: import("vitest").Mock<() => undefined>;
83
+ setSetting: import("vitest").Mock<(...args: any[]) => any>;
84
+ isAllowedSettingKey: import("vitest").Mock<() => boolean>;
85
+ WRITABLE_SETTING_KEYS: Set<string>;
86
+ };
87
+ envRegistry: {
88
+ listEnvironments: import("vitest").Mock<() => never[]>;
89
+ getEnvironment: import("vitest").Mock<() => undefined>;
90
+ addEnvironment: import("vitest").Mock<(...args: any[]) => any>;
91
+ removeEnvironment: import("vitest").Mock<(...args: any[]) => any>;
92
+ updateEnvironmentStatus: import("vitest").Mock<(...args: any[]) => any>;
93
+ markBootstrapped: import("vitest").Mock<(...args: any[]) => any>;
94
+ setEnvInfo: import("vitest").Mock<(...args: any[]) => any>;
95
+ updateAdapterConfig: import("vitest").Mock<(...args: any[]) => any>;
96
+ updateEnvironment: import("vitest").Mock<(...args: any[]) => any>;
97
+ resetAllStatuses: import("vitest").Mock<(...args: any[]) => any>;
98
+ };
99
+ tokenStore: {
100
+ setToken: import("vitest").Mock<(...args: any[]) => any>;
101
+ deleteToken: import("vitest").Mock<(...args: any[]) => any>;
102
+ listTokens: import("vitest").Mock<() => never[]>;
103
+ getBundle: import("vitest").Mock<() => {
104
+ tokens: never[];
105
+ }>;
106
+ };
107
+ workspaceEnvironmentLinkStore: {
108
+ linkEnvironment: import("vitest").Mock<(...args: any[]) => any>;
109
+ unlinkEnvironment: import("vitest").Mock<(...args: any[]) => any>;
110
+ getLinkedEnvironmentIds: import("vitest").Mock<() => never[]>;
111
+ getLinkedEnvironmentIdsByWorkspaces: import("vitest").Mock<() => Map<any, any>>;
112
+ getWorkspaceIdsLinkedToEnvironment: import("vitest").Mock<() => never[]>;
113
+ isLinked: import("vitest").Mock<() => boolean>;
114
+ countLinksForEnvironment: import("vitest").Mock<() => number>;
115
+ deleteLinksForEnvironment: import("vitest").Mock<(...args: any[]) => any>;
116
+ deleteLinksForWorkspace: import("vitest").Mock<(...args: any[]) => any>;
117
+ };
118
+ escalationStore: {
119
+ createEscalation: import("vitest").Mock<(...args: any[]) => any>;
120
+ getEscalation: import("vitest").Mock<() => undefined>;
121
+ listEscalations: import("vitest").Mock<() => never[]>;
122
+ listPendingEscalations: import("vitest").Mock<() => never[]>;
123
+ updateEscalationStatus: import("vitest").Mock<(...args: any[]) => any>;
124
+ };
125
+ credentialProviders: {
126
+ getCredentialProviders: import("vitest").Mock<() => {
127
+ claude: string;
128
+ github: string;
129
+ copilot: string;
130
+ codex: string;
131
+ goose: string;
132
+ }>;
133
+ setCredentialProviders: import("vitest").Mock<(...args: any[]) => any>;
134
+ parseCredentialProviderConfig: import("vitest").Mock<(...args: any[]) => any>;
135
+ isValidCredentialProviderConfig: import("vitest").Mock<() => boolean>;
136
+ VALID_PROVIDERS: string[];
137
+ VALID_CLAUDE_VALUES: Set<string>;
138
+ VALID_TOGGLE_VALUES: Set<string>;
139
+ };
140
+ isAllowedSettingKey: import("vitest").Mock<() => boolean>;
141
+ WRITABLE_SETTING_KEYS: Set<string>;
142
+ VALID_PROVIDERS: string[];
143
+ VALID_CLAUDE_VALUES: Set<string>;
144
+ VALID_TOGGLE_VALUES: Set<string>;
145
+ persistEvent: import("vitest").Mock<(...args: any[]) => any>;
146
+ grackleHome: string;
147
+ safeParseJsonArray: (value: unknown) => string[];
148
+ slugify: (text: string) => string;
149
+ encrypt: import("vitest").Mock<(x: unknown) => unknown>;
150
+ decrypt: import("vitest").Mock<(x: unknown) => unknown>;
151
+ };
152
+ //# sourceMappingURL=mock-database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-database.d.ts","sourceRoot":"","sources":["../../src/test-utils/mock-database.ts"],"names":[],"mappings":"AAeA,0EAA0E;AAE1E,wBAAgB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAoJF,OAAO,KAAG,MAAM,EAAE;oBAS9B,MAAM,KAAG,MAAM;uCACZ,OAAO;uCACP,OAAO;EAE7B"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Shared mock factory for `@grackle-ai/database` used by server test files.
3
+ *
4
+ * Usage in test files:
5
+ * ```typescript
6
+ * import { createDatabaseMock } from "./test-utils/mock-database.js";
7
+ * vi.mock("@grackle-ai/database", () => createDatabaseMock());
8
+ * ```
9
+ *
10
+ * All store namespaces are provided with vi.fn() stubs that return safe defaults
11
+ * (empty arrays, undefined, etc.). Individual tests can override specific functions
12
+ * via `vi.mocked(store.someMethod).mockReturnValue(...)`.
13
+ */
14
+ import { vi } from "vitest";
15
+ /** Create a complete mock of the `@grackle-ai/database` barrel export. */
16
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
17
+ export function createDatabaseMock() {
18
+ return {
19
+ db: {},
20
+ sqlite: undefined,
21
+ openDatabase: vi.fn(),
22
+ initDatabase: vi.fn(),
23
+ seedDatabase: vi.fn(),
24
+ schema: {},
25
+ sessionStore: {
26
+ createSession: vi.fn(),
27
+ getSession: vi.fn(() => undefined),
28
+ listSessions: vi.fn(() => []),
29
+ listByEnv: vi.fn(() => []),
30
+ listSessionsForTask: vi.fn(() => []),
31
+ listSessionsByTaskIds: vi.fn(() => []),
32
+ getLatestSessionForTask: vi.fn(() => undefined),
33
+ getActiveForEnv: vi.fn(() => undefined),
34
+ getActiveSessionsForTask: vi.fn(() => []),
35
+ getSuspendedForEnv: vi.fn(() => []),
36
+ getChildSessions: vi.fn(() => []),
37
+ updateSession: vi.fn(),
38
+ updateSessionStatus: vi.fn(),
39
+ updateSessionUsage: vi.fn(),
40
+ updateRuntimeSessionId: vi.fn(),
41
+ incrementTurns: vi.fn(),
42
+ suspendSession: vi.fn(),
43
+ reanimateSession: vi.fn(),
44
+ setSigtermSentAt: vi.fn(),
45
+ clearSigtermSentAt: vi.fn(),
46
+ setSessionTask: vi.fn(),
47
+ deleteByEnvironment: vi.fn(),
48
+ aggregateUsage: vi.fn(() => ({ inputTokens: 0, outputTokens: 0, costUsd: 0, sessionCount: 0 })),
49
+ },
50
+ taskStore: {
51
+ createTask: vi.fn(),
52
+ insertTask: vi.fn(),
53
+ getTask: vi.fn(() => undefined),
54
+ listTasks: vi.fn(() => []),
55
+ updateTask: vi.fn(),
56
+ updateTaskStatus: vi.fn(),
57
+ markTaskComplete: vi.fn(),
58
+ deleteTask: vi.fn(),
59
+ setTaskWorkspace: vi.fn(),
60
+ setTaskDependsOn: vi.fn(),
61
+ getUnblockedTasks: vi.fn(() => []),
62
+ checkAndUnblock: vi.fn(() => []),
63
+ areDependenciesMet: vi.fn(() => true),
64
+ buildChildIdsMap: vi.fn(() => new Map()),
65
+ getChildren: vi.fn(() => []),
66
+ getDescendants: vi.fn(() => []),
67
+ getAncestors: vi.fn(() => []),
68
+ getChildStatusCounts: vi.fn(() => ({})),
69
+ reparentTask: vi.fn(),
70
+ getOrphanedTasks: vi.fn(() => []),
71
+ },
72
+ workspaceStore: {
73
+ createWorkspace: vi.fn(),
74
+ getWorkspace: vi.fn(() => undefined),
75
+ listWorkspaces: vi.fn(() => []),
76
+ updateWorkspace: vi.fn(),
77
+ archiveWorkspace: vi.fn(),
78
+ countWorkspacesByEnvironment: vi.fn(() => 0),
79
+ },
80
+ personaStore: {
81
+ createPersona: vi.fn(),
82
+ getPersona: vi.fn(() => undefined),
83
+ getPersonaByName: vi.fn(() => undefined),
84
+ listPersonas: vi.fn(() => []),
85
+ updatePersona: vi.fn(),
86
+ deletePersona: vi.fn(),
87
+ },
88
+ findingStore: {
89
+ postFinding: vi.fn(),
90
+ queryFindings: vi.fn(() => []),
91
+ },
92
+ settingsStore: {
93
+ getSetting: vi.fn(() => undefined),
94
+ setSetting: vi.fn(),
95
+ isAllowedSettingKey: vi.fn(() => true),
96
+ WRITABLE_SETTING_KEYS: new Set(["default_persona_id", "onboarding_completed"]),
97
+ },
98
+ envRegistry: {
99
+ listEnvironments: vi.fn(() => []),
100
+ getEnvironment: vi.fn(() => undefined),
101
+ addEnvironment: vi.fn(),
102
+ removeEnvironment: vi.fn(),
103
+ updateEnvironmentStatus: vi.fn(),
104
+ markBootstrapped: vi.fn(),
105
+ setEnvInfo: vi.fn(),
106
+ updateAdapterConfig: vi.fn(),
107
+ updateEnvironment: vi.fn(),
108
+ resetAllStatuses: vi.fn(),
109
+ },
110
+ tokenStore: {
111
+ setToken: vi.fn(),
112
+ deleteToken: vi.fn(),
113
+ listTokens: vi.fn(() => []),
114
+ getBundle: vi.fn(() => ({ tokens: [] })),
115
+ },
116
+ workspaceEnvironmentLinkStore: {
117
+ linkEnvironment: vi.fn(),
118
+ unlinkEnvironment: vi.fn(),
119
+ getLinkedEnvironmentIds: vi.fn(() => []),
120
+ getLinkedEnvironmentIdsByWorkspaces: vi.fn(() => new Map()),
121
+ getWorkspaceIdsLinkedToEnvironment: vi.fn(() => []),
122
+ isLinked: vi.fn(() => false),
123
+ countLinksForEnvironment: vi.fn(() => 0),
124
+ deleteLinksForEnvironment: vi.fn(),
125
+ deleteLinksForWorkspace: vi.fn(),
126
+ },
127
+ escalationStore: {
128
+ createEscalation: vi.fn(),
129
+ getEscalation: vi.fn(() => undefined),
130
+ listEscalations: vi.fn(() => []),
131
+ listPendingEscalations: vi.fn(() => []),
132
+ updateEscalationStatus: vi.fn(),
133
+ },
134
+ credentialProviders: {
135
+ getCredentialProviders: vi.fn(() => ({ claude: "off", github: "off", copilot: "off", codex: "off", goose: "off" })),
136
+ setCredentialProviders: vi.fn(),
137
+ parseCredentialProviderConfig: vi.fn(),
138
+ isValidCredentialProviderConfig: vi.fn(() => true),
139
+ VALID_PROVIDERS: ["claude", "github", "copilot", "codex", "goose"],
140
+ VALID_CLAUDE_VALUES: new Set(["off", "subscription", "api_key"]),
141
+ VALID_TOGGLE_VALUES: new Set(["off", "on"]),
142
+ },
143
+ // Direct barrel exports
144
+ isAllowedSettingKey: vi.fn(() => true),
145
+ WRITABLE_SETTING_KEYS: new Set(["default_persona_id", "onboarding_completed"]),
146
+ VALID_PROVIDERS: ["claude", "github", "copilot", "codex", "goose"],
147
+ VALID_CLAUDE_VALUES: new Set(["off", "subscription", "api_key"]),
148
+ VALID_TOGGLE_VALUES: new Set(["off", "on"]),
149
+ persistEvent: vi.fn(),
150
+ // Utilities
151
+ grackleHome: "/tmp/test-grackle",
152
+ safeParseJsonArray: (value) => {
153
+ if (!value) {
154
+ return [];
155
+ }
156
+ try {
157
+ const p = JSON.parse(value);
158
+ return Array.isArray(p) ? p.filter((i) => typeof i === "string") : [];
159
+ }
160
+ catch {
161
+ return [];
162
+ }
163
+ },
164
+ slugify: (text) => text.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 40),
165
+ encrypt: vi.fn((x) => x),
166
+ decrypt: vi.fn((x) => x),
167
+ };
168
+ }
169
+ //# sourceMappingURL=mock-database.js.map
@@ -0,0 +1 @@
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 { tokenPush } from "@grackle-ai/core";
7
+ import { emit } from "@grackle-ai/core";
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,11 @@
1
+ // This file is read by tools that parse documentation comments conforming to the TSDoc standard.
2
+ // It should be published with your NPM package. It should not be tracked by Git.
3
+ {
4
+ "tsdocVersion": "0.12",
5
+ "toolPackages": [
6
+ {
7
+ "packageName": "@microsoft/api-extractor",
8
+ "packageVersion": "7.57.7"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,6 @@
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 declare function formatGhError(err: unknown, operation: string): string;
6
+ //# sourceMappingURL=format-gh-error.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,30 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,16 @@
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
@@ -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;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"}