lorenz 0.1.0 → 0.1.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.
- package/README.md +99 -44
- package/RELEASE-MANIFEST.json +2 -2
- package/apps/cli/dist/daemon.d.ts +1 -1
- package/apps/cli/dist/daemon.d.ts.map +1 -1
- package/apps/cli/dist/daemon.js +6 -13
- package/apps/cli/dist/daemon.js.map +1 -1
- package/apps/cli/dist/doctor.js +5 -5
- package/apps/cli/dist/doctor.js.map +1 -1
- package/apps/cli/dist/index.d.ts +2 -2
- package/apps/cli/dist/index.d.ts.map +1 -1
- package/apps/cli/dist/index.js +1 -1
- package/apps/cli/dist/index.js.map +1 -1
- package/apps/cli/dist/main.js +5 -5
- package/apps/cli/dist/main.js.map +1 -1
- package/apps/cli/dist/runs.js +2 -2
- package/apps/cli/dist/runs.js.map +1 -1
- package/apps/cli/dist/workerDriverLoader.js +1 -1
- package/apps/cli/package.json +1 -1
- package/apps/{symphony-dashboard/dist/assets/index-DQ6XlL0d.js → lorenz-dashboard/dist/assets/index-DD4yVBDF.js} +13 -13
- package/apps/{symphony-dashboard → lorenz-dashboard}/dist/index.html +2 -2
- package/extensions/docker-worker/dist/index.d.ts +2 -2
- package/extensions/docker-worker/dist/index.js +4 -4
- package/extensions/docker-worker/dist/index.js.map +1 -1
- package/extensions/jira-tracker/dist/client.d.ts +7 -2
- package/extensions/jira-tracker/dist/client.d.ts.map +1 -1
- package/extensions/jira-tracker/dist/client.js +163 -6
- package/extensions/jira-tracker/dist/client.js.map +1 -1
- package/extensions/jira-tracker/dist/options.d.ts +4 -2
- package/extensions/jira-tracker/dist/options.d.ts.map +1 -1
- package/extensions/jira-tracker/dist/options.js +2 -0
- package/extensions/jira-tracker/dist/options.js.map +1 -1
- package/extensions/jira-tracker/dist/provider.d.ts.map +1 -1
- package/extensions/jira-tracker/dist/provider.js +6 -0
- package/extensions/jira-tracker/dist/provider.js.map +1 -1
- package/extensions/linear-tracker/dist/client.js +9 -9
- package/extensions/linear-tracker/dist/client.js.map +1 -1
- package/extensions/linear-tracker/dist/toolOps.d.ts.map +1 -1
- package/extensions/linear-tracker/dist/toolOps.js +101 -10
- package/extensions/linear-tracker/dist/toolOps.js.map +1 -1
- package/extensions/linear-tracker/dist/tools.js +5 -5
- package/extensions/linear-tracker/dist/tools.js.map +1 -1
- package/extensions/local-tracker/dist/boardStore.d.ts +1 -1
- package/extensions/local-tracker/dist/boardStore.js +5 -5
- package/extensions/local-tracker/dist/boardStore.js.map +1 -1
- package/extensions/local-tracker/dist/options.d.ts +1 -1
- package/extensions/local-tracker/dist/options.d.ts.map +1 -1
- package/extensions/local-tracker/dist/resolveBoardDir.d.ts +2 -2
- package/extensions/local-tracker/dist/resolveBoardDir.d.ts.map +1 -1
- package/extensions/local-tracker/dist/resolveBoardDir.js +2 -2
- package/extensions/local-tracker/dist/resolveBoardDir.js.map +1 -1
- package/extensions/memory-tracker/dist/index.d.ts +1 -1
- package/extensions/memory-tracker/dist/index.js +3 -3
- package/extensions/memory-tracker/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/packages/acp/dist/index.d.ts +1 -1
- package/packages/acp/dist/index.d.ts.map +1 -1
- package/packages/acp/dist/index.js +3 -8
- package/packages/acp/dist/index.js.map +1 -1
- package/packages/acp/dist/options.d.ts +2 -2
- package/packages/acp/dist/options.d.ts.map +1 -1
- package/packages/agent-sdk/dist/provider.d.ts +1 -8
- package/packages/agent-sdk/dist/provider.d.ts.map +1 -1
- package/packages/agent-sdk/dist/provider.js.map +1 -1
- package/packages/config/dist/defaults.js +4 -4
- package/packages/config/dist/defaults.js.map +1 -1
- package/packages/config/dist/parse.js +1 -1
- package/packages/config/dist/parse.js.map +1 -1
- package/packages/config/dist/schemas.d.ts +1 -1
- package/packages/domain/dist/index.d.ts +8 -8
- package/packages/log-file/dist/index.js +2 -2
- package/packages/log-file/dist/index.js.map +1 -1
- package/packages/mcp/dist/agentEndpoint.js +2 -2
- package/packages/mcp/dist/agentEndpoint.js.map +1 -1
- package/packages/presenter/dist/index.js +1 -1
- package/packages/presenter/dist/index.js.map +1 -1
- package/packages/runtime/dist/index.d.ts +5 -5
- package/packages/runtime/dist/index.d.ts.map +1 -1
- package/packages/runtime/dist/index.js +1 -1
- package/packages/runtime/dist/index.js.map +1 -1
- package/packages/server/dist/index.js +1 -1
- package/packages/server/dist/index.js.map +1 -1
- package/packages/server/dist/issue-store.js +1 -1
- package/packages/server/dist/issue-store.js.map +1 -1
- package/packages/ssh/dist/index.js +1 -1
- package/packages/ssh/dist/index.js.map +1 -1
- package/packages/tracker-sdk/dist/index.d.ts +1 -1
- package/packages/tracker-sdk/dist/index.d.ts.map +1 -1
- package/packages/tracker-sdk/dist/index.js.map +1 -1
- package/packages/tracker-sdk/dist/provider.d.ts +13 -2
- package/packages/tracker-sdk/dist/provider.d.ts.map +1 -1
- package/packages/tracker-sdk/dist/toolPack.d.ts.map +1 -1
- package/packages/tracker-sdk/dist/toolPack.js +43 -3
- package/packages/tracker-sdk/dist/toolPack.js.map +1 -1
- package/packages/tui/dist/index.js +1 -1
- package/packages/tui/dist/index.js.map +1 -1
- package/packages/worker-sdk/dist/conformance.d.ts +1 -1
- package/packages/worker-sdk/dist/conformance.js +2 -2
- package/packages/worker-sdk/dist/conformance.js.map +1 -1
- package/packages/worker-sdk/dist/types.d.ts +1 -1
- package/packages/worker-sdk/dist/types.d.ts.map +1 -1
- package/packages/worker-sdk/dist/types.js +1 -1
- package/packages/worker-sdk/dist/types.js.map +1 -1
- package/packages/workflow/dist/index.js +1 -1
- package/packages/workflow/dist/index.js.map +1 -1
- package/packages/workspace/dist/index.d.ts +1 -1
- package/packages/workspace/dist/index.d.ts.map +1 -1
- package/packages/workspace/dist/index.js +5 -3
- package/packages/workspace/dist/index.js.map +1 -1
- package/runtime-deps/anthropic-claude-agent-sdk/node_modules/.bin/anthropic-ai-sdk +3 -7
- package/vendor/claude-agent-acp/dist/bundle.js +1 -1
- package/LICENSE +0 -201
- package/NOTICE +0 -13
- package/packages/acp/dist/toml.d.ts +0 -2
- package/packages/acp/dist/toml.d.ts.map +0 -1
- package/packages/acp/dist/toml.js +0 -51
- package/packages/acp/dist/toml.js.map +0 -1
- package/packages/mcp/dist/filter.d.ts +0 -70
- package/packages/mcp/dist/filter.d.ts.map +0 -1
- package/packages/mcp/dist/filter.js +0 -231
- package/packages/mcp/dist/filter.js.map +0 -1
- package/packages/mcp/dist/tools/linear.d.ts +0 -5
- package/packages/mcp/dist/tools/linear.d.ts.map +0 -1
- package/packages/mcp/dist/tools/linear.js +0 -192
- package/packages/mcp/dist/tools/linear.js.map +0 -1
- package/packages/mcp/dist/tools/local.d.ts +0 -5
- package/packages/mcp/dist/tools/local.d.ts.map +0 -1
- package/packages/mcp/dist/tools/local.js +0 -161
- package/packages/mcp/dist/tools/local.js.map +0 -1
- package/packages/mcp/dist/tools/result.d.ts +0 -5
- package/packages/mcp/dist/tools/result.d.ts.map +0 -1
- package/packages/mcp/dist/tools/result.js +0 -15
- package/packages/mcp/dist/tools/result.js.map +0 -1
- package/packages/policies/dist/resume.d.ts +0 -14
- package/packages/policies/dist/resume.d.ts.map +0 -1
- package/packages/policies/dist/resume.js +0 -7
- package/packages/policies/dist/resume.js.map +0 -1
- /package/apps/{symphony-dashboard → lorenz-dashboard}/dist/assets/index-B3owF3jd.css +0 -0
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
import { isRecord } from "@symphony/domain";
|
|
2
|
-
const MAX_FILTER_DEPTH = 12;
|
|
3
|
-
const MAX_FILTER_NODES = 200;
|
|
4
|
-
const DEFAULT_LIMIT = 100;
|
|
5
|
-
const MAX_LIMIT = 1000;
|
|
6
|
-
const COMPARE_OPS = new Set(["eq", "ne", "lt", "lte", "gt", "gte"]);
|
|
7
|
-
const SET_OPS = new Set(["in", "nin"]);
|
|
8
|
-
/**
|
|
9
|
-
* Validate untrusted agent input into a typed {@link Filter}, reconstructing each node so no
|
|
10
|
-
* stray properties survive. Throws a clear `Error` on malformed input or when the tree exceeds
|
|
11
|
-
* the depth/node bounds.
|
|
12
|
-
*/
|
|
13
|
-
export function parseFilter(input) {
|
|
14
|
-
return parseNode(input, 1, { nodes: 0 });
|
|
15
|
-
}
|
|
16
|
-
function parseNode(input, depth, state) {
|
|
17
|
-
if (depth > MAX_FILTER_DEPTH) {
|
|
18
|
-
throw new Error(`filter nesting exceeds ${MAX_FILTER_DEPTH} levels`);
|
|
19
|
-
}
|
|
20
|
-
if (++state.nodes > MAX_FILTER_NODES) {
|
|
21
|
-
throw new Error(`filter has more than ${MAX_FILTER_NODES} nodes`);
|
|
22
|
-
}
|
|
23
|
-
if (!isRecord(input))
|
|
24
|
-
throw new Error("filter: each node must be an object");
|
|
25
|
-
const hasAnd = "and" in input;
|
|
26
|
-
const hasOr = "or" in input;
|
|
27
|
-
const hasNot = "not" in input;
|
|
28
|
-
if (hasAnd || hasOr || hasNot) {
|
|
29
|
-
if (Object.keys(input).length !== 1) {
|
|
30
|
-
throw new Error("filter: a combinator node must have exactly one of 'and', 'or', or 'not'");
|
|
31
|
-
}
|
|
32
|
-
if (hasNot)
|
|
33
|
-
return { not: parseNode(input.not, depth + 1, state) };
|
|
34
|
-
const key = hasAnd ? "and" : "or";
|
|
35
|
-
const arr = input[key];
|
|
36
|
-
if (!Array.isArray(arr) || arr.length === 0) {
|
|
37
|
-
throw new Error(`filter: '${key}' must be a non-empty array of filters`);
|
|
38
|
-
}
|
|
39
|
-
const parsed = arr.map((node) => parseNode(node, depth + 1, state));
|
|
40
|
-
return hasAnd ? { and: parsed } : { or: parsed };
|
|
41
|
-
}
|
|
42
|
-
const field = input.field;
|
|
43
|
-
const op = input.op;
|
|
44
|
-
if (typeof field !== "string" || field === "") {
|
|
45
|
-
throw new Error("filter: predicate 'field' must be a non-empty string");
|
|
46
|
-
}
|
|
47
|
-
if (typeof op !== "string")
|
|
48
|
-
throw new Error("filter: predicate 'op' must be a string");
|
|
49
|
-
if (COMPARE_OPS.has(op)) {
|
|
50
|
-
if (!isScalar(input.value)) {
|
|
51
|
-
throw new Error(`filter: '${op}' value must be a string, number, boolean, or null`);
|
|
52
|
-
}
|
|
53
|
-
return { field, op: op, value: input.value };
|
|
54
|
-
}
|
|
55
|
-
if (SET_OPS.has(op)) {
|
|
56
|
-
const value = input.value;
|
|
57
|
-
if (!Array.isArray(value) || !value.every(isScalar)) {
|
|
58
|
-
throw new Error(`filter: '${op}' value must be an array of scalars`);
|
|
59
|
-
}
|
|
60
|
-
return { field, op: op, value: value };
|
|
61
|
-
}
|
|
62
|
-
if (op === "contains") {
|
|
63
|
-
if (typeof input.value !== "string") {
|
|
64
|
-
throw new Error("filter: 'contains' value must be a string");
|
|
65
|
-
}
|
|
66
|
-
if (input.ci !== undefined && typeof input.ci !== "boolean") {
|
|
67
|
-
throw new Error("filter: 'contains' ci must be a boolean");
|
|
68
|
-
}
|
|
69
|
-
return input.ci === undefined
|
|
70
|
-
? { field, op: "contains", value: input.value }
|
|
71
|
-
: { field, op: "contains", value: input.value, ci: input.ci };
|
|
72
|
-
}
|
|
73
|
-
if (op === "exists") {
|
|
74
|
-
if (typeof input.value !== "boolean") {
|
|
75
|
-
throw new Error("filter: 'exists' value must be a boolean");
|
|
76
|
-
}
|
|
77
|
-
return { field, op: "exists", value: input.value };
|
|
78
|
-
}
|
|
79
|
-
throw new Error(`filter: unknown op '${op}'`);
|
|
80
|
-
}
|
|
81
|
-
/** Evaluate a validated {@link Filter} against a record. Side-effect free. */
|
|
82
|
-
export function matchesFilter(record, filter) {
|
|
83
|
-
if ("and" in filter)
|
|
84
|
-
return filter.and.every((f) => matchesFilter(record, f));
|
|
85
|
-
if ("or" in filter)
|
|
86
|
-
return filter.or.some((f) => matchesFilter(record, f));
|
|
87
|
-
if ("not" in filter)
|
|
88
|
-
return !matchesFilter(record, filter.not);
|
|
89
|
-
return matchesPredicate(record, filter);
|
|
90
|
-
}
|
|
91
|
-
function matchesPredicate(record, p) {
|
|
92
|
-
// An unknown/undefined field is "absent": every comparison is false, mirroring linear_graphql's
|
|
93
|
-
// "ask for a field you do not have, get null" ergonomics. Only `exists:false` matches absence.
|
|
94
|
-
const present = Object.prototype.hasOwnProperty.call(record, p.field) && record[p.field] !== undefined;
|
|
95
|
-
if (!present)
|
|
96
|
-
return p.op === "exists" && p.value === false;
|
|
97
|
-
const raw = record[p.field];
|
|
98
|
-
switch (p.op) {
|
|
99
|
-
case "exists":
|
|
100
|
-
return p.value === true;
|
|
101
|
-
case "eq":
|
|
102
|
-
return scalarEq(raw, p.value);
|
|
103
|
-
case "ne":
|
|
104
|
-
return !scalarEq(raw, p.value);
|
|
105
|
-
case "lt":
|
|
106
|
-
case "lte":
|
|
107
|
-
case "gt":
|
|
108
|
-
case "gte": {
|
|
109
|
-
const c = compare(raw, p.value);
|
|
110
|
-
if (c === null)
|
|
111
|
-
return false;
|
|
112
|
-
if (p.op === "lt")
|
|
113
|
-
return c < 0;
|
|
114
|
-
if (p.op === "lte")
|
|
115
|
-
return c <= 0;
|
|
116
|
-
if (p.op === "gt")
|
|
117
|
-
return c > 0;
|
|
118
|
-
return c >= 0;
|
|
119
|
-
}
|
|
120
|
-
case "in":
|
|
121
|
-
return p.value.some((v) => scalarEq(raw, v));
|
|
122
|
-
case "nin":
|
|
123
|
-
return !p.value.some((v) => scalarEq(raw, v));
|
|
124
|
-
case "contains":
|
|
125
|
-
if (typeof raw === "string")
|
|
126
|
-
return strIncludes(raw, p.value, p.ci);
|
|
127
|
-
if (Array.isArray(raw))
|
|
128
|
-
return raw.some((el) => strIncludes(String(el), p.value, p.ci));
|
|
129
|
-
return false;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Parse the shared query envelope (`where`, `order_by`, `limit`, `offset`) from raw tool args.
|
|
134
|
-
* `select`, and any tracker-specific args, are parsed by the calling tool.
|
|
135
|
-
*/
|
|
136
|
-
export function parseQuerySpec(args) {
|
|
137
|
-
const spec = { orderBy: [], limit: DEFAULT_LIMIT, offset: 0 };
|
|
138
|
-
if (args.where !== undefined && args.where !== null)
|
|
139
|
-
spec.where = parseFilter(args.where);
|
|
140
|
-
if (args.order_by !== undefined)
|
|
141
|
-
spec.orderBy = parseOrderBy(args.order_by);
|
|
142
|
-
if (args.limit !== undefined)
|
|
143
|
-
spec.limit = parseLimit(args.limit);
|
|
144
|
-
if (args.offset !== undefined)
|
|
145
|
-
spec.offset = parseOffset(args.offset);
|
|
146
|
-
return spec;
|
|
147
|
-
}
|
|
148
|
-
/** Filter, then (stably) sort, then page a record list. Returns the page plus the pre-page total. */
|
|
149
|
-
export function applyQuery(records, spec) {
|
|
150
|
-
let filtered = spec.where
|
|
151
|
-
? records.filter((r) => matchesFilter(r, spec.where))
|
|
152
|
-
: records.slice();
|
|
153
|
-
if (spec.orderBy.length > 0)
|
|
154
|
-
filtered = sortRecords(filtered, spec.orderBy);
|
|
155
|
-
const total = filtered.length;
|
|
156
|
-
return { rows: filtered.slice(spec.offset, spec.offset + spec.limit), total };
|
|
157
|
-
}
|
|
158
|
-
/** Validate an optional `select` projection: an array of field-name strings, or undefined. */
|
|
159
|
-
export function parseSelect(input) {
|
|
160
|
-
if (input === undefined || input === null)
|
|
161
|
-
return undefined;
|
|
162
|
-
if (!Array.isArray(input) || !input.every((s) => typeof s === "string")) {
|
|
163
|
-
throw new Error("select must be an array of field-name strings");
|
|
164
|
-
}
|
|
165
|
-
return input;
|
|
166
|
-
}
|
|
167
|
-
/** Project a record down to the named fields, dropping any the record does not have. */
|
|
168
|
-
export function pickFields(record, fields) {
|
|
169
|
-
const out = {};
|
|
170
|
-
for (const f of fields) {
|
|
171
|
-
if (Object.prototype.hasOwnProperty.call(record, f))
|
|
172
|
-
out[f] = record[f];
|
|
173
|
-
}
|
|
174
|
-
return out;
|
|
175
|
-
}
|
|
176
|
-
function parseOrderBy(input) {
|
|
177
|
-
if (!Array.isArray(input))
|
|
178
|
-
throw new Error("order_by must be an array");
|
|
179
|
-
return input.map((item) => {
|
|
180
|
-
if (!isRecord(item) || typeof item.field !== "string" || item.field === "") {
|
|
181
|
-
throw new Error("order_by items must be { field: string, dir?: 'asc' | 'desc' }");
|
|
182
|
-
}
|
|
183
|
-
if (item.dir !== undefined && item.dir !== "asc" && item.dir !== "desc") {
|
|
184
|
-
throw new Error("order_by dir must be 'asc' or 'desc'");
|
|
185
|
-
}
|
|
186
|
-
return { field: item.field, dir: item.dir === "desc" ? "desc" : "asc" };
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
function parseLimit(input) {
|
|
190
|
-
if (typeof input !== "number" || !Number.isInteger(input) || input < 1) {
|
|
191
|
-
throw new Error("limit must be a positive integer");
|
|
192
|
-
}
|
|
193
|
-
return Math.min(input, MAX_LIMIT);
|
|
194
|
-
}
|
|
195
|
-
function parseOffset(input) {
|
|
196
|
-
if (typeof input !== "number" || !Number.isInteger(input) || input < 0) {
|
|
197
|
-
throw new Error("offset must be a non-negative integer");
|
|
198
|
-
}
|
|
199
|
-
return input;
|
|
200
|
-
}
|
|
201
|
-
function sortRecords(records, orderBy) {
|
|
202
|
-
return [...records].sort((a, b) => {
|
|
203
|
-
for (const { field, dir } of orderBy) {
|
|
204
|
-
const c = compare(a[field], b[field]);
|
|
205
|
-
if (c !== null && c !== 0)
|
|
206
|
-
return dir === "desc" ? -c : c;
|
|
207
|
-
}
|
|
208
|
-
return 0;
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
function scalarEq(a, b) {
|
|
212
|
-
return a === b;
|
|
213
|
-
}
|
|
214
|
-
/** Compare two values when both are numbers or both are strings; otherwise incomparable (null). */
|
|
215
|
-
function compare(a, b) {
|
|
216
|
-
if (typeof a === "number" && typeof b === "number")
|
|
217
|
-
return a - b;
|
|
218
|
-
if (typeof a === "string" && typeof b === "string")
|
|
219
|
-
return a < b ? -1 : a > b ? 1 : 0;
|
|
220
|
-
return null;
|
|
221
|
-
}
|
|
222
|
-
function strIncludes(haystack, needle, ci) {
|
|
223
|
-
return ci ? haystack.toLowerCase().includes(needle.toLowerCase()) : haystack.includes(needle);
|
|
224
|
-
}
|
|
225
|
-
function isScalar(value) {
|
|
226
|
-
return (value === null ||
|
|
227
|
-
typeof value === "string" ||
|
|
228
|
-
typeof value === "number" ||
|
|
229
|
-
typeof value === "boolean");
|
|
230
|
-
}
|
|
231
|
-
//# sourceMappingURL=filter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../src/filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { type Settings } from "@symphony/domain";
|
|
2
|
-
import { type ToolResult, type ToolSpec } from "../tools.js";
|
|
3
|
-
export declare function linearToolSpecs(): ToolSpec[];
|
|
4
|
-
export declare function executeLinearTool(name: string, input: unknown, settings: Settings, fetchImpl?: typeof fetch): Promise<ToolResult>;
|
|
5
|
-
//# sourceMappingURL=linear.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../src/tools/linear.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEzE,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAiB7D,wBAAgB,eAAe,IAAI,QAAQ,EAAE,CAuB5C;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,QAAQ,EAClB,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,UAAU,CAAC,CA0DrB"}
|
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
import { errorMessage, isRecord } from "@symphony/domain";
|
|
2
|
-
import { toolFailure, toolSuccess, unsupportedToolFailure } from "./result.js";
|
|
3
|
-
const LINEAR_MAX_RETRIES = 4;
|
|
4
|
-
const MAX_ERROR_BODY_LOG_BYTES = 1000;
|
|
5
|
-
const defaultLinearToolLogger = {
|
|
6
|
-
warn: (message) => console.warn(message),
|
|
7
|
-
error: (message) => console.error(message),
|
|
8
|
-
};
|
|
9
|
-
export function linearToolSpecs() {
|
|
10
|
-
return [
|
|
11
|
-
{
|
|
12
|
-
name: "linear_graphql",
|
|
13
|
-
description: "Run a Linear GraphQL operation using Symphony tracker credentials.",
|
|
14
|
-
inputSchema: {
|
|
15
|
-
type: "object",
|
|
16
|
-
additionalProperties: false,
|
|
17
|
-
properties: {
|
|
18
|
-
query: {
|
|
19
|
-
type: "string",
|
|
20
|
-
description: "GraphQL query or mutation document to execute against Linear.",
|
|
21
|
-
},
|
|
22
|
-
variables: {
|
|
23
|
-
type: ["object", "null"],
|
|
24
|
-
description: "Optional GraphQL variables object.",
|
|
25
|
-
additionalProperties: true,
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
required: ["query"],
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
];
|
|
32
|
-
}
|
|
33
|
-
export async function executeLinearTool(name, input, settings, fetchImpl = fetch) {
|
|
34
|
-
if (name !== "linear_graphql") {
|
|
35
|
-
return unsupportedToolFailure(name, ["linear_graphql"]);
|
|
36
|
-
}
|
|
37
|
-
const normalizedInput = normalizeLinearGraphqlInput(input);
|
|
38
|
-
if (!normalizedInput.ok) {
|
|
39
|
-
return toolFailure(normalizedInput.error);
|
|
40
|
-
}
|
|
41
|
-
if (!settings.tracker.apiKey)
|
|
42
|
-
return toolFailure("Symphony is missing Linear auth. Set `linear.api_key` in `WORKFLOW.md` or export `LINEAR_API_KEY`.");
|
|
43
|
-
if (normalizedInput.variables !== undefined &&
|
|
44
|
-
normalizedInput.variables !== null &&
|
|
45
|
-
!isRecord(normalizedInput.variables)) {
|
|
46
|
-
return toolFailure("`linear_graphql.variables` must be a JSON object when provided.");
|
|
47
|
-
}
|
|
48
|
-
try {
|
|
49
|
-
const logger = defaultLinearToolLogger;
|
|
50
|
-
const response = await fetchWithRateLimitRetry(fetchImpl, settings, normalizedInput.query, normalizedInput.variables ?? {}, logger);
|
|
51
|
-
const bodyResult = await readResponseJson(response);
|
|
52
|
-
if (!bodyResult.ok) {
|
|
53
|
-
if (!response.ok) {
|
|
54
|
-
logStatusError(logger, normalizedInput.query, response.status, bodyResult.rawBody);
|
|
55
|
-
return toolFailure(`Linear GraphQL request failed with HTTP ${response.status}.`, {
|
|
56
|
-
status: response.status,
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
return toolFailure(`linear_invalid_json: ${errorMessage(bodyResult.error)}`);
|
|
60
|
-
}
|
|
61
|
-
const body = bodyResult.body;
|
|
62
|
-
if (!response.ok) {
|
|
63
|
-
logStatusError(logger, normalizedInput.query, response.status, body);
|
|
64
|
-
return toolFailure(`Linear GraphQL request failed with HTTP ${response.status}.`, {
|
|
65
|
-
status: response.status,
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
if (isRecord(body) && Array.isArray(body.errors) && body.errors.length > 0) {
|
|
69
|
-
return { success: false, result: body };
|
|
70
|
-
}
|
|
71
|
-
return toolSuccess(body);
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
defaultLinearToolLogger.error(`Linear GraphQL request failed: ${errorMessage(error)}${linearErrorContext(normalizedInput.query)}`);
|
|
75
|
-
return toolFailure("Linear GraphQL request failed before receiving a successful response.", {
|
|
76
|
-
reason: errorMessage(error),
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
function normalizeLinearGraphqlInput(input) {
|
|
81
|
-
if (typeof input === "string") {
|
|
82
|
-
if (input.trim() === "")
|
|
83
|
-
return { ok: false, error: "`linear_graphql` requires a non-empty `query` string." };
|
|
84
|
-
return { ok: true, query: input };
|
|
85
|
-
}
|
|
86
|
-
if (!isRecord(input) || typeof input.query !== "string") {
|
|
87
|
-
return { ok: false, error: "`linear_graphql` requires a non-empty `query` string." };
|
|
88
|
-
}
|
|
89
|
-
if (input.query.trim() === "")
|
|
90
|
-
return { ok: false, error: "`linear_graphql` requires a non-empty `query` string." };
|
|
91
|
-
if (input.variables !== undefined && input.variables !== null && !isRecord(input.variables)) {
|
|
92
|
-
return { ok: false, error: "`linear_graphql.variables` must be a JSON object when provided." };
|
|
93
|
-
}
|
|
94
|
-
return {
|
|
95
|
-
ok: true,
|
|
96
|
-
query: input.query,
|
|
97
|
-
variables: input.variables,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
async function fetchWithRateLimitRetry(fetchImpl, settings, query, variables, logger) {
|
|
101
|
-
for (let retryCount = 0;; retryCount += 1) {
|
|
102
|
-
const response = await fetchImpl(settings.tracker.endpoint, {
|
|
103
|
-
method: "POST",
|
|
104
|
-
signal: AbortSignal.timeout(30_000),
|
|
105
|
-
headers: {
|
|
106
|
-
"content-type": "application/json",
|
|
107
|
-
authorization: settings.tracker.apiKey ?? "",
|
|
108
|
-
},
|
|
109
|
-
body: JSON.stringify({ query, variables }),
|
|
110
|
-
});
|
|
111
|
-
if (response.status !== 429 || retryCount >= LINEAR_MAX_RETRIES)
|
|
112
|
-
return response;
|
|
113
|
-
const delayMs = retryDelayMs(response.headers, retryCount);
|
|
114
|
-
logger.warn(`Linear GraphQL request rate limited status=429 retry=${retryCount + 1}/${LINEAR_MAX_RETRIES} delay_ms=${delayMs}${linearErrorContext(query, await responseBodyForLog(response))}`);
|
|
115
|
-
await sleep(delayMs);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
function retryDelayMs(headers, retryCount) {
|
|
119
|
-
const retryAfter = headers.get("retry-after");
|
|
120
|
-
if (retryAfter !== null) {
|
|
121
|
-
const seconds = Number(retryAfter.trim());
|
|
122
|
-
if (Number.isInteger(seconds) && seconds >= 0)
|
|
123
|
-
return seconds * 1000;
|
|
124
|
-
const dateMs = Date.parse(retryAfter.trim());
|
|
125
|
-
if (!Number.isNaN(dateMs))
|
|
126
|
-
return Math.max(0, dateMs - Date.now());
|
|
127
|
-
}
|
|
128
|
-
return Math.min(1_000 * 2 ** retryCount, 30_000);
|
|
129
|
-
}
|
|
130
|
-
async function sleep(delayMs) {
|
|
131
|
-
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
132
|
-
}
|
|
133
|
-
async function readResponseJson(response) {
|
|
134
|
-
let rawBody;
|
|
135
|
-
try {
|
|
136
|
-
rawBody = await response.text();
|
|
137
|
-
}
|
|
138
|
-
catch (error) {
|
|
139
|
-
return { ok: false, error };
|
|
140
|
-
}
|
|
141
|
-
try {
|
|
142
|
-
return { ok: true, body: JSON.parse(rawBody) };
|
|
143
|
-
}
|
|
144
|
-
catch (error) {
|
|
145
|
-
return { ok: false, error, rawBody };
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
async function responseBodyForLog(response) {
|
|
149
|
-
try {
|
|
150
|
-
const rawBody = await response.clone().text();
|
|
151
|
-
try {
|
|
152
|
-
return JSON.parse(rawBody);
|
|
153
|
-
}
|
|
154
|
-
catch {
|
|
155
|
-
return rawBody;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
catch {
|
|
159
|
-
return undefined;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
function logStatusError(logger, query, status, body) {
|
|
163
|
-
logger.error(`Linear GraphQL request failed status=${status}${linearErrorContext(query, body)}`);
|
|
164
|
-
}
|
|
165
|
-
function linearErrorContext(query, body) {
|
|
166
|
-
const parts = [];
|
|
167
|
-
const operation = operationName(query);
|
|
168
|
-
if (operation)
|
|
169
|
-
parts.push(`operation=${operation}`);
|
|
170
|
-
if (body !== undefined)
|
|
171
|
-
parts.push(`body=${summarizeErrorBody(body)}`);
|
|
172
|
-
return parts.length === 0 ? "" : ` ${parts.join(" ")}`;
|
|
173
|
-
}
|
|
174
|
-
function operationName(query) {
|
|
175
|
-
return /\b(?:query|mutation)\s+([A-Za-z_][A-Za-z0-9_]*)/.exec(query)?.[1] ?? null;
|
|
176
|
-
}
|
|
177
|
-
function summarizeErrorBody(body) {
|
|
178
|
-
const text = typeof body === "string" ? body : stringifyErrorBody(body);
|
|
179
|
-
const compact = text.replace(/\s+/g, " ").trim();
|
|
180
|
-
if (compact.length <= MAX_ERROR_BODY_LOG_BYTES)
|
|
181
|
-
return compact;
|
|
182
|
-
return `${compact.slice(0, MAX_ERROR_BODY_LOG_BYTES)}...<truncated>`;
|
|
183
|
-
}
|
|
184
|
-
function stringifyErrorBody(body) {
|
|
185
|
-
try {
|
|
186
|
-
return JSON.stringify(body) ?? String(body);
|
|
187
|
-
}
|
|
188
|
-
catch {
|
|
189
|
-
return String(body);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
//# sourceMappingURL=linear.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/tools/linear.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { type Settings } from "@symphony/domain";
|
|
2
|
-
import type { ToolResult, ToolSpec } from "../tools.js";
|
|
3
|
-
export declare function localToolSpecs(): ToolSpec[];
|
|
4
|
-
export declare function executeLocalTool(name: string, input: unknown, settings: Settings): Promise<ToolResult>;
|
|
5
|
-
//# sourceMappingURL=local.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/tools/local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIrF,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAexD,wBAAgB,cAAc,IAAI,QAAQ,EAAE,CA8D3C;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,UAAU,CAAC,CA4DrB"}
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
import { errorMessage, isRecord } from "@symphony/domain";
|
|
2
|
-
import { BoardStore, resolveBoardDir } from "@symphony/local-tracker";
|
|
3
|
-
import { applyQuery, parseQuerySpec, parseSelect, pickFields } from "../filter.js";
|
|
4
|
-
import { toolFailure, toolSuccess, unsupportedToolFailure } from "./result.js";
|
|
5
|
-
const TOOL_NAMES = [
|
|
6
|
-
"local_update_status",
|
|
7
|
-
"local_comment",
|
|
8
|
-
"local_create_issue",
|
|
9
|
-
"local_read_issue",
|
|
10
|
-
"local_query",
|
|
11
|
-
];
|
|
12
|
-
/** Default projection for `local_query` when `select` is omitted. */
|
|
13
|
-
const DEFAULT_LOCAL_SELECT = ["id", "title", "state", "stateType", "labels"];
|
|
14
|
-
export function localToolSpecs() {
|
|
15
|
-
return [
|
|
16
|
-
{
|
|
17
|
-
name: "local_update_status",
|
|
18
|
-
description: "Move a local board issue to a new status. Args: issueId, status.",
|
|
19
|
-
inputSchema: {
|
|
20
|
-
type: "object",
|
|
21
|
-
properties: { issueId: { type: "string" }, status: { type: "string" } },
|
|
22
|
-
required: ["issueId", "status"],
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
name: "local_comment",
|
|
27
|
-
description: "Append a comment to a local board issue. Args: issueId, body.",
|
|
28
|
-
inputSchema: {
|
|
29
|
-
type: "object",
|
|
30
|
-
properties: { issueId: { type: "string" }, body: { type: "string" } },
|
|
31
|
-
required: ["issueId", "body"],
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
name: "local_create_issue",
|
|
36
|
-
description: "Create a new local board issue. Args: title, body?, status?.",
|
|
37
|
-
inputSchema: {
|
|
38
|
-
type: "object",
|
|
39
|
-
properties: {
|
|
40
|
-
title: { type: "string" },
|
|
41
|
-
body: { type: "string" },
|
|
42
|
-
status: { type: "string" },
|
|
43
|
-
},
|
|
44
|
-
required: ["title"],
|
|
45
|
-
},
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
name: "local_read_issue",
|
|
49
|
-
description: "Read a local board issue: its current status, title, description, and comments.",
|
|
50
|
-
inputSchema: {
|
|
51
|
-
type: "object",
|
|
52
|
-
properties: { issueId: { type: "string" } },
|
|
53
|
-
required: ["issueId"],
|
|
54
|
-
},
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
name: "local_query",
|
|
58
|
-
description: "Query local board issues (read-only). Filter with a JSON predicate DSL, project fields, " +
|
|
59
|
-
"order, and page. Row fields: id, identifier, title, description, state, stateType, labels, " +
|
|
60
|
-
"createdAt, updatedAt; add 'comments' to select to include each issue's comment lines. " +
|
|
61
|
-
"Args: where? (filter), select? (string[]), order_by? ([{field,dir}]), limit?, offset?.",
|
|
62
|
-
inputSchema: {
|
|
63
|
-
type: "object",
|
|
64
|
-
properties: {
|
|
65
|
-
where: { type: "object" },
|
|
66
|
-
select: { type: "array", items: { type: "string" } },
|
|
67
|
-
order_by: { type: "array", items: { type: "object" } },
|
|
68
|
-
limit: { type: "number" },
|
|
69
|
-
offset: { type: "number" },
|
|
70
|
-
},
|
|
71
|
-
},
|
|
72
|
-
},
|
|
73
|
-
];
|
|
74
|
-
}
|
|
75
|
-
export async function executeLocalTool(name, input, settings) {
|
|
76
|
-
const store = storeFor(settings);
|
|
77
|
-
const args = isRecord(input) ? input : {};
|
|
78
|
-
try {
|
|
79
|
-
switch (name) {
|
|
80
|
-
case "local_update_status": {
|
|
81
|
-
const issue = await store.updateStatus(requireStr(args, "issueId"), requireStr(args, "status"));
|
|
82
|
-
return toolSuccess({ issue });
|
|
83
|
-
}
|
|
84
|
-
case "local_comment": {
|
|
85
|
-
await store.appendComment(requireStr(args, "issueId"), requireStr(args, "body"));
|
|
86
|
-
return toolSuccess({ ok: true });
|
|
87
|
-
}
|
|
88
|
-
case "local_create_issue": {
|
|
89
|
-
const body = optStr(args.body);
|
|
90
|
-
const status = optStr(args.status);
|
|
91
|
-
const issue = await store.create({
|
|
92
|
-
title: requireStr(args, "title"),
|
|
93
|
-
...(body !== undefined ? { body } : {}),
|
|
94
|
-
...(status !== undefined ? { status } : {}),
|
|
95
|
-
});
|
|
96
|
-
return toolSuccess({ issue });
|
|
97
|
-
}
|
|
98
|
-
case "local_read_issue": {
|
|
99
|
-
const { id, status, title, description, comments } = await store.readContent(requireStr(args, "issueId"));
|
|
100
|
-
return toolSuccess({ issue: { id, status, title, description }, comments });
|
|
101
|
-
}
|
|
102
|
-
case "local_query": {
|
|
103
|
-
const spec = parseQuerySpec(args);
|
|
104
|
-
const select = parseSelect(args.select) ?? DEFAULT_LOCAL_SELECT;
|
|
105
|
-
// Surface malformed board files instead of hiding them; a query never throws on a bad file.
|
|
106
|
-
const skipped = [];
|
|
107
|
-
const queryStore = storeFor(settings, {
|
|
108
|
-
onSkip: ({ id, error }) => skipped.push({ id, error }),
|
|
109
|
-
});
|
|
110
|
-
const records = (await queryStore.list()).map(toLocalRecord);
|
|
111
|
-
const { rows, total } = applyQuery(records, spec);
|
|
112
|
-
const includeComments = select.includes("comments");
|
|
113
|
-
const out = [];
|
|
114
|
-
for (const row of rows) {
|
|
115
|
-
const projected = pickFields(row, select);
|
|
116
|
-
// `comments` is not on the base record (it costs an extra read); fetch it only when asked.
|
|
117
|
-
if (includeComments) {
|
|
118
|
-
projected.comments = (await queryStore.readContent(String(row.id))).comments;
|
|
119
|
-
}
|
|
120
|
-
out.push(projected);
|
|
121
|
-
}
|
|
122
|
-
return toolSuccess({ rows: out, total, skipped });
|
|
123
|
-
}
|
|
124
|
-
default:
|
|
125
|
-
return unsupportedToolFailure(name, TOOL_NAMES);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
catch (error) {
|
|
129
|
-
return toolFailure(errorMessage(error));
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
function storeFor(settings, options = {}) {
|
|
133
|
-
return new BoardStore(resolveBoardDir(settings.tracker.path), {
|
|
134
|
-
...(settings.tracker.idPrefix !== undefined ? { idPrefix: settings.tracker.idPrefix } : {}),
|
|
135
|
-
...options,
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
/** Flat, filterable view of a board issue for `local_query` (comments are fetched on demand). */
|
|
139
|
-
function toLocalRecord(issue) {
|
|
140
|
-
return {
|
|
141
|
-
id: issue.id,
|
|
142
|
-
identifier: issue.identifier,
|
|
143
|
-
title: issue.title,
|
|
144
|
-
description: issue.description ?? null,
|
|
145
|
-
state: issue.state,
|
|
146
|
-
stateType: issue.stateType,
|
|
147
|
-
labels: issue.labels,
|
|
148
|
-
createdAt: issue.createdAt ?? null,
|
|
149
|
-
updatedAt: issue.updatedAt ?? null,
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
function requireStr(args, key) {
|
|
153
|
-
const value = args[key];
|
|
154
|
-
if (typeof value !== "string" || value.trim() === "")
|
|
155
|
-
throw new Error(`'${key}' is required`);
|
|
156
|
-
return value;
|
|
157
|
-
}
|
|
158
|
-
function optStr(value) {
|
|
159
|
-
return typeof value === "string" && value.trim() !== "" ? value : undefined;
|
|
160
|
-
}
|
|
161
|
-
//# sourceMappingURL=local.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/tools/local.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { ToolResult } from "../tools.js";
|
|
2
|
-
export declare function toolSuccess(result: unknown): ToolResult;
|
|
3
|
-
export declare function toolFailure(message: string, details?: Record<string, unknown>): ToolResult;
|
|
4
|
-
export declare function unsupportedToolFailure(name: string, supportedTools: readonly string[]): ToolResult;
|
|
5
|
-
//# sourceMappingURL=result.d.ts.map
|