@grackle-ai/server 0.72.6 → 0.73.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/dist/adapter-manager.js +1 -1
  2. package/dist/adapter-manager.js.map +1 -1
  3. package/dist/auto-reconnect.js +1 -1
  4. package/dist/auto-reconnect.js.map +1 -1
  5. package/dist/compute-task-status.d.ts +1 -1
  6. package/dist/compute-task-status.d.ts.map +1 -1
  7. package/dist/credential-bundle.d.ts +1 -1
  8. package/dist/credential-bundle.d.ts.map +1 -1
  9. package/dist/credential-bundle.js +2 -2
  10. package/dist/credential-bundle.js.map +1 -1
  11. package/dist/event-bus.js +1 -1
  12. package/dist/event-bus.js.map +1 -1
  13. package/dist/event-processor.d.ts.map +1 -1
  14. package/dist/event-processor.js +1 -5
  15. package/dist/event-processor.js.map +1 -1
  16. package/dist/github-import.d.ts.map +1 -1
  17. package/dist/github-import.js +1 -3
  18. package/dist/github-import.js.map +1 -1
  19. package/dist/grpc-service.d.ts.map +1 -1
  20. package/dist/grpc-service.js +2 -16
  21. package/dist/grpc-service.js.map +1 -1
  22. package/dist/index.js +6 -15
  23. package/dist/index.js.map +1 -1
  24. package/dist/knowledge-init.d.ts.map +1 -1
  25. package/dist/knowledge-init.js +1 -3
  26. package/dist/knowledge-init.js.map +1 -1
  27. package/dist/lifecycle.d.ts.map +1 -1
  28. package/dist/lifecycle.js +1 -2
  29. package/dist/lifecycle.js.map +1 -1
  30. package/dist/pipe-delivery.js +1 -1
  31. package/dist/pipe-delivery.js.map +1 -1
  32. package/dist/reanimate-agent.d.ts +1 -1
  33. package/dist/reanimate-agent.d.ts.map +1 -1
  34. package/dist/reanimate-agent.js +1 -3
  35. package/dist/reanimate-agent.js.map +1 -1
  36. package/dist/session-recovery.d.ts.map +1 -1
  37. package/dist/session-recovery.js +1 -3
  38. package/dist/session-recovery.js.map +1 -1
  39. package/dist/signals/sigchld.d.ts.map +1 -1
  40. package/dist/signals/sigchld.js +1 -2
  41. package/dist/signals/sigchld.js.map +1 -1
  42. package/dist/signals/signal-delivery.js +1 -1
  43. package/dist/signals/signal-delivery.js.map +1 -1
  44. package/dist/test-utils/mock-database.d.ts +130 -0
  45. package/dist/test-utils/mock-database.d.ts.map +1 -0
  46. package/dist/test-utils/mock-database.js +147 -0
  47. package/dist/test-utils/mock-database.js.map +1 -0
  48. package/dist/token-push.d.ts.map +1 -1
  49. package/dist/token-push.js +3 -4
  50. package/dist/token-push.js.map +1 -1
  51. package/dist/ws-bridge.d.ts +1 -1
  52. package/dist/ws-bridge.d.ts.map +1 -1
  53. package/dist/ws-bridge.js +2 -16
  54. package/dist/ws-bridge.js.map +1 -1
  55. package/dist/ws-broadcast.d.ts +1 -1
  56. package/dist/ws-broadcast.d.ts.map +1 -1
  57. package/dist/ws-broadcast.js +1 -1
  58. package/dist/ws-broadcast.js.map +1 -1
  59. package/package.json +14 -12
  60. package/dist/credential-providers.d.ts +0 -41
  61. package/dist/credential-providers.d.ts.map +0 -1
  62. package/dist/credential-providers.js +0 -98
  63. package/dist/credential-providers.js.map +0 -1
  64. package/dist/crypto.d.ts +0 -5
  65. package/dist/crypto.d.ts.map +0 -1
  66. package/dist/crypto.js +0 -74
  67. package/dist/crypto.js.map +0 -1
  68. package/dist/db-seed.d.ts +0 -16
  69. package/dist/db-seed.d.ts.map +0 -1
  70. package/dist/db-seed.js +0 -176
  71. package/dist/db-seed.js.map +0 -1
  72. package/dist/db.d.ts +0 -43
  73. package/dist/db.d.ts.map +0 -1
  74. package/dist/db.js +0 -478
  75. package/dist/db.js.map +0 -1
  76. package/dist/env-registry.d.ts +0 -29
  77. package/dist/env-registry.d.ts.map +0 -1
  78. package/dist/env-registry.js +0 -78
  79. package/dist/env-registry.js.map +0 -1
  80. package/dist/event-store.d.ts +0 -9
  81. package/dist/event-store.d.ts.map +0 -1
  82. package/dist/event-store.js +0 -16
  83. package/dist/event-store.js.map +0 -1
  84. package/dist/finding-store.d.ts +0 -7
  85. package/dist/finding-store.d.ts.map +0 -1
  86. package/dist/finding-store.js +0 -45
  87. package/dist/finding-store.js.map +0 -1
  88. package/dist/json-helpers.d.ts +0 -7
  89. package/dist/json-helpers.d.ts.map +0 -1
  90. package/dist/json-helpers.js +0 -22
  91. package/dist/json-helpers.js.map +0 -1
  92. package/dist/orchestrator-context.d.ts +0 -31
  93. package/dist/orchestrator-context.d.ts.map +0 -1
  94. package/dist/orchestrator-context.js +0 -95
  95. package/dist/orchestrator-context.js.map +0 -1
  96. package/dist/paths.d.ts +0 -7
  97. package/dist/paths.d.ts.map +0 -1
  98. package/dist/paths.js +0 -12
  99. package/dist/paths.js.map +0 -1
  100. package/dist/persona-store.d.ts +0 -15
  101. package/dist/persona-store.d.ts.map +0 -1
  102. package/dist/persona-store.js +0 -57
  103. package/dist/persona-store.js.map +0 -1
  104. package/dist/resolve-persona.d.ts +0 -33
  105. package/dist/resolve-persona.d.ts.map +0 -1
  106. package/dist/resolve-persona.js +0 -44
  107. package/dist/resolve-persona.js.map +0 -1
  108. package/dist/schema.d.ts +0 -1784
  109. package/dist/schema.d.ts.map +0 -1
  110. package/dist/schema.js +0 -152
  111. package/dist/schema.js.map +0 -1
  112. package/dist/session-store.d.ts +0 -57
  113. package/dist/session-store.d.ts.map +0 -1
  114. package/dist/session-store.js +0 -204
  115. package/dist/session-store.js.map +0 -1
  116. package/dist/settings-store.d.ts +0 -14
  117. package/dist/settings-store.d.ts.map +0 -1
  118. package/dist/settings-store.js +0 -30
  119. package/dist/settings-store.js.map +0 -1
  120. package/dist/system-prompt-builder.d.ts +0 -145
  121. package/dist/system-prompt-builder.d.ts.map +0 -1
  122. package/dist/system-prompt-builder.js +0 -323
  123. package/dist/system-prompt-builder.js.map +0 -1
  124. package/dist/task-store.d.ts +0 -71
  125. package/dist/task-store.d.ts.map +0 -1
  126. package/dist/task-store.js +0 -301
  127. package/dist/task-store.js.map +0 -1
  128. package/dist/test-db.d.ts +0 -13
  129. package/dist/test-db.d.ts.map +0 -1
  130. package/dist/test-db.js +0 -14
  131. package/dist/test-db.js.map +0 -1
  132. package/dist/token-store.d.ts +0 -25
  133. package/dist/token-store.d.ts.map +0 -1
  134. package/dist/token-store.js +0 -58
  135. package/dist/token-store.js.map +0 -1
  136. package/dist/utils/slugify.d.ts +0 -20
  137. package/dist/utils/slugify.d.ts.map +0 -1
  138. package/dist/utils/slugify.js +0 -22
  139. package/dist/utils/slugify.js.map +0 -1
  140. package/dist/workspace-store.d.ts +0 -29
  141. package/dist/workspace-store.d.ts.map +0 -1
  142. package/dist/workspace-store.js +0 -74
  143. package/dist/workspace-store.js.map +0 -1
