@pikku/addon-console 0.12.8 → 0.12.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.pikku/addon/pikku-addon-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/pikku-addon-types.gen.js +1 -1
- package/dist/.pikku/addon/pikku-package.gen.js +1 -1
- package/dist/.pikku/agent/pikku-agent-map.gen.d.ts +1 -1
- package/dist/.pikku/agent/pikku-agent-types.gen.d.ts +1 -1
- package/dist/.pikku/channel/pikku-channel-types.gen.d.ts +1 -1
- package/dist/.pikku/channel/pikku-channel-types.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-types.gen.d.ts +1 -1
- package/dist/.pikku/cli/pikku-cli-types.gen.js +1 -1
- package/dist/.pikku/console/pikku-node-types.gen.d.ts +1 -1
- package/dist/.pikku/function/pikku-function-types.gen.d.ts +43 -69
- package/dist/.pikku/function/pikku-function-types.gen.d.ts.map +1 -1
- package/dist/.pikku/function/pikku-function-types.gen.js +33 -40
- package/dist/.pikku/function/pikku-function-types.gen.js.map +1 -1
- package/dist/.pikku/function/pikku-functions-meta.gen.js +1 -1
- package/dist/.pikku/function/pikku-functions-meta.gen.json +115 -12
- package/dist/.pikku/function/pikku-functions.gen.js +7 -1
- package/dist/.pikku/function/pikku-functions.gen.js.map +1 -1
- package/dist/.pikku/http/pikku-http-types.gen.d.ts +1 -1
- package/dist/.pikku/http/pikku-http-types.gen.js +1 -1
- package/dist/.pikku/mcp/pikku-mcp-types.gen.d.ts +1 -1
- package/dist/.pikku/mcp/pikku-mcp-types.gen.js +1 -1
- package/dist/.pikku/pikku-bootstrap.gen.d.ts +1 -1
- package/dist/.pikku/pikku-bootstrap.gen.js +1 -1
- package/dist/.pikku/pikku-meta-service.gen.d.ts +1 -1
- package/dist/.pikku/pikku-meta-service.gen.js +1 -1
- package/dist/.pikku/pikku-services.gen.d.ts +5 -2
- package/dist/.pikku/pikku-services.gen.d.ts.map +1 -1
- package/dist/.pikku/pikku-services.gen.js +3 -0
- package/dist/.pikku/pikku-services.gen.js.map +1 -1
- package/dist/.pikku/pikku-types.gen.d.ts +1 -1
- package/dist/.pikku/pikku-types.gen.js +1 -1
- package/dist/.pikku/queue/pikku-queue-types.gen.d.ts +1 -1
- package/dist/.pikku/queue/pikku-queue-types.gen.js +1 -1
- package/dist/.pikku/rpc/pikku-rpc-wirings-map.gen.d.ts +20 -6
- package/dist/.pikku/rpc/pikku-rpc-wirings-map.internal.gen.d.ts +20 -6
- package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.js +1 -1
- package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.json +3 -0
- package/dist/.pikku/scheduler/pikku-scheduler-types.gen.d.ts +1 -1
- package/dist/.pikku/scheduler/pikku-scheduler-types.gen.js +1 -1
- package/dist/.pikku/schemas/register.gen.js +7 -1
- package/dist/.pikku/schemas/register.gen.js.map +1 -1
- package/dist/.pikku/schemas/schemas/AddonPackageInfo.schema.json +1 -1
- package/dist/.pikku/schemas/schemas/AllMeta.schema.json +1 -1
- package/dist/.pikku/schemas/schemas/FunctionCoverageReport.schema.json +1 -0
- package/dist/.pikku/schemas/schemas/GetAddonMetaOutput.schema.json +1 -1
- package/dist/.pikku/schemas/schemas/GetAgentThreadsInput.schema.json +1 -1
- package/dist/.pikku/schemas/schemas/GetFunctionsMetaOutput.schema.json +1 -1
- package/dist/.pikku/schemas/schemas/GetStateDiffInput.schema.json +1 -0
- package/dist/.pikku/schemas/schemas/StateDiff.schema.json +1 -0
- package/dist/.pikku/secrets/pikku-secret-types.gen.d.ts +1 -1
- package/dist/.pikku/secrets/pikku-secret-types.gen.js +1 -1
- package/dist/.pikku/secrets/pikku-secrets.gen.d.ts +1 -1
- package/dist/.pikku/secrets/pikku-secrets.gen.js +1 -1
- package/dist/.pikku/trigger/pikku-trigger-types.gen.d.ts +1 -1
- package/dist/.pikku/trigger/pikku-trigger-types.gen.js +1 -1
- package/dist/.pikku/variables/pikku-variable-types.gen.d.ts +1 -1
- package/dist/.pikku/variables/pikku-variable-types.gen.js +1 -1
- package/dist/.pikku/variables/pikku-variables.gen.d.ts +1 -1
- package/dist/.pikku/variables/pikku-variables.gen.js +1 -1
- package/dist/.pikku/workflow/pikku-workflow-map.gen.d.ts +1 -1
- package/dist/.pikku/workflow/pikku-workflow-types.gen.d.ts +1 -1
- package/dist/.pikku/workflow/pikku-workflow-types.gen.js +1 -1
- package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.js +1 -1
- package/dist/.pikku/workflow/pikku-workflow-wirings.gen.d.ts +1 -1
- package/dist/.pikku/workflow/pikku-workflow-wirings.gen.js +1 -1
- package/dist/src/functions/delete-agent-thread.function.d.ts.map +1 -1
- package/dist/src/functions/delete-agent-thread.function.js.map +1 -1
- package/dist/src/functions/delete-workflow-run.function.d.ts.map +1 -1
- package/dist/src/functions/delete-workflow-run.function.js.map +1 -1
- package/dist/src/functions/get-agent-thread-messages.function.d.ts.map +1 -1
- package/dist/src/functions/get-agent-thread-messages.function.js.map +1 -1
- package/dist/src/functions/get-agent-thread-runs.function.d.ts.map +1 -1
- package/dist/src/functions/get-agent-thread-runs.function.js.map +1 -1
- package/dist/src/functions/get-agent-threads.function.d.ts +3 -0
- package/dist/src/functions/get-agent-threads.function.d.ts.map +1 -1
- package/dist/src/functions/get-agent-threads.function.js +2 -1
- package/dist/src/functions/get-agent-threads.function.js.map +1 -1
- package/dist/src/functions/get-ai-workflows.function.d.ts.map +1 -1
- package/dist/src/functions/get-ai-workflows.function.js.map +1 -1
- package/dist/src/functions/get-function-coverage.function.d.ts +26 -0
- package/dist/src/functions/get-function-coverage.function.d.ts.map +1 -0
- package/dist/src/functions/get-function-coverage.function.js +22 -0
- package/dist/src/functions/get-function-coverage.function.js.map +1 -0
- package/dist/src/functions/get-functions-meta.function.d.ts +10 -1
- package/dist/src/functions/get-functions-meta.function.d.ts.map +1 -1
- package/dist/src/functions/get-functions-meta.function.js +14 -8
- package/dist/src/functions/get-functions-meta.function.js.map +1 -1
- package/dist/src/functions/get-state-diff.function.d.ts +12 -0
- package/dist/src/functions/get-state-diff.function.d.ts.map +1 -0
- package/dist/src/functions/get-state-diff.function.js +13 -0
- package/dist/src/functions/get-state-diff.function.js.map +1 -0
- package/dist/src/functions/get-workflow-run-history.function.d.ts.map +1 -1
- package/dist/src/functions/get-workflow-run-history.function.js.map +1 -1
- package/dist/src/functions/get-workflow-run-names.function.d.ts.map +1 -1
- package/dist/src/functions/get-workflow-run-names.function.js.map +1 -1
- package/dist/src/functions/get-workflow-run-steps.function.d.ts.map +1 -1
- package/dist/src/functions/get-workflow-run-steps.function.js.map +1 -1
- package/dist/src/functions/get-workflow-run.function.d.ts.map +1 -1
- package/dist/src/functions/get-workflow-run.function.js.map +1 -1
- package/dist/src/functions/get-workflow-runs.function.d.ts.map +1 -1
- package/dist/src/functions/get-workflow-runs.function.js.map +1 -1
- package/dist/src/functions/get-workflow-version.function.d.ts.map +1 -1
- package/dist/src/functions/get-workflow-version.function.js.map +1 -1
- package/dist/src/functions/read-agent-source.function.d.ts.map +1 -1
- package/dist/src/functions/read-agent-source.function.js.map +1 -1
- package/dist/src/functions/read-function-body.function.d.ts.map +1 -1
- package/dist/src/functions/read-function-body.function.js.map +1 -1
- package/dist/src/functions/read-function-source.function.d.ts.map +1 -1
- package/dist/src/functions/read-function-source.function.js.map +1 -1
- package/dist/src/functions/run-function-tests.function.d.ts +3 -0
- package/dist/src/functions/run-function-tests.function.d.ts.map +1 -0
- package/dist/src/functions/run-function-tests.function.js +64 -0
- package/dist/src/functions/run-function-tests.function.js.map +1 -0
- package/dist/src/functions/update-agent-config.function.d.ts.map +1 -1
- package/dist/src/functions/update-agent-config.function.js.map +1 -1
- package/dist/src/functions/update-function-body.function.d.ts.map +1 -1
- package/dist/src/functions/update-function-body.function.js.map +1 -1
- package/dist/src/functions/update-function-config.function.d.ts.map +1 -1
- package/dist/src/functions/update-function-config.function.js.map +1 -1
- package/dist/src/services/state-diff.service.d.ts +76 -0
- package/dist/src/services/state-diff.service.d.ts.map +1 -0
- package/dist/src/services/state-diff.service.js +148 -0
- package/dist/src/services/state-diff.service.js.map +1 -0
- package/dist/src/services/wiring.service.d.ts +18 -1
- package/dist/src/services/wiring.service.d.ts.map +1 -1
- package/dist/src/services/wiring.service.js +254 -10
- package/dist/src/services/wiring.service.js.map +1 -1
- package/dist/src/services.d.ts.map +1 -1
- package/dist/src/services.js +6 -1
- package/dist/src/services.js.map +1 -1
- package/package.json +10 -5
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StateDiffService computes a structural diff between two `.pikku/`
|
|
3
|
+
* directories — typically "ours" (the user's current branch) and "base"
|
|
4
|
+
* (a baseline checkout, often a worktree at `main`).
|
|
5
|
+
*
|
|
6
|
+
* Both directories are expected to contain the meta JSON files emitted by
|
|
7
|
+
* `pikku all`. Files that are missing on either side are treated as empty
|
|
8
|
+
* objects, so the diff degrades gracefully.
|
|
9
|
+
*/
|
|
10
|
+
declare const META_FILES: {
|
|
11
|
+
readonly functions: "function/pikku-functions-meta.gen.json";
|
|
12
|
+
readonly middleware: "middleware/pikku-middleware-groups-meta.gen.json";
|
|
13
|
+
readonly http: "http/pikku-http-wirings-meta.gen.json";
|
|
14
|
+
readonly scheduler: "scheduler/pikku-schedulers-wirings-meta.gen.json";
|
|
15
|
+
readonly queue: "queue/pikku-queue-workers-wirings-meta.gen.json";
|
|
16
|
+
readonly channel: "channel/pikku-channels-meta.gen.json";
|
|
17
|
+
readonly trigger: "trigger/pikku-trigger-meta.gen.json";
|
|
18
|
+
readonly mcp: "mcp/pikku-mcp-wirings-meta.gen.json";
|
|
19
|
+
readonly agent: "agent/pikku-agent-wirings-meta.gen.json";
|
|
20
|
+
readonly cli: "cli/pikku-cli-wirings-meta.gen.json";
|
|
21
|
+
readonly variables: "variables/pikku-variables-meta.gen.json";
|
|
22
|
+
readonly secrets: "secrets/pikku-secrets-meta.gen.json";
|
|
23
|
+
};
|
|
24
|
+
export type StateDiffCategory = keyof typeof META_FILES;
|
|
25
|
+
export interface DiffEntry<T = Record<string, unknown>> {
|
|
26
|
+
id: string;
|
|
27
|
+
status: 'added' | 'removed' | 'modified' | 'unchanged';
|
|
28
|
+
ours?: T;
|
|
29
|
+
base?: T;
|
|
30
|
+
}
|
|
31
|
+
export interface CategoryDiff {
|
|
32
|
+
added: number;
|
|
33
|
+
removed: number;
|
|
34
|
+
modified: number;
|
|
35
|
+
unchanged: number;
|
|
36
|
+
entries: DiffEntry[];
|
|
37
|
+
}
|
|
38
|
+
export interface StateDiff {
|
|
39
|
+
oursPath: string;
|
|
40
|
+
basePath: string;
|
|
41
|
+
oursExists: boolean;
|
|
42
|
+
baseExists: boolean;
|
|
43
|
+
categories: Record<StateDiffCategory, CategoryDiff>;
|
|
44
|
+
summary: Record<StateDiffCategory, {
|
|
45
|
+
added: number;
|
|
46
|
+
removed: number;
|
|
47
|
+
modified: number;
|
|
48
|
+
}>;
|
|
49
|
+
}
|
|
50
|
+
export declare class StateDiffService {
|
|
51
|
+
private readonly rootDir;
|
|
52
|
+
constructor(rootDir: string);
|
|
53
|
+
diff(input: {
|
|
54
|
+
oursPath?: string;
|
|
55
|
+
basePath: string;
|
|
56
|
+
}): Promise<StateDiff>;
|
|
57
|
+
private resolvePath;
|
|
58
|
+
private readMeta;
|
|
59
|
+
/**
|
|
60
|
+
* For nested-key categories like HTTP wirings ({ [method]: { [route]: meta } }),
|
|
61
|
+
* we flatten to a single keyspace `<method>:<route>` so the diff is uniform.
|
|
62
|
+
* Other categories are already flat ({ [id]: meta }).
|
|
63
|
+
*/
|
|
64
|
+
private flatten;
|
|
65
|
+
private diffCategory;
|
|
66
|
+
/**
|
|
67
|
+
* Fields that vary by absolute path or by environment but don't represent
|
|
68
|
+
* a meaningful structural change. Excluded from equality so the same
|
|
69
|
+
* function in two different working directories isn't flagged as modified.
|
|
70
|
+
*/
|
|
71
|
+
private static readonly NORMALIZE_IGNORE;
|
|
72
|
+
private normalize;
|
|
73
|
+
private shallowEqual;
|
|
74
|
+
}
|
|
75
|
+
export {};
|
|
76
|
+
//# sourceMappingURL=state-diff.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-diff.service.d.ts","sourceRoot":"","sources":["../../../src/services/state-diff.service.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,QAAA,MAAM,UAAU;;;;;;;;;;;;;CAaN,CAAA;AAEV,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,UAAU,CAAA;AAEvD,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACpD,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAA;IACtD,IAAI,CAAC,EAAE,CAAC,CAAA;IACR,IAAI,CAAC,EAAE,CAAC,CAAA;CACT;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAA;IACnD,OAAO,EAAE,MAAM,CACb,iBAAiB,EACjB;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CACrD,CAAA;CACF;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAEtC,IAAI,CAAC,KAAK,EAAE;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,QAAQ,EAAE,MAAM,CAAA;KACjB,GAAG,OAAO,CAAC,SAAS,CAAC;IA8BtB,OAAO,CAAC,WAAW;YAIL,QAAQ;IAatB;;;;OAIG;IACH,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,YAAY;IA4CpB;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAA0B;IAElE,OAAO,CAAC,SAAS;IAcjB,OAAO,CAAC,YAAY;CAQrB"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { join, isAbsolute, resolve } from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* StateDiffService computes a structural diff between two `.pikku/`
|
|
6
|
+
* directories — typically "ours" (the user's current branch) and "base"
|
|
7
|
+
* (a baseline checkout, often a worktree at `main`).
|
|
8
|
+
*
|
|
9
|
+
* Both directories are expected to contain the meta JSON files emitted by
|
|
10
|
+
* `pikku all`. Files that are missing on either side are treated as empty
|
|
11
|
+
* objects, so the diff degrades gracefully.
|
|
12
|
+
*/
|
|
13
|
+
const META_FILES = {
|
|
14
|
+
functions: 'function/pikku-functions-meta.gen.json',
|
|
15
|
+
middleware: 'middleware/pikku-middleware-groups-meta.gen.json',
|
|
16
|
+
http: 'http/pikku-http-wirings-meta.gen.json',
|
|
17
|
+
scheduler: 'scheduler/pikku-schedulers-wirings-meta.gen.json',
|
|
18
|
+
queue: 'queue/pikku-queue-workers-wirings-meta.gen.json',
|
|
19
|
+
channel: 'channel/pikku-channels-meta.gen.json',
|
|
20
|
+
trigger: 'trigger/pikku-trigger-meta.gen.json',
|
|
21
|
+
mcp: 'mcp/pikku-mcp-wirings-meta.gen.json',
|
|
22
|
+
agent: 'agent/pikku-agent-wirings-meta.gen.json',
|
|
23
|
+
cli: 'cli/pikku-cli-wirings-meta.gen.json',
|
|
24
|
+
variables: 'variables/pikku-variables-meta.gen.json',
|
|
25
|
+
secrets: 'secrets/pikku-secrets-meta.gen.json',
|
|
26
|
+
};
|
|
27
|
+
export class StateDiffService {
|
|
28
|
+
constructor(rootDir) {
|
|
29
|
+
this.rootDir = rootDir;
|
|
30
|
+
}
|
|
31
|
+
async diff(input) {
|
|
32
|
+
const oursPath = this.resolvePath(input.oursPath ?? '.pikku');
|
|
33
|
+
const basePath = this.resolvePath(input.basePath);
|
|
34
|
+
const oursExists = existsSync(oursPath);
|
|
35
|
+
const baseExists = existsSync(basePath);
|
|
36
|
+
const categories = {};
|
|
37
|
+
const summary = {};
|
|
38
|
+
for (const [name, relPath] of Object.entries(META_FILES)) {
|
|
39
|
+
const ours = await this.readMeta(join(oursPath, relPath));
|
|
40
|
+
const base = await this.readMeta(join(basePath, relPath));
|
|
41
|
+
const cat = this.diffCategory(name, ours, base);
|
|
42
|
+
categories[name] = cat;
|
|
43
|
+
summary[name] = {
|
|
44
|
+
added: cat.added,
|
|
45
|
+
removed: cat.removed,
|
|
46
|
+
modified: cat.modified,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return { oursPath, basePath, oursExists, baseExists, categories, summary };
|
|
50
|
+
}
|
|
51
|
+
resolvePath(p) {
|
|
52
|
+
return isAbsolute(p) ? p : resolve(this.rootDir, p);
|
|
53
|
+
}
|
|
54
|
+
async readMeta(path) {
|
|
55
|
+
if (!existsSync(path))
|
|
56
|
+
return {};
|
|
57
|
+
try {
|
|
58
|
+
const raw = await readFile(path, 'utf-8');
|
|
59
|
+
const parsed = JSON.parse(raw);
|
|
60
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
61
|
+
return {};
|
|
62
|
+
return parsed;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return {};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* For nested-key categories like HTTP wirings ({ [method]: { [route]: meta } }),
|
|
70
|
+
* we flatten to a single keyspace `<method>:<route>` so the diff is uniform.
|
|
71
|
+
* Other categories are already flat ({ [id]: meta }).
|
|
72
|
+
*/
|
|
73
|
+
flatten(category, raw) {
|
|
74
|
+
if (category !== 'http')
|
|
75
|
+
return raw;
|
|
76
|
+
const flat = {};
|
|
77
|
+
for (const [method, routes] of Object.entries(raw)) {
|
|
78
|
+
if (routes && typeof routes === 'object' && !Array.isArray(routes)) {
|
|
79
|
+
for (const [route, meta] of Object.entries(routes)) {
|
|
80
|
+
flat[`${method}:${route}`] = meta;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return flat;
|
|
85
|
+
}
|
|
86
|
+
diffCategory(category, oursRaw, baseRaw) {
|
|
87
|
+
const ours = this.flatten(category, oursRaw);
|
|
88
|
+
const base = this.flatten(category, baseRaw);
|
|
89
|
+
const allIds = new Set([...Object.keys(ours), ...Object.keys(base)]);
|
|
90
|
+
const entries = [];
|
|
91
|
+
let added = 0;
|
|
92
|
+
let removed = 0;
|
|
93
|
+
let modified = 0;
|
|
94
|
+
let unchanged = 0;
|
|
95
|
+
for (const id of allIds) {
|
|
96
|
+
const o = ours[id];
|
|
97
|
+
const b = base[id];
|
|
98
|
+
if (o && !b) {
|
|
99
|
+
entries.push({ id, status: 'added', ours: o });
|
|
100
|
+
added++;
|
|
101
|
+
}
|
|
102
|
+
else if (!o && b) {
|
|
103
|
+
entries.push({ id, status: 'removed', base: b });
|
|
104
|
+
removed++;
|
|
105
|
+
}
|
|
106
|
+
else if (o && b) {
|
|
107
|
+
if (this.shallowEqual(o, b)) {
|
|
108
|
+
entries.push({ id, status: 'unchanged', ours: o, base: b });
|
|
109
|
+
unchanged++;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
entries.push({ id, status: 'modified', ours: o, base: b });
|
|
113
|
+
modified++;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
entries.sort((a, b) => {
|
|
118
|
+
const order = { added: 0, modified: 1, removed: 2, unchanged: 3 };
|
|
119
|
+
return order[a.status] - order[b.status] || a.id.localeCompare(b.id);
|
|
120
|
+
});
|
|
121
|
+
return { added, removed, modified, unchanged, entries };
|
|
122
|
+
}
|
|
123
|
+
normalize(value) {
|
|
124
|
+
if (Array.isArray(value))
|
|
125
|
+
return value.map((v) => this.normalize(v));
|
|
126
|
+
if (value && typeof value === 'object') {
|
|
127
|
+
const out = {};
|
|
128
|
+
const keys = Object.keys(value).sort();
|
|
129
|
+
for (const k of keys) {
|
|
130
|
+
if (StateDiffService.NORMALIZE_IGNORE.has(k))
|
|
131
|
+
continue;
|
|
132
|
+
out[k] = this.normalize(value[k]);
|
|
133
|
+
}
|
|
134
|
+
return out;
|
|
135
|
+
}
|
|
136
|
+
return value;
|
|
137
|
+
}
|
|
138
|
+
shallowEqual(a, b) {
|
|
139
|
+
return (JSON.stringify(this.normalize(a)) === JSON.stringify(this.normalize(b)));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Fields that vary by absolute path or by environment but don't represent
|
|
144
|
+
* a meaningful structural change. Excluded from equality so the same
|
|
145
|
+
* function in two different working directories isn't flagged as modified.
|
|
146
|
+
*/
|
|
147
|
+
StateDiffService.NORMALIZE_IGNORE = new Set(['sourceFile']);
|
|
148
|
+
//# sourceMappingURL=state-diff.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-diff.service.js","sourceRoot":"","sources":["../../../src/services/state-diff.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -175,6 +175,24 @@ export interface MetaCounts {
|
|
|
175
175
|
secrets: number;
|
|
176
176
|
variables: number;
|
|
177
177
|
}
|
|
178
|
+
export interface FunctionTestScenario {
|
|
179
|
+
featureName: string;
|
|
180
|
+
featureDescription?: string;
|
|
181
|
+
featureFile?: string;
|
|
182
|
+
scenarioName: string;
|
|
183
|
+
status: 'pass' | 'fail';
|
|
184
|
+
duration?: string;
|
|
185
|
+
steps: string[];
|
|
186
|
+
}
|
|
187
|
+
export interface FunctionTestData {
|
|
188
|
+
generatedAt?: string | null;
|
|
189
|
+
status: 'covered' | 'partial' | 'uncovered' | 'unknown';
|
|
190
|
+
coveredLines: number;
|
|
191
|
+
totalLines: number;
|
|
192
|
+
ratio: number;
|
|
193
|
+
missedLines?: number[];
|
|
194
|
+
scenarios: FunctionTestScenario[];
|
|
195
|
+
}
|
|
178
196
|
export interface PikkuMetaState {
|
|
179
197
|
functions: FunctionMeta[];
|
|
180
198
|
httpMeta: HttpRouteMeta[];
|
|
@@ -194,7 +212,6 @@ export interface PikkuMetaState {
|
|
|
194
212
|
secretsMeta: Record<string, unknown>;
|
|
195
213
|
credentialsMeta: Record<string, unknown>;
|
|
196
214
|
variablesMeta: Record<string, unknown>;
|
|
197
|
-
modelAliases: string[];
|
|
198
215
|
}
|
|
199
216
|
export interface AllMeta extends PikkuMetaState {
|
|
200
217
|
functionUsedBy: Record<string, FunctionUsedBy>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiring.service.d.ts","sourceRoot":"","sources":["../../../src/services/wiring.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wiring.service.d.ts","sourceRoot":"","sources":["../../../src/services/wiring.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,254 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
2
3
|
export class NotFoundError extends Error {
|
|
3
4
|
constructor(message) {
|
|
4
5
|
super(message);
|
|
5
6
|
this.name = 'NotFoundError';
|
|
6
7
|
}
|
|
7
8
|
}
|
|
9
|
+
function asArray(value) {
|
|
10
|
+
return Array.isArray(value) ? value : [];
|
|
11
|
+
}
|
|
12
|
+
function parseJsonOrNull(content) {
|
|
13
|
+
try {
|
|
14
|
+
return JSON.parse(content);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function readOptionalFile(path) {
|
|
21
|
+
try {
|
|
22
|
+
return await readFile(path, 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function readOptionalMetaFile(metaSource, relativePath) {
|
|
29
|
+
if (metaSource &&
|
|
30
|
+
typeof metaSource === 'object' &&
|
|
31
|
+
'readFile' in metaSource &&
|
|
32
|
+
typeof metaSource.readFile === 'function') {
|
|
33
|
+
try {
|
|
34
|
+
return await metaSource.readFile(relativePath);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (typeof metaSource === 'string' && metaSource.length > 0) {
|
|
41
|
+
return readOptionalFile(join(metaSource, relativePath));
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
function extractCucumberMessages(html) {
|
|
46
|
+
const match = html.match(/window\.CUCUMBER_MESSAGES\s*=\s*(\[[\s\S]*?\]);/);
|
|
47
|
+
if (!match) {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
const rawMessages = match[1];
|
|
51
|
+
if (!rawMessages) {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
const parsed = parseJsonOrNull(rawMessages);
|
|
55
|
+
return asArray(parsed);
|
|
56
|
+
}
|
|
57
|
+
function durationToMs(duration) {
|
|
58
|
+
if (!duration || typeof duration !== 'object') {
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
61
|
+
const record = duration;
|
|
62
|
+
const seconds = Number(record.seconds ?? 0);
|
|
63
|
+
const nanos = Number(record.nanos ?? 0);
|
|
64
|
+
const totalMs = seconds * 1000 + nanos / 1_000_000;
|
|
65
|
+
return Number.isFinite(totalMs) ? totalMs : 0;
|
|
66
|
+
}
|
|
67
|
+
function cucumberTimestampToIso(timestamp) {
|
|
68
|
+
if (!timestamp || typeof timestamp !== 'object') {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
const record = timestamp;
|
|
72
|
+
const seconds = Number(record.seconds ?? 0);
|
|
73
|
+
const nanos = Number(record.nanos ?? 0);
|
|
74
|
+
const totalMs = seconds * 1000 + nanos / 1_000_000;
|
|
75
|
+
if (!Number.isFinite(totalMs) || totalMs <= 0) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
return new Date(totalMs).toISOString();
|
|
79
|
+
}
|
|
80
|
+
function expandCalledNames(name, rpcMeta) {
|
|
81
|
+
const withoutVersion = name.replace(/@v\d+$/i, '');
|
|
82
|
+
return [
|
|
83
|
+
...new Set([
|
|
84
|
+
name,
|
|
85
|
+
rpcMeta[name],
|
|
86
|
+
withoutVersion !== name ? withoutVersion : undefined,
|
|
87
|
+
rpcMeta[withoutVersion],
|
|
88
|
+
].filter((value) => !!value)),
|
|
89
|
+
];
|
|
90
|
+
}
|
|
91
|
+
function uniqueFunctionKeys(func) {
|
|
92
|
+
return [
|
|
93
|
+
...new Set([func.pikkuFuncId, func.name].filter((value) => !!value)),
|
|
94
|
+
];
|
|
95
|
+
}
|
|
96
|
+
function buildScenarioMaps(messages, rpcMeta) {
|
|
97
|
+
const featureNamesByUri = new Map();
|
|
98
|
+
const featureDescriptionsByUri = new Map();
|
|
99
|
+
const scenarioByAstId = new Map();
|
|
100
|
+
const pickleById = new Map();
|
|
101
|
+
const testCaseById = new Map();
|
|
102
|
+
const testCaseStartedById = new Map();
|
|
103
|
+
const stepResultsByStartedId = new Map();
|
|
104
|
+
let generatedAt = null;
|
|
105
|
+
for (const message of messages) {
|
|
106
|
+
const record = message;
|
|
107
|
+
const gherkinDocument = record.gherkinDocument;
|
|
108
|
+
if (gherkinDocument?.uri && gherkinDocument.feature?.name) {
|
|
109
|
+
featureNamesByUri.set(gherkinDocument.uri, gherkinDocument.feature.name);
|
|
110
|
+
featureDescriptionsByUri.set(gherkinDocument.uri, gherkinDocument.feature.description ?? '');
|
|
111
|
+
}
|
|
112
|
+
for (const child of asArray(gherkinDocument?.feature?.children)) {
|
|
113
|
+
const scenario = child?.scenario;
|
|
114
|
+
if (!scenario?.id)
|
|
115
|
+
continue;
|
|
116
|
+
const steps = asArray(scenario.steps).map((step) => `${(step.keyword ?? '').trim()} ${step.text ?? ''}`.trim());
|
|
117
|
+
scenarioByAstId.set(scenario.id, {
|
|
118
|
+
featureName: gherkinDocument?.feature?.name ?? '',
|
|
119
|
+
featureDescription: gherkinDocument?.feature?.description ?? '',
|
|
120
|
+
scenarioName: scenario.name ?? '',
|
|
121
|
+
steps,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
const pickle = record.pickle;
|
|
125
|
+
if (pickle?.id)
|
|
126
|
+
pickleById.set(pickle.id, pickle);
|
|
127
|
+
const testCase = record.testCase;
|
|
128
|
+
if (testCase?.id)
|
|
129
|
+
testCaseById.set(testCase.id, testCase);
|
|
130
|
+
const started = record.testCaseStarted;
|
|
131
|
+
if (started?.id) {
|
|
132
|
+
testCaseStartedById.set(started.id, started);
|
|
133
|
+
const startedAt = cucumberTimestampToIso(started.timestamp);
|
|
134
|
+
if (startedAt && (!generatedAt || startedAt > generatedAt)) {
|
|
135
|
+
generatedAt = startedAt;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const finished = record.testStepFinished;
|
|
139
|
+
if (finished?.testCaseStartedId) {
|
|
140
|
+
const entries = stepResultsByStartedId.get(finished.testCaseStartedId) ?? [];
|
|
141
|
+
entries.push(finished);
|
|
142
|
+
stepResultsByStartedId.set(finished.testCaseStartedId, entries);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const scenariosByFunction = new Map();
|
|
146
|
+
for (const started of testCaseStartedById.values()) {
|
|
147
|
+
const testCase = testCaseById.get(String(started.testCaseId));
|
|
148
|
+
const pickle = testCase ? pickleById.get(String(testCase.pickleId)) : null;
|
|
149
|
+
if (!pickle)
|
|
150
|
+
continue;
|
|
151
|
+
const astId = asArray(pickle.astNodeIds)[0];
|
|
152
|
+
const astScenario = astId ? scenarioByAstId.get(astId) : null;
|
|
153
|
+
const steps = astScenario?.steps ??
|
|
154
|
+
asArray(pickle.steps)
|
|
155
|
+
.map((step) => step?.text ?? '')
|
|
156
|
+
.filter(Boolean);
|
|
157
|
+
const featureFile = typeof pickle.uri === 'string' ? pickle.uri : undefined;
|
|
158
|
+
const featureName = astScenario?.featureName ||
|
|
159
|
+
(featureFile ? featureNamesByUri.get(featureFile) : '') ||
|
|
160
|
+
'';
|
|
161
|
+
const featureDescription = astScenario?.featureDescription ||
|
|
162
|
+
(featureFile ? featureDescriptionsByUri.get(featureFile) : '') ||
|
|
163
|
+
'';
|
|
164
|
+
const stepResults = (stepResultsByStartedId.get(String(started.id)) ??
|
|
165
|
+
[]);
|
|
166
|
+
const status = stepResults.some((entry) => entry?.testStepResult?.status !== 'PASSED' &&
|
|
167
|
+
entry?.testStepResult?.status !== 'SKIPPED')
|
|
168
|
+
? 'fail'
|
|
169
|
+
: 'pass';
|
|
170
|
+
const totalDurationMs = stepResults.reduce((sum, entry) => sum + durationToMs(entry?.testStepResult?.duration), 0);
|
|
171
|
+
const duration = totalDurationMs > 0 ? `${Math.round(totalDurationMs)}ms` : undefined;
|
|
172
|
+
const scenarioData = {
|
|
173
|
+
featureName,
|
|
174
|
+
featureDescription,
|
|
175
|
+
featureFile,
|
|
176
|
+
scenarioName: String(pickle.name ?? astScenario?.scenarioName ?? 'Scenario'),
|
|
177
|
+
status,
|
|
178
|
+
duration,
|
|
179
|
+
steps,
|
|
180
|
+
};
|
|
181
|
+
const mentionedFunctions = new Set();
|
|
182
|
+
for (const step of steps) {
|
|
183
|
+
const match = step.match(/calls\s+"([^"]+)"/i);
|
|
184
|
+
if (!match)
|
|
185
|
+
continue;
|
|
186
|
+
for (const functionName of expandCalledNames(match[1], rpcMeta)) {
|
|
187
|
+
mentionedFunctions.add(functionName);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
for (const functionName of mentionedFunctions) {
|
|
191
|
+
const scenarios = scenariosByFunction.get(functionName) ?? [];
|
|
192
|
+
scenarios.push(scenarioData);
|
|
193
|
+
scenariosByFunction.set(functionName, scenarios);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return { scenariosByFunction, generatedAt };
|
|
197
|
+
}
|
|
198
|
+
async function loadFunctionTests(metaSource, functionsMeta, rpcMeta) {
|
|
199
|
+
const coverageCandidates = [
|
|
200
|
+
'../function-tests/coverage/function-coverage.json',
|
|
201
|
+
'function-tests/coverage/function-coverage.json',
|
|
202
|
+
];
|
|
203
|
+
const cucumberCandidates = [
|
|
204
|
+
'../function-tests/tests/reports/cucumber-report.html',
|
|
205
|
+
'function-tests/tests/reports/cucumber-report.html',
|
|
206
|
+
];
|
|
207
|
+
const coverageContent = (await Promise.all(coverageCandidates.map((path) => readOptionalMetaFile(metaSource, path)))).find((content) => typeof content === 'string' && content.length > 0) ??
|
|
208
|
+
null;
|
|
209
|
+
const cucumberHtml = (await Promise.all(cucumberCandidates.map((path) => readOptionalMetaFile(metaSource, path)))).find((content) => typeof content === 'string' && content.length > 0) ??
|
|
210
|
+
null;
|
|
211
|
+
const coverageJson = coverageContent
|
|
212
|
+
? parseJsonOrNull(coverageContent)
|
|
213
|
+
: null;
|
|
214
|
+
const coverageFunctions = new Map(asArray(coverageJson?.functions).map((func) => [
|
|
215
|
+
func.name,
|
|
216
|
+
func,
|
|
217
|
+
]));
|
|
218
|
+
const { scenariosByFunction, generatedAt: scenarioGeneratedAt } = cucumberHtml
|
|
219
|
+
? buildScenarioMaps(extractCucumberMessages(cucumberHtml), rpcMeta)
|
|
220
|
+
: {
|
|
221
|
+
scenariosByFunction: new Map(),
|
|
222
|
+
generatedAt: null,
|
|
223
|
+
};
|
|
224
|
+
const generatedAt = scenarioGeneratedAt ?? coverageJson?.generatedAt ?? null;
|
|
225
|
+
const testsByFunction = {};
|
|
226
|
+
for (const func of Object.values(functionsMeta)) {
|
|
227
|
+
const functionKeys = uniqueFunctionKeys(func);
|
|
228
|
+
const primaryFunctionKey = functionKeys[0];
|
|
229
|
+
if (!primaryFunctionKey)
|
|
230
|
+
continue;
|
|
231
|
+
const coverage = functionKeys
|
|
232
|
+
.map((key) => coverageFunctions.get(key))
|
|
233
|
+
.find((value) => !!value);
|
|
234
|
+
const scenarios = functionKeys.flatMap((key) => scenariosByFunction.get(key) ?? []);
|
|
235
|
+
if (!coverage && scenarios.length === 0)
|
|
236
|
+
continue;
|
|
237
|
+
const testData = {
|
|
238
|
+
generatedAt,
|
|
239
|
+
status: (coverage?.status ?? 'unknown'),
|
|
240
|
+
coveredLines: Number(coverage?.coveredLines ?? 0),
|
|
241
|
+
totalLines: Number(coverage?.totalLines ?? 0),
|
|
242
|
+
ratio: Number(coverage?.ratio ?? 0),
|
|
243
|
+
missedLines: asArray(coverage?.missedLines).filter((line) => Number.isFinite(line)),
|
|
244
|
+
scenarios,
|
|
245
|
+
};
|
|
246
|
+
for (const functionKey of functionKeys) {
|
|
247
|
+
testsByFunction[functionKey] = testData;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return testsByFunction;
|
|
251
|
+
}
|
|
8
252
|
export class WiringService {
|
|
9
253
|
constructor(metaService) {
|
|
10
254
|
this.metaService = metaService;
|
|
@@ -62,6 +306,15 @@ export class WiringService {
|
|
|
62
306
|
pikkuFuncId: value,
|
|
63
307
|
};
|
|
64
308
|
}
|
|
309
|
+
const testsByFunction = await loadFunctionTests(this.metaService, functions, rpcMetaRaw);
|
|
310
|
+
for (const func of Object.values(functions)) {
|
|
311
|
+
const funcId = func.pikkuFuncId || func.name;
|
|
312
|
+
if (funcId && testsByFunction[funcId]) {
|
|
313
|
+
;
|
|
314
|
+
func.tests =
|
|
315
|
+
testsByFunction[funcId];
|
|
316
|
+
}
|
|
317
|
+
}
|
|
65
318
|
const functionUsedBy = {};
|
|
66
319
|
const getOrCreate = (funcName) => {
|
|
67
320
|
if (!functionUsedBy[funcName]) {
|
|
@@ -201,14 +454,6 @@ export class WiringService {
|
|
|
201
454
|
for (const program of cliMeta) {
|
|
202
455
|
countCli(program.commands);
|
|
203
456
|
}
|
|
204
|
-
let modelAliases = [];
|
|
205
|
-
try {
|
|
206
|
-
const modelsConfig = pikkuState(null, 'models', 'config') ?? {};
|
|
207
|
-
modelAliases = Object.keys(modelsConfig.models ?? {});
|
|
208
|
-
}
|
|
209
|
-
catch {
|
|
210
|
-
// models config may not be available
|
|
211
|
-
}
|
|
212
457
|
const counts = {
|
|
213
458
|
functions: Object.values(functions).length,
|
|
214
459
|
workflows: Object.keys(workflows).length,
|
|
@@ -244,7 +489,6 @@ export class WiringService {
|
|
|
244
489
|
secretsMeta,
|
|
245
490
|
credentialsMeta,
|
|
246
491
|
variablesMeta,
|
|
247
|
-
modelAliases,
|
|
248
492
|
functionUsedBy,
|
|
249
493
|
counts,
|
|
250
494
|
};
|