@grackle-ai/server 0.53.2 → 0.53.4

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.
@@ -1,4 +1,6 @@
1
+ import type { BetterSQLite3Database } from "drizzle-orm/better-sqlite3";
1
2
  import { powerline } from "@grackle-ai/common";
3
+ import * as schema from "./schema.js";
2
4
  /** Configuration for which credential providers are enabled. */
3
5
  export interface CredentialProviderConfig {
4
6
  claude: "off" | "subscription" | "api_key";
@@ -12,15 +14,30 @@ export declare const VALID_PROVIDERS: readonly string[];
12
14
  export declare const VALID_CLAUDE_VALUES: ReadonlySet<string>;
13
15
  /** Valid values for toggle-style providers (github, copilot, codex). */
14
16
  export declare const VALID_TOGGLE_VALUES: ReadonlySet<string>;
15
- /** Read the current credential provider configuration from the database. */
16
- export declare function getCredentialProviders(): CredentialProviderConfig;
17
+ /** Drizzle database instance type used by credential-provider functions. */
18
+ export type DatabaseInstance = BetterSQLite3Database<typeof schema>;
19
+ /**
20
+ * Parse a raw JSON string into a validated {@link CredentialProviderConfig}.
21
+ * Invalid or missing fields fall back to {@link DEFAULT_CONFIG} values.
22
+ * Throws if the JSON is syntactically invalid — callers decide how to handle the error.
23
+ * Non-object values (e.g. `"null"`, `"42"`) are treated as empty and fall back to defaults.
24
+ */
25
+ export declare function parseCredentialProviderConfig(rawJson: string): CredentialProviderConfig;
26
+ /**
27
+ * Read the current credential provider configuration from the database.
28
+ * @param database - Optional Drizzle instance; defaults to the module-level db.
29
+ */
30
+ export declare function getCredentialProviders(database?: DatabaseInstance): CredentialProviderConfig;
17
31
  /**
18
32
  * Validate that a value is a well-formed credential provider config.
19
33
  * Returns true if all fields have valid values.
20
34
  */
21
35
  export declare function isValidCredentialProviderConfig(value: unknown): value is CredentialProviderConfig;
22
- /** Persist credential provider configuration to the database. */
23
- export declare function setCredentialProviders(config: CredentialProviderConfig): void;
36
+ /**
37
+ * Persist credential provider configuration to the database.
38
+ * @param database - Optional Drizzle instance; defaults to the module-level db.
39
+ */
40
+ export declare function setCredentialProviders(config: CredentialProviderConfig, database?: DatabaseInstance): void;
24
41
  /**
25
42
  * Build a token bundle containing enabled provider credentials.
26
43
  * When `runtime` is a known {@link RuntimeName}, only providers mapped to that runtime are included.
@@ -29,5 +46,5 @@ export declare function setCredentialProviders(config: CredentialProviderConfig)
29
46
  * (fails safe rather than exposing all credentials for an unrecognized runtime).
30
47
  * Reads values fresh from `process.env` or disk at call time.
31
48
  */
32
- export declare function buildProviderTokenBundle(runtime?: string): powerline.TokenBundle;
49
+ export declare function buildProviderTokenBundle(runtime?: string, database?: DatabaseInstance): powerline.TokenBundle;
33
50
  //# sourceMappingURL=credential-providers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"credential-providers.d.ts","sourceRoot":"","sources":["../src/credential-providers.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAoB,MAAM,oBAAoB,CAAC;AAOjE,gEAAgE;AAChE,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,KAAK,GAAG,cAAc,GAAG,SAAS,CAAC;IAC3C,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,KAAK,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAaD,4BAA4B;AAC5B,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAA6C,CAAC;AAE3F,4CAA4C;AAC5C,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAA+C,CAAC;AAEpG,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAA0B,CAAC;AAI/E,4EAA4E;AAC5E,wBAAgB,sBAAsB,IAAI,wBAAwB,CAuBjE;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,wBAAwB,CAWjG;AAED,iEAAiE;AACjE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,wBAAwB,GAAG,IAAI,CAS7E;AAkBD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,WAAW,CA8HhF"}
1
+ {"version":3,"file":"credential-providers.d.ts","sourceRoot":"","sources":["../src/credential-providers.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAKxE,OAAO,EAAE,SAAS,EAAoB,MAAM,oBAAoB,CAAC;AAEjE,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAKtC,gEAAgE;AAChE,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,KAAK,GAAG,cAAc,GAAG,SAAS,CAAC;IAC3C,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,KAAK,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAaD,4BAA4B;AAC5B,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAA6C,CAAC;AAE3F,4CAA4C;AAC5C,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAA+C,CAAC;AAEpG,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAA0B,CAAC;AAE/E,4EAA4E;AAC5E,MAAM,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,OAAO,MAAM,CAAC,CAAC;AAIpE;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,wBAAwB,CASvF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,wBAAwB,CAkB5F;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,wBAAwB,CAWjG;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,wBAAwB,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAU1G;AAkBD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,WAAW,CA8H7G"}
@@ -9,7 +9,7 @@ import { join } from "node:path";
9
9
  import { create } from "@bufbuild/protobuf";
10
10
  import { powerline } from "@grackle-ai/common";
11
11
  import db from "./db.js";
12
- import { settings } from "./schema.js";
12
+ import * as schema from "./schema.js";
13
13
  import { logger } from "./logger.js";
14
14
  /** Settings table key for credential provider configuration. */
15
15
  const SETTINGS_KEY = "credential_providers";
@@ -27,24 +27,38 @@ export const VALID_CLAUDE_VALUES = new Set(["off", "subscription", "api_key"]);
27
27
  /** Valid values for toggle-style providers (github, copilot, codex). */
28
28
  export const VALID_TOGGLE_VALUES = new Set(["off", "on"]);
29
29
  // ─── Read / Write ──────────────────────────────────────────
30
- /** Read the current credential provider configuration from the database. */
31
- export function getCredentialProviders() {
32
- const row = db
30
+ /**
31
+ * Parse a raw JSON string into a validated {@link CredentialProviderConfig}.
32
+ * Invalid or missing fields fall back to {@link DEFAULT_CONFIG} values.
33
+ * Throws if the JSON is syntactically invalid — callers decide how to handle the error.
34
+ * Non-object values (e.g. `"null"`, `"42"`) are treated as empty and fall back to defaults.
35
+ */
36
+ export function parseCredentialProviderConfig(rawJson) {
37
+ const raw = JSON.parse(rawJson);
38
+ const parsed = (typeof raw === "object" && raw !== null ? raw : {});
39
+ return {
40
+ claude: VALID_CLAUDE_VALUES.has(parsed.claude ?? "") ? parsed.claude : DEFAULT_CONFIG.claude,
41
+ github: VALID_TOGGLE_VALUES.has(parsed.github ?? "") ? parsed.github : DEFAULT_CONFIG.github,
42
+ copilot: VALID_TOGGLE_VALUES.has(parsed.copilot ?? "") ? parsed.copilot : DEFAULT_CONFIG.copilot,
43
+ codex: VALID_TOGGLE_VALUES.has(parsed.codex ?? "") ? parsed.codex : DEFAULT_CONFIG.codex,
44
+ };
45
+ }
46
+ /**
47
+ * Read the current credential provider configuration from the database.
48
+ * @param database - Optional Drizzle instance; defaults to the module-level db.
49
+ */
50
+ export function getCredentialProviders(database) {
51
+ const conn = database ?? db;
52
+ const row = conn
33
53
  .select()
34
- .from(settings)
35
- .where(eq(settings.key, SETTINGS_KEY))
54
+ .from(schema.settings)
55
+ .where(eq(schema.settings.key, SETTINGS_KEY))
36
56
  .get();
37
57
  if (!row) {
38
58
  return { ...DEFAULT_CONFIG };
39
59
  }
40
60
  try {
41
- const parsed = JSON.parse(row.value);
42
- return {
43
- claude: VALID_CLAUDE_VALUES.has(parsed.claude ?? "") ? parsed.claude : DEFAULT_CONFIG.claude,
44
- github: VALID_TOGGLE_VALUES.has(parsed.github ?? "") ? parsed.github : DEFAULT_CONFIG.github,
45
- copilot: VALID_TOGGLE_VALUES.has(parsed.copilot ?? "") ? parsed.copilot : DEFAULT_CONFIG.copilot,
46
- codex: VALID_TOGGLE_VALUES.has(parsed.codex ?? "") ? parsed.codex : DEFAULT_CONFIG.codex,
47
- };
61
+ return parseCredentialProviderConfig(row.value);
48
62
  }
49
63
  catch {
50
64
  logger.warn("Invalid credential_providers setting; returning defaults");
@@ -65,13 +79,17 @@ export function isValidCredentialProviderConfig(value) {
65
79
  VALID_TOGGLE_VALUES.has(v.copilot) &&
66
80
  VALID_TOGGLE_VALUES.has(v.codex));
67
81
  }
68
- /** Persist credential provider configuration to the database. */
69
- export function setCredentialProviders(config) {
82
+ /**
83
+ * Persist credential provider configuration to the database.
84
+ * @param database - Optional Drizzle instance; defaults to the module-level db.
85
+ */
86
+ export function setCredentialProviders(config, database) {
87
+ const conn = database ?? db;
70
88
  const value = JSON.stringify(config);
71
- db.insert(settings)
89
+ conn.insert(schema.settings)
72
90
  .values({ key: SETTINGS_KEY, value })
73
91
  .onConflictDoUpdate({
74
- target: settings.key,
92
+ target: schema.settings.key,
75
93
  set: { value },
76
94
  })
77
95
  .run();
@@ -97,8 +115,8 @@ const RUNTIME_PROVIDERS = {
97
115
  * (fails safe rather than exposing all credentials for an unrecognized runtime).
98
116
  * Reads values fresh from `process.env` or disk at call time.
99
117
  */
100
- export function buildProviderTokenBundle(runtime) {
101
- const config = getCredentialProviders();
118
+ export function buildProviderTokenBundle(runtime, database) {
119
+ const config = getCredentialProviders(database);
102
120
  // When runtime is given, look it up in the map. Unknown runtimes get [] (empty, not all providers).
103
121
  const runtimeProviders = runtime !== undefined
104
122
  ? (Object.hasOwn(RUNTIME_PROVIDERS, runtime) ? RUNTIME_PROVIDERS[runtime] : [])
@@ -1 +1 @@
1
- {"version":3,"file":"credential-providers.js","sourceRoot":"","sources":["../src/credential-providers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credential-providers.js","sourceRoot":"","sources":["../src/credential-providers.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,43 @@
1
+ /** Wraps `gh` CLI execution for testability. */
2
+ export interface GitHubClient {
3
+ /** Execute a `gh` CLI command and return stdout. */
4
+ exec(args: string[], options: {
5
+ encoding: BufferEncoding;
6
+ maxBuffer: number;
7
+ timeout?: number;
8
+ }): Promise<string>;
9
+ }
10
+ /** Wraps task/workspace store operations for testability. */
11
+ export interface TaskPersistence {
12
+ /** Look up a workspace by ID. */
13
+ getWorkspace(workspaceId: string): {
14
+ name: string;
15
+ } | undefined;
16
+ /** List all tasks in a workspace. */
17
+ listTasks(workspaceId: string): Array<{
18
+ id: string;
19
+ title: string;
20
+ }>;
21
+ /** Create a new task. */
22
+ createTask(id: string, workspaceId: string, title: string, description: string, dependsOn: string[], workspaceSlug: string, parentTaskId: string, canDecompose: boolean): void;
23
+ /** Set the dependsOn list for a task. */
24
+ setTaskDependsOn(taskId: string, dependsOn: string[]): void;
25
+ }
26
+ /** Wraps event bus broadcasting for testability. */
27
+ export interface ImportEventEmitter {
28
+ /** Emit a task lifecycle event. */
29
+ emit(type: "task.created" | "task.updated", payload: {
30
+ taskId: string;
31
+ workspaceId: string;
32
+ }): void;
33
+ }
34
+ /** Concurrency guard for imports. */
35
+ export interface ImportLock {
36
+ /** Acquire the lock. Throws if already held. */
37
+ acquire(): void;
38
+ /** Release the lock. */
39
+ release(): void;
40
+ }
1
41
  /** Shape of a single GitHub issue comment as returned by the GraphQL query. */
2
42
  export interface GitHubComment {
3
43
  /** Login of the comment author. */
@@ -33,6 +73,50 @@ export interface ImportResult {
33
73
  /** Number of blocking (dependsOn) relationships created. */
34
74
  dependencies: number;
35
75
  }
76
+ /** Instruction to create a single task during the persist phase. */
77
+ export interface TaskCreateInstruction {
78
+ /** Generated task ID. */
79
+ id: string;
80
+ /** Formatted title (e.g., "#42: Fix the bug"). */
81
+ title: string;
82
+ /** Full task description including comments. */
83
+ description: string;
84
+ /** Resolved parent task ID, or empty string for root tasks. */
85
+ parentTaskId: string;
86
+ /** Original GitHub issue number. */
87
+ issueNumber: number;
88
+ }
89
+ /** Instruction to set dependsOn for a task during the persist phase. */
90
+ export interface DependencyInstruction {
91
+ /** Task ID to update. */
92
+ taskId: string;
93
+ /** Resolved task IDs that this task depends on. */
94
+ dependsOn: string[];
95
+ }
96
+ /** The output of {@link planImport}: a pure description of what to persist. */
97
+ export interface ImportPlan {
98
+ /** Tasks to create, in topological order. */
99
+ tasksToCreate: TaskCreateInstruction[];
100
+ /** Dependency relationships to set after task creation. */
101
+ dependenciesToSet: DependencyInstruction[];
102
+ /** Number of issues skipped because they already exist. */
103
+ skipped: number;
104
+ /** Number of parent links resolved. */
105
+ linked: number;
106
+ }
107
+ /** Options for dependency injection in {@link importGitHubIssues}. */
108
+ export interface ImportGitHubIssuesOptions {
109
+ /** @internal GitHub CLI client for testing. */
110
+ githubClient?: GitHubClient;
111
+ /** @internal Task/workspace persistence for testing. */
112
+ persistence?: TaskPersistence;
113
+ /** @internal Event broadcaster for testing. */
114
+ eventEmitter?: ImportEventEmitter;
115
+ /** @internal Concurrency lock for testing. */
116
+ importLock?: ImportLock;
117
+ /** @internal ID generator for testing. */
118
+ generateId?: () => string;
119
+ }
36
120
  /**
37
121
  * Builds the full task description from an issue body and its comments.
38
122
  *
@@ -48,6 +132,34 @@ export interface ImportResult {
48
132
  * @returns The formatted description string.
49
133
  */
50
134
  export declare function buildDescriptionWithComments(body: string, comments: GitHubComment[], hasMoreComments?: boolean): string;
135
+ /**
136
+ * Builds a deduplication map from existing tasks whose titles match
137
+ * the `#<number>: <title>` pattern used by imported GitHub issues.
138
+ *
139
+ * @param existingTasks - Tasks already in the workspace.
140
+ * @returns Maps and sets for deduplication during import planning.
141
+ */
142
+ export declare function buildExistingIssueMap(existingTasks: Array<{
143
+ id: string;
144
+ title: string;
145
+ }>): {
146
+ issueNumberToTaskId: Map<number, string>;
147
+ existingIssueNumbers: Set<number>;
148
+ };
149
+ /**
150
+ * Given fetched issues and existing state, computes what to create and link
151
+ * without performing any side effects.
152
+ *
153
+ * Performs topological sort, skips existing issues, generates IDs upfront,
154
+ * resolves parent links and blockedBy dependencies, and returns a plan.
155
+ *
156
+ * @param issues - Fetched GitHub issues to import.
157
+ * @param existingIssueNumbers - Issue numbers already imported (to skip).
158
+ * @param existingIssueNumberToTaskId - Map from issue number to existing task ID.
159
+ * @param generateId - Optional ID generator (defaults to `uuid().slice(0, 8)`).
160
+ * @returns An {@link ImportPlan} describing all tasks to create and dependencies to set.
161
+ */
162
+ export declare function planImport(issues: GitHubIssue[], existingIssueNumbers: Set<number>, existingIssueNumberToTaskId: Map<number, string>, generateId?: () => string): ImportPlan;
51
163
  /**
52
164
  * Fetches GitHub issues from a repository via the `gh` CLI GraphQL API.
53
165
  * Paginates automatically and includes parent sub-issue information.
@@ -58,9 +170,10 @@ export declare function buildDescriptionWithComments(body: string, comments: Git
58
170
  * @param includeComments - When `true` (default), fetches issue comments and
59
171
  * includes them in each returned {@link GitHubIssue}. Pass `false` to omit
60
172
  * comments and reduce payload size.
173
+ * @param client - Optional {@link GitHubClient} for testing (defaults to `gh` CLI).
61
174
  * @returns Array of parsed GitHub issues.
62
175
  */
63
- export declare function fetchGitHubIssues(repo: string, state: string, label?: string, includeComments?: boolean): Promise<GitHubIssue[]>;
176
+ export declare function fetchGitHubIssues(repo: string, state: string, label?: string, includeComments?: boolean, client?: GitHubClient): Promise<GitHubIssue[]>;
64
177
  /**
65
178
  * Topologically sorts issues so that parents appear before their children.
66
179
  * Issues whose parent is outside the import set are treated as roots.
@@ -77,8 +190,8 @@ export declare function topologicalSortIssues<T extends {
77
190
  /**
78
191
  * Imports GitHub issues as Grackle tasks, with deduplication and parent linking.
79
192
  *
80
- * Orchestrates: fetch issues → dedup against existing tasks → topological sort
81
- * create tasks with parent linking → broadcast updates → return summary.
193
+ * Orchestrates: fetch issues → dedup against existing tasks → plan (pure)
194
+ * persist tasks → broadcast updates → return summary.
82
195
  *
83
196
  * Only one import may run at a time; concurrent calls are rejected.
84
197
  *
@@ -89,7 +202,8 @@ export declare function topologicalSortIssues<T extends {
89
202
  * @param environmentId - Optional environment ID to assign to created tasks.
90
203
  * @param includeComments - When `true` (default), appends issue comments to each
91
204
  * task description. Pass `false` to import only the issue body (old behavior).
205
+ * @param options - Optional dependency overrides for testing.
92
206
  * @returns Summary of imported, linked, and skipped issues.
93
207
  */
94
- export declare function importGitHubIssues(workspaceId: string, repo: string, state: string, label?: string, _environmentId?: string, includeComments?: boolean): Promise<ImportResult>;
208
+ export declare function importGitHubIssues(workspaceId: string, repo: string, state: string, label?: string, _environmentId?: string, includeComments?: boolean, options?: ImportGitHubIssuesOptions): Promise<ImportResult>;
95
209
  //# sourceMappingURL=github-import.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"github-import.d.ts","sourceRoot":"","sources":["../src/github-import.ts"],"names":[],"mappings":"AAgFA,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,8EAA8E;IAC9E,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,iFAAiF;IACjF,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B;;;;OAIG;IACH,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,6DAA6D;AAC7D,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;CACtB;AAgBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,EAAE,EACzB,eAAe,GAAE,OAAe,GAC/B,MAAM,CAiBR;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,EACd,eAAe,GAAE,OAAc,GAC9B,OAAO,CAAC,WAAW,EAAE,CAAC,CA+IxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EAClG,MAAM,EAAE,CAAC,EAAE,EACX,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GACpB,CAAC,EAAE,CA2BL;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,MAAM,EACvB,eAAe,GAAE,OAAc,GAC9B,OAAO,CAAC,YAAY,CAAC,CAOvB"}
1
+ {"version":3,"file":"github-import.d.ts","sourceRoot":"","sources":["../src/github-import.ts"],"names":[],"mappings":"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"}
@@ -22,42 +22,65 @@ const ISSUES_PER_PAGE = 100;
22
22
  const COMMENTS_PER_ISSUE = 25;
23
23
  /** Separator inserted between the issue body and each appended comment block. */
24
24
  const COMMENT_SEPARATOR = "\n\n---\n\n";
25
- /**
26
- * Promise wrapper around `execFile` that resolves with stdout as a string.
27
- * Includes a timeout to prevent hanging the import lock if `gh` stalls.
28
- */
29
- function execFileAsync(command, args, options) {
30
- const timeout = options.timeout ?? GH_CLI_TIMEOUT_MS;
31
- return new Promise((resolve, reject) => {
32
- execFile(command, args, { ...options, timeout }, (err, stdout, stderr) => {
33
- if (err) {
34
- err.stderr = String(stderr);
35
- reject(err);
36
- }
37
- else {
38
- resolve(String(stdout));
39
- }
40
- });
41
- });
42
- }
43
25
  /** Maximum number of blockedBy relationships fetched per issue. */
44
26
  const BLOCKED_BY_PER_ISSUE = 25;
27
+ // ── Default Implementations ─────────────────────────────────────
28
+ /** Default {@link GitHubClient} that shells out to the `gh` CLI. */
29
+ const NODE_GITHUB_CLIENT = {
30
+ exec(args, options) {
31
+ const timeout = options.timeout ?? GH_CLI_TIMEOUT_MS;
32
+ return new Promise((resolve, reject) => {
33
+ execFile("gh", args, { ...options, timeout }, (err, stdout, stderr) => {
34
+ if (err) {
35
+ err.stderr = String(stderr);
36
+ reject(err);
37
+ }
38
+ else {
39
+ resolve(String(stdout));
40
+ }
41
+ });
42
+ });
43
+ },
44
+ };
45
+ /** Default {@link TaskPersistence} delegating to the real stores. */
46
+ const NODE_TASK_PERSISTENCE = {
47
+ getWorkspace(workspaceId) {
48
+ return workspaceStore.getWorkspace(workspaceId);
49
+ },
50
+ listTasks(workspaceId) {
51
+ return taskStore.listTasks(workspaceId);
52
+ },
53
+ createTask(id, workspaceId, title, description, dependsOn, workspaceSlug, parentTaskId, canDecompose) {
54
+ taskStore.createTask(id, workspaceId, title, description, dependsOn, workspaceSlug, parentTaskId, canDecompose);
55
+ },
56
+ setTaskDependsOn(taskId, dependsOn) {
57
+ taskStore.setTaskDependsOn(taskId, dependsOn);
58
+ },
59
+ };
60
+ /** Default {@link ImportEventEmitter} delegating to the real event bus. */
61
+ const NODE_IMPORT_EVENT_EMITTER = {
62
+ emit(type, payload) {
63
+ emit(type, payload);
64
+ },
65
+ };
45
66
  /**
46
67
  * Simple concurrency guard — only one import runs at a time within this process.
47
68
  * Does not prevent concurrent imports from separate server processes sharing the same DB.
48
69
  */
49
- const importLock = { active: false };
50
- /** Acquire the import lock. Throws if already held. */
51
- function acquireImportLock() {
52
- if (importLock.active) {
53
- throw new Error("An import is already in progress. Please wait for it to complete.");
54
- }
55
- importLock.active = true;
56
- }
57
- /** Release the import lock. */
58
- function releaseImportLock() {
59
- importLock.active = false;
60
- }
70
+ const importLockState = { active: false };
71
+ /** Default {@link ImportLock} using a process-global boolean. */
72
+ const DEFAULT_IMPORT_LOCK = {
73
+ acquire() {
74
+ if (importLockState.active) {
75
+ throw new Error("An import is already in progress. Please wait for it to complete.");
76
+ }
77
+ importLockState.active = true;
78
+ },
79
+ release() {
80
+ importLockState.active = false;
81
+ },
82
+ };
83
+ // ── Helper Functions ────────────────────────────────────────────
61
84
  /**
62
85
  * Extracts a human-readable message from an unknown error value.
63
86
  *
@@ -99,6 +122,96 @@ export function buildDescriptionWithComments(body, comments, hasMoreComments = f
99
122
  }
100
123
  return result;
101
124
  }
125
+ // ── Pure Transform Functions ────────────────────────────────────
126
+ /**
127
+ * Builds a deduplication map from existing tasks whose titles match
128
+ * the `#<number>: <title>` pattern used by imported GitHub issues.
129
+ *
130
+ * @param existingTasks - Tasks already in the workspace.
131
+ * @returns Maps and sets for deduplication during import planning.
132
+ */
133
+ export function buildExistingIssueMap(existingTasks) {
134
+ const issueNumberPattern = /^#(\d+):/;
135
+ const issueNumberToTaskId = new Map();
136
+ const existingIssueNumbers = new Set();
137
+ for (const t of existingTasks) {
138
+ const match = t.title.match(issueNumberPattern);
139
+ if (match) {
140
+ const num = Number(match[1]);
141
+ existingIssueNumbers.add(num);
142
+ issueNumberToTaskId.set(num, t.id);
143
+ }
144
+ }
145
+ return { issueNumberToTaskId, existingIssueNumbers };
146
+ }
147
+ /**
148
+ * Given fetched issues and existing state, computes what to create and link
149
+ * without performing any side effects.
150
+ *
151
+ * Performs topological sort, skips existing issues, generates IDs upfront,
152
+ * resolves parent links and blockedBy dependencies, and returns a plan.
153
+ *
154
+ * @param issues - Fetched GitHub issues to import.
155
+ * @param existingIssueNumbers - Issue numbers already imported (to skip).
156
+ * @param existingIssueNumberToTaskId - Map from issue number to existing task ID.
157
+ * @param generateId - Optional ID generator (defaults to `uuid().slice(0, 8)`).
158
+ * @returns An {@link ImportPlan} describing all tasks to create and dependencies to set.
159
+ */
160
+ export function planImport(issues, existingIssueNumbers, existingIssueNumberToTaskId, generateId = () => uuid().slice(0, 8)) {
161
+ // Topological sort: parents before children
162
+ const issueSet = new Set(issues.map((i) => i.number));
163
+ const sorted = topologicalSortIssues(issues, issueSet);
164
+ // Mutable copy of the issue→taskId map so we can track newly generated IDs
165
+ const issueNumberToTaskId = new Map(existingIssueNumberToTaskId);
166
+ const tasksToCreate = [];
167
+ const dependenciesToSet = [];
168
+ let skipped = 0;
169
+ let linked = 0;
170
+ // First pass: generate IDs and resolve parent links
171
+ for (const issue of sorted) {
172
+ if (existingIssueNumbers.has(issue.number)) {
173
+ skipped++;
174
+ continue;
175
+ }
176
+ const id = generateId();
177
+ issueNumberToTaskId.set(issue.number, id);
178
+ const title = `#${issue.number}: ${issue.title}`;
179
+ let parentTaskId = "";
180
+ if (issue.parentNumber !== undefined) {
181
+ const resolvedParentId = issueNumberToTaskId.get(issue.parentNumber);
182
+ if (resolvedParentId) {
183
+ parentTaskId = resolvedParentId;
184
+ linked++;
185
+ }
186
+ }
187
+ const description = buildDescriptionWithComments(issue.body, issue.comments, issue.commentsHasNextPage);
188
+ tasksToCreate.push({ id, title, description, parentTaskId, issueNumber: issue.number });
189
+ }
190
+ // Build a map for O(1) lookup of issues by number during dependency resolution
191
+ const issueNumberToIssue = new Map();
192
+ for (const issue of sorted) {
193
+ issueNumberToIssue.set(issue.number, issue);
194
+ }
195
+ // Second pass: resolve blockedBy → dependsOn for newly created tasks only
196
+ for (const instruction of tasksToCreate) {
197
+ const issue = issueNumberToIssue.get(instruction.issueNumber);
198
+ if (!issue || issue.blockedByNumbers.length === 0) {
199
+ continue;
200
+ }
201
+ const resolvedDeps = [];
202
+ for (const blockerNumber of issue.blockedByNumbers) {
203
+ const blockerTaskId = issueNumberToTaskId.get(blockerNumber);
204
+ if (blockerTaskId) {
205
+ resolvedDeps.push(blockerTaskId);
206
+ }
207
+ }
208
+ if (resolvedDeps.length > 0) {
209
+ dependenciesToSet.push({ taskId: instruction.id, dependsOn: resolvedDeps });
210
+ }
211
+ }
212
+ return { tasksToCreate, dependenciesToSet, skipped, linked };
213
+ }
214
+ // ── Fetch Function ──────────────────────────────────────────────
102
215
  /**
103
216
  * Fetches GitHub issues from a repository via the `gh` CLI GraphQL API.
104
217
  * Paginates automatically and includes parent sub-issue information.
@@ -109,9 +222,10 @@ export function buildDescriptionWithComments(body, comments, hasMoreComments = f
109
222
  * @param includeComments - When `true` (default), fetches issue comments and
110
223
  * includes them in each returned {@link GitHubIssue}. Pass `false` to omit
111
224
  * comments and reduce payload size.
225
+ * @param client - Optional {@link GitHubClient} for testing (defaults to `gh` CLI).
112
226
  * @returns Array of parsed GitHub issues.
113
227
  */
114
- export async function fetchGitHubIssues(repo, state, label, includeComments = true) {
228
+ export async function fetchGitHubIssues(repo, state, label, includeComments = true, client = NODE_GITHUB_CLIENT) {
115
229
  const segments = repo.split("/");
116
230
  if (segments.length !== 2 || !segments[0] || !segments[1]) {
117
231
  throw new Error(`repo must be in "owner/repo" format (received: "${repo}")`);
@@ -164,7 +278,7 @@ export async function fetchGitHubIssues(repo, state, label, includeComments = tr
164
278
  }
165
279
  let ghOutput;
166
280
  try {
167
- ghOutput = await execFileAsync("gh", ghArgs, {
281
+ ghOutput = await client.exec(ghArgs, {
168
282
  encoding: "utf8",
169
283
  maxBuffer: MAX_BUFFER_BYTES,
170
284
  });
@@ -219,6 +333,7 @@ export async function fetchGitHubIssues(repo, state, label, includeComments = tr
219
333
  }
220
334
  return issues;
221
335
  }
336
+ // ── Topological Sort ────────────────────────────────────────────
222
337
  /**
223
338
  * Topologically sorts issues so that parents appear before their children.
224
339
  * Issues whose parent is outside the import set are treated as roots.
@@ -251,11 +366,12 @@ export function topologicalSortIssues(issues, issueSet) {
251
366
  }
252
367
  return sorted;
253
368
  }
369
+ // ── Main Entry Point ────────────────────────────────────────────
254
370
  /**
255
371
  * Imports GitHub issues as Grackle tasks, with deduplication and parent linking.
256
372
  *
257
- * Orchestrates: fetch issues → dedup against existing tasks → topological sort
258
- * create tasks with parent linking → broadcast updates → return summary.
373
+ * Orchestrates: fetch issues → dedup against existing tasks → plan (pure)
374
+ * persist tasks → broadcast updates → return summary.
259
375
  *
260
376
  * Only one import may run at a time; concurrent calls are rejected.
261
377
  *
@@ -266,110 +382,48 @@ export function topologicalSortIssues(issues, issueSet) {
266
382
  * @param environmentId - Optional environment ID to assign to created tasks.
267
383
  * @param includeComments - When `true` (default), appends issue comments to each
268
384
  * task description. Pass `false` to import only the issue body (old behavior).
385
+ * @param options - Optional dependency overrides for testing.
269
386
  * @returns Summary of imported, linked, and skipped issues.
270
387
  */
271
- export async function importGitHubIssues(workspaceId, repo, state, label, _environmentId, includeComments = true) {
272
- acquireImportLock();
388
+ export async function importGitHubIssues(workspaceId, repo, state, label, _environmentId, includeComments = true, options = {}) {
389
+ const lock = options.importLock ?? DEFAULT_IMPORT_LOCK;
390
+ lock.acquire();
273
391
  try {
274
- return await doImport(workspaceId, repo, state, label, includeComments);
275
- }
276
- finally {
277
- releaseImportLock();
278
- }
279
- }
280
- /**
281
- * Internal import implementation, called under the concurrency guard.
282
- *
283
- * @param workspaceId - The Grackle workspace ID to import tasks into.
284
- * @param repo - Repository in "owner/repo" format.
285
- * @param state - Issue state filter ("open" or "closed").
286
- * @param label - Optional label to filter issues by.
287
- * @param environmentId - Optional environment ID to assign to created tasks.
288
- * @param includeComments - When `true` (default), appends issue comments to each
289
- * task description.
290
- * @returns Summary of imported, linked, and skipped issues.
291
- */
292
- async function doImport(workspaceId, repo, state, label, includeComments = true) {
293
- const workspace = workspaceStore.getWorkspace(workspaceId);
294
- if (!workspace) {
295
- throw new Error(`Workspace not found: ${workspaceId}`);
296
- }
297
- const workspaceSlug = slugify(workspace.name);
298
- // 1. Fetch issues from GitHub (with or without comments)
299
- const issues = await fetchGitHubIssues(repo, state, label, includeComments);
300
- logger.info({ repo, state, label, count: issues.length, includeComments }, "Fetched GitHub issues");
301
- // 2. Fetch existing tasks for deduplication and parent linking
302
- const existingTasks = taskStore.listTasks(workspaceId);
303
- const issueNumberPattern = /^#(\d+):/;
304
- /** Maps GitHub issue number → Grackle task ID (for both existing and newly created tasks). */
305
- const issueNumberToTaskId = new Map();
306
- const existingIssueNumbers = new Set();
307
- for (const t of existingTasks) {
308
- const match = t.title.match(issueNumberPattern);
309
- if (match) {
310
- const num = Number(match[1]);
311
- existingIssueNumbers.add(num);
312
- issueNumberToTaskId.set(num, t.id);
392
+ const client = options.githubClient ?? NODE_GITHUB_CLIENT;
393
+ const persistence = options.persistence ?? NODE_TASK_PERSISTENCE;
394
+ const emitter = options.eventEmitter ?? NODE_IMPORT_EVENT_EMITTER;
395
+ const generateId = options.generateId ?? (() => uuid().slice(0, 8));
396
+ // 1. Validate workspace
397
+ const workspace = persistence.getWorkspace(workspaceId);
398
+ if (!workspace) {
399
+ throw new Error(`Workspace not found: ${workspaceId}`);
313
400
  }
314
- }
315
- // 3. Topological sort: parents before children
316
- const issueSet = new Set(issues.map((i) => i.number));
317
- const sorted = topologicalSortIssues(issues, issueSet);
318
- // 4. Create tasks in topological order with parent linking
319
- let imported = 0;
320
- let skipped = 0;
321
- let linked = 0;
322
- /** Tracks newly imported issues (not previously existing) for dependency resolution. */
323
- const newlyImportedIssues = [];
324
- for (const issue of sorted) {
325
- if (existingIssueNumbers.has(issue.number)) {
326
- skipped++;
327
- continue;
401
+ const workspaceSlug = slugify(workspace.name);
402
+ // 2. FETCH get issues from GitHub
403
+ const issues = await fetchGitHubIssues(repo, state, label, includeComments, client);
404
+ logger.info({ repo, state, label, count: issues.length, includeComments }, "Fetched GitHub issues");
405
+ // 3. Read existing state for deduplication
406
+ const existingTasks = persistence.listTasks(workspaceId);
407
+ const { issueNumberToTaskId, existingIssueNumbers } = buildExistingIssueMap(existingTasks);
408
+ // 4. TRANSFORM — pure planning step
409
+ const plan = planImport(issues, existingIssueNumbers, issueNumberToTaskId, generateId);
410
+ // 5. PERSIST — create tasks
411
+ for (const task of plan.tasksToCreate) {
412
+ persistence.createTask(task.id, workspaceId, task.title, task.description, [], workspaceSlug, task.parentTaskId, true);
413
+ emitter.emit("task.created", { taskId: task.id, workspaceId });
328
414
  }
329
- const title = `#${issue.number}: ${issue.title}`;
330
- let parentTaskId = "";
331
- if (issue.parentNumber !== undefined) {
332
- const resolvedParentId = issueNumberToTaskId.get(issue.parentNumber);
333
- if (resolvedParentId) {
334
- parentTaskId = resolvedParentId;
335
- linked++;
336
- }
415
+ // 6. PERSIST set dependency relationships
416
+ let dependencies = 0;
417
+ for (const dep of plan.dependenciesToSet) {
418
+ persistence.setTaskDependsOn(dep.taskId, dep.dependsOn);
419
+ dependencies += dep.dependsOn.length;
420
+ emitter.emit("task.updated", { taskId: dep.taskId, workspaceId });
337
421
  }
338
- const description = buildDescriptionWithComments(issue.body, issue.comments, issue.commentsHasNextPage);
339
- const id = uuid().slice(0, 8);
340
- taskStore.createTask(id, workspaceId, title, description, [], workspaceSlug, parentTaskId, true);
341
- emit("task.created", { taskId: id, workspaceId });
342
- issueNumberToTaskId.set(issue.number, id);
343
- newlyImportedIssues.push(issue);
344
- imported++;
422
+ logger.info({ workspaceId, imported: plan.tasksToCreate.length, linked: plan.linked, skipped: plan.skipped, dependencies }, "GitHub import complete");
423
+ return { imported: plan.tasksToCreate.length, linked: plan.linked, skipped: plan.skipped, dependencies };
345
424
  }
346
- // 5. Second pass: resolve blockedBy relationships into dependsOn arrays.
347
- // Only link relationships where both blocker and blocked are known tasks
348
- // (either newly imported or pre-existing). Skip external blockers silently.
349
- // Re-imported (skipped) issues are not updated — their existing dependsOn is preserved.
350
- let dependencies = 0;
351
- for (const issue of newlyImportedIssues) {
352
- if (issue.blockedByNumbers.length === 0) {
353
- continue;
354
- }
355
- const taskId = issueNumberToTaskId.get(issue.number);
356
- if (!taskId) {
357
- continue;
358
- }
359
- const resolvedDeps = [];
360
- for (const blockerNumber of issue.blockedByNumbers) {
361
- const blockerTaskId = issueNumberToTaskId.get(blockerNumber);
362
- if (blockerTaskId) {
363
- resolvedDeps.push(blockerTaskId);
364
- }
365
- }
366
- if (resolvedDeps.length > 0) {
367
- taskStore.setTaskDependsOn(taskId, resolvedDeps);
368
- dependencies += resolvedDeps.length;
369
- emit("task.updated", { taskId: taskId, workspaceId });
370
- }
425
+ finally {
426
+ lock.release();
371
427
  }
372
- logger.info({ workspaceId, imported, linked, skipped, dependencies }, "GitHub import complete");
373
- return { imported, linked, skipped, dependencies };
374
428
  }
375
429
  //# sourceMappingURL=github-import.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"github-import.js","sourceRoot":"","sources":["../src/github-import.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"github-import.js","sourceRoot":"","sources":["../src/github-import.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grackle-ai/server",
3
- "version": "0.53.2",
3
+ "version": "0.53.4",
4
4
  "description": "Central gRPC server with SQLite storage and WebSocket bridge for Grackle",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -35,11 +35,11 @@
35
35
  "ulid": "^2.3.0",
36
36
  "uuid": "^11.0.0",
37
37
  "ws": "^8.0.0",
38
- "@grackle-ai/adapter-sdk": "0.53.2",
39
- "@grackle-ai/common": "0.53.2",
40
- "@grackle-ai/powerline": "0.53.2",
41
- "@grackle-ai/mcp": "0.53.2",
42
- "@grackle-ai/web": "0.53.2"
38
+ "@grackle-ai/common": "0.53.4",
39
+ "@grackle-ai/adapter-sdk": "0.53.4",
40
+ "@grackle-ai/powerline": "0.53.4",
41
+ "@grackle-ai/web": "0.53.4",
42
+ "@grackle-ai/mcp": "0.53.4"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@rushstack/heft": "1.2.4",