@@ -1,45 +0,0 @@
1
- import db from "./db.js";
2
- import { findings } from "./schema.js";
3
- import { eq, desc, sql, and } from "drizzle-orm";
4
- import { safeParseJsonArray } from "./json-helpers.js";
5
- /** Insert a new finding record. */
6
- export function postFinding(id, workspaceId, taskId, sessionId, category, title, content, tags) {
7
- db.insert(findings).values({
8
- id,
9
- workspaceId,
10
- taskId,
11
- sessionId,
12
- category,
13
- title,
14
- content,
15
- tags: JSON.stringify(tags),
16
- }).run();
17
- }
18
- /** Query findings for a workspace, optionally filtering by categories and tags. */
19
- export function queryFindings(workspaceId, categories, tags, limit) {
20
- const maxResults = Math.min(limit || 50, 100);
21
- let results;
22
- if (categories && categories.length > 0) {
23
- results = db.select().from(findings)
24
- .where(and(eq(findings.workspaceId, workspaceId), sql `${findings.category} IN (SELECT value FROM json_each(${JSON.stringify(categories)}))`))
25
- .orderBy(desc(findings.createdAt))
26
- .limit(maxResults)
27
- .all();
28
- }
29
- else {
30
- results = db.select().from(findings)
31
- .where(eq(findings.workspaceId, workspaceId))
32
- .orderBy(desc(findings.createdAt))
33
- .limit(maxResults)
34
- .all();
35
- }
36
- // Client-side tag filtering (simple approach)
37
- if (tags && tags.length > 0) {
38
- results = results.filter((r) => {
39
- const rowTags = safeParseJsonArray(r.tags);
40
- return tags.some((t) => rowTags.includes(t));
41
- });
42
- }
43
- return results;
44
- }
45
- //# sourceMappingURL=finding-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"finding-store.js","sourceRoot":"","sources":["../src/finding-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAmB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAIvD,mCAAmC;AACnC,MAAM,UAAU,WAAW,CACzB,EAAU,EACV,WAAmB,EACnB,MAAc,EACd,SAAiB,EACjB,QAAgB,EAChB,KAAa,EACb,OAAe,EACf,IAAc;IAEd,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;QACzB,EAAE;QACF,WAAW;QACX,MAAM;QACN,SAAS;QACT,QAAQ;QACR,KAAK;QACL,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC,GAAG,EAAE,CAAC;AACX,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,aAAa,CAC3B,WAAmB,EACnB,UAAqB,EACrB,IAAe,EACf,KAAc;IAEd,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IAE9C,IAAI,OAAqB,CAAC;IAC1B,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,OAAO,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;aACjC,KAAK,CAAC,GAAG,CACR,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,EACrC,GAAG,CAAA,GAAG,QAAQ,CAAC,QAAQ,oCAAoC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAC1F,CAAC;aACD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;aACjC,KAAK,CAAC,UAAU,CAAC;aACjB,GAAG,EAAE,CAAC;IACX,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;aACjC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;aAC5C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;aACjC,KAAK,CAAC,UAAU,CAAC;aACjB,GAAG,EAAE,CAAC;IACX,CAAC;IAED,8CAA8C;IAC9C,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7B,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Safely parse a JSON string that is expected to contain an array of strings.
3
- * Returns the parsed array on success, or an empty array if the value is
4
- * null, undefined, empty, or contains malformed JSON.
5
- */
6
- export declare function safeParseJsonArray(value: string | null | undefined): string[];
7
- //# sourceMappingURL=json-helpers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"json-helpers.d.ts","sourceRoot":"","sources":["../src/json-helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAa7E"}
@@ -1,22 +0,0 @@
1
- /**
2
- * Safely parse a JSON string that is expected to contain an array of strings.
3
- * Returns the parsed array on success, or an empty array if the value is
4
- * null, undefined, empty, or contains malformed JSON.
5
- */
6
- // eslint-disable-next-line @rushstack/no-new-null
7
- export function safeParseJsonArray(value) {
8
- if (!value) {
9
- return [];
10
- }
11
- try {
12
- const parsed = JSON.parse(value);
13
- if (Array.isArray(parsed)) {
14
- return parsed.filter((item) => typeof item === "string");
15
- }
16
- return [];
17
- }
18
- catch {
19
- return [];
20
- }
21
- }
22
- //# sourceMappingURL=json-helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"json-helpers.js","sourceRoot":"","sources":["../src/json-helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,kDAAkD;AAClD,MAAM,UAAU,kBAAkB,CAAC,KAAgC;IACjE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -1,31 +0,0 @@
1
- /**
2
- * Fetches and assembles all data needed for the orchestrator system prompt.
3
- * Centralizes store reads so both gRPC and WebSocket call sites share
4
- * the same data-fetching logic.
5
- */
6
- import type { TaskTreeNode, PersonaSummary, EnvironmentSummary } from "./system-prompt-builder.js";
7
- /** Pre-fetched orchestrator data matching SystemPromptOptions fields. */
8
- export interface OrchestratorContext {
9
- /** Workspace metadata (undefined when workspace not found). */
10
- workspace?: {
11
- name: string;
12
- description: string;
13
- repoUrl: string;
14
- };
15
- /** All tasks in the workspace mapped to tree nodes. */
16
- taskTree: TaskTreeNode[];
17
- /** All available personas. */
18
- availablePersonas: PersonaSummary[];
19
- /** All available environments. */
20
- availableEnvironments: EnvironmentSummary[];
21
- /** Pre-built findings context string. */
22
- findingsContext: string;
23
- }
24
- /**
25
- * Fetch all data needed for an orchestrator system prompt.
26
- *
27
- * @param workspaceId - The workspace to scope task/findings queries to.
28
- * @returns Data ready to spread into SystemPromptOptions.
29
- */
30
- export declare function fetchOrchestratorContext(workspaceId: string): OrchestratorContext | undefined;
31
- //# sourceMappingURL=orchestrator-context.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orchestrator-context.d.ts","sourceRoot":"","sources":["../src/orchestrator-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAQnG,yEAAyE;AACzE,MAAM,WAAW,mBAAmB;IAClC,+DAA+D;IAC/D,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,uDAAuD;IACvD,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,8BAA8B;IAC9B,iBAAiB,EAAE,cAAc,EAAE,CAAC;IACpC,kCAAkC;IAClC,qBAAqB,EAAE,kBAAkB,EAAE,CAAC;IAC5C,yCAAyC;IACzC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CA8D7F"}
@@ -1,95 +0,0 @@
1
- import * as taskStore from "./task-store.js";
2
- import * as personaStore from "./persona-store.js";
3
- import * as envRegistry from "./env-registry.js";
4
- import * as findingStore from "./finding-store.js";
5
- import * as workspaceStore from "./workspace-store.js";
6
- import { safeParseJsonArray } from "./json-helpers.js";
7
- /**
8
- * Fetch all data needed for an orchestrator system prompt.
9
- *
10
- * @param workspaceId - The workspace to scope task/findings queries to.
11
- * @returns Data ready to spread into SystemPromptOptions.
12
- */
13
- export function fetchOrchestratorContext(workspaceId) {
14
- // No workspace → no orchestrator context (root/System task)
15
- if (!workspaceId) {
16
- return undefined;
17
- }
18
- // Workspace metadata
19
- const ws = workspaceStore.getWorkspace(workspaceId);
20
- // All personas (used for both the roster and persona name resolution)
21
- const allPersonas = personaStore.listPersonas();
22
- const personaNameMap = new Map();
23
- for (const p of allPersonas) {
24
- personaNameMap.set(p.id, p.name);
25
- }
26
- // All tasks in this workspace → TaskTreeNode[]
27
- const allTasks = taskStore.listTasks(workspaceId || undefined);
28
- const taskTree = allTasks.map((t) => ({
29
- id: t.id,
30
- title: t.title,
31
- status: t.status,
32
- depth: t.depth,
33
- parentTaskId: t.parentTaskId,
34
- dependsOn: safeParseJsonArray(t.dependsOn),
35
- personaName: personaNameMap.get(t.defaultPersonaId) || "",
36
- branch: t.branch,
37
- canDecompose: t.canDecompose,
38
- }));
39
- // Available personas
40
- const availablePersonas = allPersonas.map((p) => ({
41
- name: p.name,
42
- description: p.description,
43
- runtime: p.runtime,
44
- model: p.model,
45
- }));
46
- // Available environments
47
- const availableEnvironments = envRegistry.listEnvironments().map((e) => ({
48
- displayName: e.displayName,
49
- adapterType: e.adapterType,
50
- status: e.status,
51
- defaultRuntime: e.defaultRuntime,
52
- }));
53
- // Findings context (pre-formatted markdown with 8K char budget)
54
- const findingsContext = workspaceId
55
- ? buildFindingsContext(workspaceId)
56
- : "";
57
- return {
58
- workspace: ws ? {
59
- name: ws.name,
60
- description: ws.description,
61
- repoUrl: ws.repoUrl,
62
- } : undefined,
63
- taskTree,
64
- availablePersonas,
65
- availableEnvironments,
66
- findingsContext,
67
- };
68
- }
69
- // ─── Findings Context Builder ──────────────────────────────
70
- /** Maximum total characters for the findings context block. */
71
- const FINDINGS_MAX_CHARS = 8000;
72
- /** Maximum characters per individual finding's content. */
73
- const FINDINGS_MAX_PER_FINDING = 500;
74
- /** Build a summarized text context of recent findings for a workspace. */
75
- function buildFindingsContext(workspaceId) {
76
- const allFindings = findingStore.queryFindings(workspaceId, undefined, undefined, 20);
77
- if (allFindings.length === 0) {
78
- return "";
79
- }
80
- const lines = ["## Workspace Findings (shared knowledge from other agents)\n"];
81
- let totalChars = lines[0].length;
82
- for (const f of allFindings) {
83
- const content = f.content.length > FINDINGS_MAX_PER_FINDING
84
- ? f.content.slice(0, FINDINGS_MAX_PER_FINDING) + "..."
85
- : f.content;
86
- const entry = `### [${f.category}] ${f.title}\n${content}\n`;
87
- if (totalChars + entry.length > FINDINGS_MAX_CHARS) {
88
- break;
89
- }
90
- lines.push(entry);
91
- totalChars += entry.length;
92
- }
93
- return lines.join("\n");
94
- }
95
- //# sourceMappingURL=orchestrator-context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orchestrator-context.js","sourceRoot":"","sources":["../src/orchestrator-context.ts"],"names":[],"mappings":"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"}
package/dist/paths.d.ts DELETED
@@ -1,7 +0,0 @@
1
- /**
2
- * Resolve the root Grackle data directory. Uses `GRACKLE_HOME` env var if set,
3
- * otherwise falls back to `~/.grackle`. This allows test isolation by pointing
4
- * to a temp directory.
5
- */
6
- export declare const grackleHome: string;
7
- //# sourceMappingURL=paths.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,MAGQ,CAAC"}
package/dist/paths.js DELETED
@@ -1,12 +0,0 @@
1
- import { homedir } from "node:os";
2
- import { join } from "node:path";
3
- import { GRACKLE_DIR } from "@grackle-ai/common";
4
- /**
5
- * Resolve the root Grackle data directory. Uses `GRACKLE_HOME` env var if set,
6
- * otherwise falls back to `~/.grackle`. This allows test isolation by pointing
7
- * to a temp directory.
8
- */
9
- export const grackleHome = process.env.GRACKLE_HOME
10
- ? join(process.env.GRACKLE_HOME, GRACKLE_DIR)
11
- : join(homedir(), GRACKLE_DIR);
12
- //# sourceMappingURL=paths.js.map
package/dist/paths.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GACtB,OAAO,CAAC,GAAG,CAAC,YAAY;IACtB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC;IAC7C,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC"}
@@ -1,15 +0,0 @@
1
- import { type PersonaRow } from "./schema.js";
2
- export type { PersonaRow };
3
- /** Insert a new persona record. */
4
- export declare function createPersona(id: string, name: string, description: string, systemPrompt: string, toolConfig: string, runtime: string, model: string, maxTurns: number, mcpServers: string, type?: string, script?: string): void;
5
- /** Retrieve a single persona by ID. */
6
- export declare function getPersona(id: string): PersonaRow | undefined;
7
- /** Retrieve a persona by name. */
8
- export declare function getPersonaByName(name: string): PersonaRow | undefined;
9
- /** Return all personas, ordered by name. */
10
- export declare function listPersonas(): PersonaRow[];
11
- /** Update an existing persona. */
12
- export declare function updatePersona(id: string, name: string, description: string, systemPrompt: string, toolConfig: string, runtime: string, model: string, maxTurns: number, mcpServers: string, type?: string, script?: string): void;
13
- /** Delete a persona by ID. */
14
- export declare function deletePersona(id: string): void;
15
- //# sourceMappingURL=persona-store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"persona-store.d.ts","sourceRoot":"","sources":["../src/persona-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAGxD,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B,mCAAmC;AACnC,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,MAAgB,EACtB,MAAM,GAAE,MAAW,GAClB,IAAI,CAgBN;AAED,uCAAuC;AACvC,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAE7D;AAED,kCAAkC;AAClC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAErE;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,IAAI,UAAU,EAAE,CAE3C;AAED,kCAAkC;AAClC,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,MAAgB,EACtB,MAAM,GAAE,MAAW,GAClB,IAAI,CAiBN;AAED,8BAA8B;AAC9B,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE9C"}
@@ -1,57 +0,0 @@
1
- import db from "./db.js";
2
- import { personas } from "./schema.js";
3
- import { eq, asc, sql } from "drizzle-orm";
4
- /** Insert a new persona record. */
5
- export function createPersona(id, name, description, systemPrompt, toolConfig, runtime, model, maxTurns, mcpServers, type = "agent", script = "") {
6
- db.insert(personas)
7
- .values({
8
- id,
9
- name,
10
- description,
11
- systemPrompt,
12
- toolConfig,
13
- runtime,
14
- model,
15
- maxTurns,
16
- mcpServers,
17
- type,
18
- script,
19
- })
20
- .run();
21
- }
22
- /** Retrieve a single persona by ID. */
23
- export function getPersona(id) {
24
- return db.select().from(personas).where(eq(personas.id, id)).get();
25
- }
26
- /** Retrieve a persona by name. */
27
- export function getPersonaByName(name) {
28
- return db.select().from(personas).where(eq(personas.name, name)).get();
29
- }
30
- /** Return all personas, ordered by name. */
31
- export function listPersonas() {
32
- return db.select().from(personas).orderBy(asc(personas.name)).all();
33
- }
34
- /** Update an existing persona. */
35
- export function updatePersona(id, name, description, systemPrompt, toolConfig, runtime, model, maxTurns, mcpServers, type = "agent", script = "") {
36
- db.update(personas)
37
- .set({
38
- name,
39
- description,
40
- systemPrompt,
41
- toolConfig,
42
- runtime,
43
- model,
44
- maxTurns,
45
- mcpServers,
46
- type,
47
- script,
48
- updatedAt: sql `datetime('now')`,
49
- })
50
- .where(eq(personas.id, id))
51
- .run();
52
- }
53
- /** Delete a persona by ID. */
54
- export function deletePersona(id) {
55
- db.delete(personas).where(eq(personas.id, id)).run();
56
- }
57
- //# sourceMappingURL=persona-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"persona-store.js","sourceRoot":"","sources":["../src/persona-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAmB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAI3C,mCAAmC;AACnC,MAAM,UAAU,aAAa,CAC3B,EAAU,EACV,IAAY,EACZ,WAAmB,EACnB,YAAoB,EACpB,UAAkB,EAClB,OAAe,EACf,KAAa,EACb,QAAgB,EAChB,UAAkB,EAClB,OAAe,OAAO,EACtB,SAAiB,EAAE;IAEnB,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;SAChB,MAAM,CAAC;QACN,EAAE;QACF,IAAI;QACJ,WAAW;QACX,YAAY;QACZ,UAAU;QACV,OAAO;QACP,KAAK;QACL,QAAQ;QACR,UAAU;QACV,IAAI;QACJ,MAAM;KACP,CAAC;SACD,GAAG,EAAE,CAAC;AACX,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACrE,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACzE,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,YAAY;IAC1B,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACtE,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,aAAa,CAC3B,EAAU,EACV,IAAY,EACZ,WAAmB,EACnB,YAAoB,EACpB,UAAkB,EAClB,OAAe,EACf,KAAa,EACb,QAAgB,EAChB,UAAkB,EAClB,OAAe,OAAO,EACtB,SAAiB,EAAE;IAEnB,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;SAChB,GAAG,CAAC;QACH,IAAI;QACJ,WAAW;QACX,YAAY;QACZ,UAAU;QACV,OAAO;QACP,KAAK;QACL,QAAQ;QACR,UAAU;QACV,IAAI;QACJ,MAAM;QACN,SAAS,EAAE,GAAG,CAAA,iBAAiB;KAChC,CAAC;SACD,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;SAC1B,GAAG,EAAE,CAAC;AACX,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACvD,CAAC"}
@@ -1,33 +0,0 @@
1
- import type { PersonaRow } from "./schema.js";
2
- /** Resolved persona fields needed to start a session. */
3
- export interface ResolvedPersona {
4
- /** The persona ID that was resolved. */
5
- personaId: string;
6
- /** Agent runtime implementation (e.g. "claude-code", "codex", "genaiscript"). */
7
- runtime: string;
8
- /** LLM model identifier (e.g. "sonnet", "gpt-4.1"). */
9
- model: string;
10
- /** Maximum turns for the agent session (0 = unlimited). */
11
- maxTurns: number;
12
- /** System prompt to prepend. */
13
- systemPrompt: string;
14
- /** JSON tool configuration. */
15
- toolConfig: string;
16
- /** JSON array of MCP server configs. */
17
- mcpServers: string;
18
- /** Persona type: "agent" (interactive LLM session) or "script" (run-to-completion). */
19
- type: string;
20
- /** Script source code (non-empty for script personas). */
21
- script: string;
22
- /** The full persona row for additional fields. */
23
- persona: PersonaRow;
24
- }
25
- /**
26
- * Resolve a persona using the cascade:
27
- * request persona → task default → workspace default → app default → error
28
- *
29
- * The first non-empty persona ID in the cascade is used to look up the persona.
30
- * Throws if no persona ID is found at any level, or if the resolved ID does not exist.
31
- */
32
- export declare function resolvePersona(requestPersonaId: string, taskDefaultPersonaId?: string, workspaceDefaultPersonaId?: string): ResolvedPersona;
33
- //# sourceMappingURL=resolve-persona.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolve-persona.d.ts","sourceRoot":"","sources":["../src/resolve-persona.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,yDAAyD;AACzD,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,OAAO,EAAE,UAAU,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,gBAAgB,EAAE,MAAM,EACxB,oBAAoB,CAAC,EAAE,MAAM,EAC7B,yBAAyB,CAAC,EAAE,MAAM,GACjC,eAAe,CAyCjB"}
@@ -1,44 +0,0 @@
1
- import * as personaStore from "./persona-store.js";
2
- import * as settingsStore from "./settings-store.js";
3
- /**
4
- * Resolve a persona using the cascade:
5
- * request persona → task default → workspace default → app default → error
6
- *
7
- * The first non-empty persona ID in the cascade is used to look up the persona.
8
- * Throws if no persona ID is found at any level, or if the resolved ID does not exist.
9
- */
10
- export function resolvePersona(requestPersonaId, taskDefaultPersonaId, workspaceDefaultPersonaId) {
11
- const personaId = requestPersonaId ||
12
- taskDefaultPersonaId ||
13
- workspaceDefaultPersonaId ||
14
- settingsStore.getSetting("default_persona_id") ||
15
- "";
16
- if (!personaId) {
17
- throw new Error("No persona configured. Set a default persona at the app, workspace, or task level, or specify one explicitly.");
18
- }
19
- const persona = personaStore.getPersona(personaId);
20
- if (!persona) {
21
- throw new Error(`Persona not found: ${personaId}`);
22
- }
23
- const personaType = persona.type || "agent";
24
- if (!persona.runtime) {
25
- throw new Error(`Persona "${persona.name}" has no runtime configured`);
26
- }
27
- // Model is required for agent personas but optional for script personas
28
- if (personaType !== "script" && !persona.model) {
29
- throw new Error(`Persona "${persona.name}" has no model configured`);
30
- }
31
- return {
32
- personaId: persona.id,
33
- runtime: persona.runtime,
34
- model: persona.model,
35
- maxTurns: persona.maxTurns,
36
- systemPrompt: persona.systemPrompt,
37
- toolConfig: persona.toolConfig,
38
- mcpServers: persona.mcpServers,
39
- type: personaType,
40
- script: persona.script,
41
- persona,
42
- };
43
- }
44
- //# sourceMappingURL=resolve-persona.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolve-persona.js","sourceRoot":"","sources":["../src/resolve-persona.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AA2BrD;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,gBAAwB,EACxB,oBAA6B,EAC7B,yBAAkC;IAElC,MAAM,SAAS,GACb,gBAAgB;QAChB,oBAAoB;QACpB,yBAAyB;QACzB,aAAa,CAAC,UAAU,CAAC,oBAAoB,CAAC;QAC9C,EAAE,CAAC;IAEL,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,+GAA+G,CAChH,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC;IAE5C,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,YAAY,OAAO,CAAC,IAAI,6BAA6B,CAAC,CAAC;IACzE,CAAC;IACD,wEAAwE;IACxE,IAAI,WAAW,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,YAAY,OAAO,CAAC,IAAI,2BAA2B,CAAC,CAAC;IACvE,CAAC;IAED,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO;KACR,CAAC;AACJ,CAAC"}