@sapiom/harness 0.0.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/LICENSE +21 -0
- package/README.md +44 -43
- package/dist/cli/auth.d.ts +26 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +39 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +163 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/consent.d.ts +15 -0
- package/dist/cli/consent.d.ts.map +1 -0
- package/dist/cli/consent.js +81 -0
- package/dist/cli/consent.js.map +1 -0
- package/dist/cli/doctor.d.ts +27 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +74 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/machine-id.d.ts +19 -0
- package/dist/cli/machine-id.d.ts.map +1 -0
- package/dist/cli/machine-id.js +75 -0
- package/dist/cli/machine-id.js.map +1 -0
- package/dist/cli/paths.d.ts +3 -0
- package/dist/cli/paths.d.ts.map +1 -0
- package/dist/cli/paths.js +11 -0
- package/dist/cli/paths.js.map +1 -0
- package/dist/cli/settings.d.ts +26 -0
- package/dist/cli/settings.d.ts.map +1 -0
- package/dist/cli/settings.js +123 -0
- package/dist/cli/settings.js.map +1 -0
- package/dist/core/adapters/claude-code.d.ts +41 -0
- package/dist/core/adapters/claude-code.d.ts.map +1 -0
- package/dist/core/adapters/claude-code.js +238 -0
- package/dist/core/adapters/claude-code.js.map +1 -0
- package/dist/core/adapters/codex.d.ts +59 -0
- package/dist/core/adapters/codex.d.ts.map +1 -0
- package/dist/core/adapters/codex.js +319 -0
- package/dist/core/adapters/codex.js.map +1 -0
- package/dist/core/canvas-body.d.ts +45 -0
- package/dist/core/canvas-body.d.ts.map +1 -0
- package/dist/core/canvas-body.js +94 -0
- package/dist/core/canvas-body.js.map +1 -0
- package/dist/core/canvas-cache.d.ts +23 -0
- package/dist/core/canvas-cache.d.ts.map +1 -0
- package/dist/core/canvas-cache.js +64 -0
- package/dist/core/canvas-cache.js.map +1 -0
- package/dist/core/canvas-enrich.d.ts +106 -0
- package/dist/core/canvas-enrich.d.ts.map +1 -0
- package/dist/core/canvas-enrich.js +178 -0
- package/dist/core/canvas-enrich.js.map +1 -0
- package/dist/core/canvas-enrichment.d.ts +144 -0
- package/dist/core/canvas-enrichment.d.ts.map +1 -0
- package/dist/core/canvas-enrichment.js +192 -0
- package/dist/core/canvas-enrichment.js.map +1 -0
- package/dist/core/canvas-graph.d.ts +71 -0
- package/dist/core/canvas-graph.d.ts.map +1 -0
- package/dist/core/canvas-graph.js +111 -0
- package/dist/core/canvas-graph.js.map +1 -0
- package/dist/core/canvas-index-classify.d.ts +41 -0
- package/dist/core/canvas-index-classify.d.ts.map +1 -0
- package/dist/core/canvas-index-classify.js +63 -0
- package/dist/core/canvas-index-classify.js.map +1 -0
- package/dist/core/canvas-interconnections.d.ts +24 -0
- package/dist/core/canvas-interconnections.d.ts.map +1 -0
- package/dist/core/canvas-interconnections.js +96 -0
- package/dist/core/canvas-interconnections.js.map +1 -0
- package/dist/core/canvas-manifest-check.d.ts +15 -0
- package/dist/core/canvas-manifest-check.d.ts.map +1 -0
- package/dist/core/canvas-manifest-check.js +90 -0
- package/dist/core/canvas-manifest-check.js.map +1 -0
- package/dist/core/canvas-render.d.ts +73 -0
- package/dist/core/canvas-render.d.ts.map +1 -0
- package/dist/core/canvas-render.js +145 -0
- package/dist/core/canvas-render.js.map +1 -0
- package/dist/core/canvas-svg.d.ts +50 -0
- package/dist/core/canvas-svg.d.ts.map +1 -0
- package/dist/core/canvas-svg.js +240 -0
- package/dist/core/canvas-svg.js.map +1 -0
- package/dist/core/canvas-template.d.ts +43 -0
- package/dist/core/canvas-template.d.ts.map +1 -0
- package/dist/core/canvas-template.js +365 -0
- package/dist/core/canvas-template.js.map +1 -0
- package/dist/core/canvas-watcher.d.ts +25 -0
- package/dist/core/canvas-watcher.d.ts.map +1 -0
- package/dist/core/canvas-watcher.js +144 -0
- package/dist/core/canvas-watcher.js.map +1 -0
- package/dist/core/collector/batcher.d.ts +57 -0
- package/dist/core/collector/batcher.d.ts.map +1 -0
- package/dist/core/collector/batcher.js +143 -0
- package/dist/core/collector/batcher.js.map +1 -0
- package/dist/core/collector/codex-tailer.d.ts +85 -0
- package/dist/core/collector/codex-tailer.d.ts.map +1 -0
- package/dist/core/collector/codex-tailer.js +270 -0
- package/dist/core/collector/codex-tailer.js.map +1 -0
- package/dist/core/collector/normalizer.d.ts +33 -0
- package/dist/core/collector/normalizer.d.ts.map +1 -0
- package/dist/core/collector/normalizer.js +94 -0
- package/dist/core/collector/normalizer.js.map +1 -0
- package/dist/core/collector/seq.d.ts +14 -0
- package/dist/core/collector/seq.d.ts.map +1 -0
- package/dist/core/collector/seq.js +20 -0
- package/dist/core/collector/seq.js.map +1 -0
- package/dist/core/collector/store.d.ts +16 -0
- package/dist/core/collector/store.d.ts.map +1 -0
- package/dist/core/collector/store.js +30 -0
- package/dist/core/collector/store.js.map +1 -0
- package/dist/core/collector/transcript.d.ts +38 -0
- package/dist/core/collector/transcript.d.ts.map +1 -0
- package/dist/core/collector/transcript.js +110 -0
- package/dist/core/collector/transcript.js.map +1 -0
- package/dist/core/event-bus.d.ts +9 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +25 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/example-seed.d.ts +34 -0
- package/dist/core/example-seed.d.ts.map +1 -0
- package/dist/core/example-seed.js +277 -0
- package/dist/core/example-seed.js.map +1 -0
- package/dist/core/inject/claude-settings.d.ts +34 -0
- package/dist/core/inject/claude-settings.d.ts.map +1 -0
- package/dist/core/inject/claude-settings.js +152 -0
- package/dist/core/inject/claude-settings.js.map +1 -0
- package/dist/core/inject/mcp-config.d.ts +26 -0
- package/dist/core/inject/mcp-config.d.ts.map +1 -0
- package/dist/core/inject/mcp-config.js +39 -0
- package/dist/core/inject/mcp-config.js.map +1 -0
- package/dist/core/inject/retention.d.ts +66 -0
- package/dist/core/inject/retention.d.ts.map +1 -0
- package/dist/core/inject/retention.js +119 -0
- package/dist/core/inject/retention.js.map +1 -0
- package/dist/core/inject/system-prompt.d.ts +11 -0
- package/dist/core/inject/system-prompt.d.ts.map +1 -0
- package/dist/core/inject/system-prompt.js +22 -0
- package/dist/core/inject/system-prompt.js.map +1 -0
- package/dist/core/macro-runner.d.ts +36 -0
- package/dist/core/macro-runner.d.ts.map +1 -0
- package/dist/core/macro-runner.js +66 -0
- package/dist/core/macro-runner.js.map +1 -0
- package/dist/core/macros.d.ts +10 -0
- package/dist/core/macros.d.ts.map +1 -0
- package/dist/core/macros.js +59 -0
- package/dist/core/macros.js.map +1 -0
- package/dist/core/path-safety.d.ts +33 -0
- package/dist/core/path-safety.d.ts.map +1 -0
- package/dist/core/path-safety.js +63 -0
- package/dist/core/path-safety.js.map +1 -0
- package/dist/core/paths.d.ts +27 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +43 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/port-detector.d.ts +69 -0
- package/dist/core/port-detector.d.ts.map +1 -0
- package/dist/core/port-detector.js +121 -0
- package/dist/core/port-detector.js.map +1 -0
- package/dist/core/session-manager.d.ts +275 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +729 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/task-manager.d.ts +138 -0
- package/dist/core/task-manager.d.ts.map +1 -0
- package/dist/core/task-manager.js +286 -0
- package/dist/core/task-manager.js.map +1 -0
- package/dist/core/task-stream.d.ts +32 -0
- package/dist/core/task-stream.d.ts.map +1 -0
- package/dist/core/task-stream.js +87 -0
- package/dist/core/task-stream.js.map +1 -0
- package/dist/core/workflow-registry.d.ts +36 -0
- package/dist/core/workflow-registry.d.ts.map +1 -0
- package/dist/core/workflow-registry.js +220 -0
- package/dist/core/workflow-registry.js.map +1 -0
- package/dist/core/workspace-context.d.ts +43 -0
- package/dist/core/workspace-context.d.ts.map +1 -0
- package/dist/core/workspace-context.js +108 -0
- package/dist/core/workspace-context.js.map +1 -0
- package/dist/core/workspace-watcher.d.ts +26 -0
- package/dist/core/workspace-watcher.d.ts.map +1 -0
- package/dist/core/workspace-watcher.js +174 -0
- package/dist/core/workspace-watcher.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/profiles/canvas-guidelines.d.ts +20 -0
- package/dist/profiles/canvas-guidelines.d.ts.map +1 -0
- package/dist/profiles/canvas-guidelines.js +48 -0
- package/dist/profiles/canvas-guidelines.js.map +1 -0
- package/dist/profiles/default.d.ts +10 -0
- package/dist/profiles/default.d.ts.map +1 -0
- package/dist/profiles/default.js +70 -0
- package/dist/profiles/default.js.map +1 -0
- package/dist/server/auth.d.ts +9 -0
- package/dist/server/auth.d.ts.map +1 -0
- package/dist/server/auth.js +28 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/canvas-render.d.ts +18 -0
- package/dist/server/canvas-render.d.ts.map +1 -0
- package/dist/server/canvas-render.js +24 -0
- package/dist/server/canvas-render.js.map +1 -0
- package/dist/server/canvas.d.ts +12 -0
- package/dist/server/canvas.d.ts.map +1 -0
- package/dist/server/canvas.js +174 -0
- package/dist/server/canvas.js.map +1 -0
- package/dist/server/events-ws.d.ts +11 -0
- package/dist/server/events-ws.d.ts.map +1 -0
- package/dist/server/events-ws.js +24 -0
- package/dist/server/events-ws.js.map +1 -0
- package/dist/server/fs.d.ts +4 -0
- package/dist/server/fs.d.ts.map +1 -0
- package/dist/server/fs.js +88 -0
- package/dist/server/fs.js.map +1 -0
- package/dist/server/index.d.ts +83 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +0 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/ingest.d.ts +74 -0
- package/dist/server/ingest.d.ts.map +1 -0
- package/dist/server/ingest.js +74 -0
- package/dist/server/ingest.js.map +1 -0
- package/dist/server/macros.d.ts +32 -0
- package/dist/server/macros.d.ts.map +1 -0
- package/dist/server/macros.js +76 -0
- package/dist/server/macros.js.map +1 -0
- package/dist/server/rest.d.ts +75 -0
- package/dist/server/rest.d.ts.map +1 -0
- package/dist/server/rest.js +235 -0
- package/dist/server/rest.js.map +1 -0
- package/dist/server/static.d.ts +8 -0
- package/dist/server/static.d.ts.map +1 -0
- package/dist/server/static.js +36 -0
- package/dist/server/static.js.map +1 -0
- package/dist/server/terminal-ws.d.ts +9 -0
- package/dist/server/terminal-ws.d.ts.map +1 -0
- package/dist/server/terminal-ws.js +59 -0
- package/dist/server/terminal-ws.js.map +1 -0
- package/dist/server/ws-router.d.ts +16 -0
- package/dist/server/ws-router.d.ts.map +1 -0
- package/dist/server/ws-router.js +26 -0
- package/dist/server/ws-router.js.map +1 -0
- package/dist/shared/types.d.ts +485 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +80 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/web/assets/index-B9R4TzH7.css +32 -0
- package/dist/web/assets/index-Dh97QAgq.js +192 -0
- package/dist/web/index.html +27 -0
- package/package.json +84 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizer.js","sourceRoot":"","sources":["../../../src/core/collector/normalizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-harnessSessionId monotonic sequence counter for AnalyticsEvent.seq.
|
|
3
|
+
* Assigned server-side (in the ingest path), never by the hook script —
|
|
4
|
+
* emit.cjs invocations race across concurrent hooks and can't be trusted
|
|
5
|
+
* to self-order.
|
|
6
|
+
*/
|
|
7
|
+
export interface SeqCounter {
|
|
8
|
+
/** Returns 1 on first call for a given harnessSessionId, incrementing from there. */
|
|
9
|
+
next(harnessSessionId: string): number;
|
|
10
|
+
/** Drop the counter for a session (e.g. once it's known to have ended). */
|
|
11
|
+
reset(harnessSessionId: string): void;
|
|
12
|
+
}
|
|
13
|
+
export declare function createSeqCounter(): SeqCounter;
|
|
14
|
+
//# sourceMappingURL=seq.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seq.d.ts","sourceRoot":"","sources":["../../../src/core/collector/seq.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,UAAU;IACzB,qFAAqF;IACrF,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAAC;IACvC,2EAA2E;IAC3E,KAAK,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED,wBAAgB,gBAAgB,IAAI,UAAU,CAY7C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-harnessSessionId monotonic sequence counter for AnalyticsEvent.seq.
|
|
3
|
+
* Assigned server-side (in the ingest path), never by the hook script —
|
|
4
|
+
* emit.cjs invocations race across concurrent hooks and can't be trusted
|
|
5
|
+
* to self-order.
|
|
6
|
+
*/
|
|
7
|
+
export function createSeqCounter() {
|
|
8
|
+
const counters = new Map();
|
|
9
|
+
return {
|
|
10
|
+
next(harnessSessionId) {
|
|
11
|
+
const value = (counters.get(harnessSessionId) ?? 0) + 1;
|
|
12
|
+
counters.set(harnessSessionId, value);
|
|
13
|
+
return value;
|
|
14
|
+
},
|
|
15
|
+
reset(harnessSessionId) {
|
|
16
|
+
counters.delete(harnessSessionId);
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=seq.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seq.js","sourceRoot":"","sources":["../../../src/core/collector/seq.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,OAAO;QACL,IAAI,CAAC,gBAAwB;YAC3B,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACxD,QAAQ,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,CAAC,gBAAwB;YAC5B,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Append-only local sink for analytics events. Always written, regardless
|
|
3
|
+
* of telemetry opt-in — this is the "demo inspects this" local debug file,
|
|
4
|
+
* independent of whether anything gets batched to a remote collector.
|
|
5
|
+
*/
|
|
6
|
+
import { type AnalyticsEvent } from "../../shared/types.js";
|
|
7
|
+
export interface EventStore {
|
|
8
|
+
/** Append one event as a single ndjson line. Crash-safe (fs.appendFile). */
|
|
9
|
+
append(event: AnalyticsEvent): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* @param filePath Defaults to `HARNESS_PATHS.events`
|
|
13
|
+
* (`~/.sapiom/harness/events.ndjson`). Override in tests.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createEventStore(filePath?: string): EventStore;
|
|
16
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/core/collector/store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG3E,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,GAAE,MAA6B,GAAG,UAAU,CAiBpF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Append-only local sink for analytics events. Always written, regardless
|
|
3
|
+
* of telemetry opt-in — this is the "demo inspects this" local debug file,
|
|
4
|
+
* independent of whether anything gets batched to a remote collector.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from "node:fs/promises";
|
|
7
|
+
import * as path from "node:path";
|
|
8
|
+
import { HARNESS_PATHS } from "../../shared/types.js";
|
|
9
|
+
import { expandHome } from "../paths.js";
|
|
10
|
+
/**
|
|
11
|
+
* @param filePath Defaults to `HARNESS_PATHS.events`
|
|
12
|
+
* (`~/.sapiom/harness/events.ndjson`). Override in tests.
|
|
13
|
+
*/
|
|
14
|
+
export function createEventStore(filePath = HARNESS_PATHS.events) {
|
|
15
|
+
const resolvedPath = expandHome(filePath);
|
|
16
|
+
let dirReady = null;
|
|
17
|
+
function ensureDir() {
|
|
18
|
+
if (!dirReady) {
|
|
19
|
+
dirReady = fs.mkdir(path.dirname(resolvedPath), { recursive: true }).then(() => undefined);
|
|
20
|
+
}
|
|
21
|
+
return dirReady;
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
async append(event) {
|
|
25
|
+
await ensureDir();
|
|
26
|
+
await fs.appendFile(resolvedPath, `${JSON.stringify(event)}\n`, "utf8");
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/core/collector/store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,aAAa,EAAuB,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB,aAAa,CAAC,MAAM;IACtE,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,QAAQ,GAAyB,IAAI,CAAC;IAE1C,SAAS,SAAS;QAChB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,KAAqB;YAChC,MAAM,SAAS,EAAE,CAAC;YAClB,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1E,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backfills `turn.completed` events with model + token usage by tail-reading
|
|
3
|
+
* the Claude Code transcript JSONL named in the hook payload's
|
|
4
|
+
* `transcript_path`. The assistant's message text itself comes straight off
|
|
5
|
+
* the Stop hook payload (`last_assistant_message`, see normalizer.ts) — it's
|
|
6
|
+
* available synchronously and doesn't depend on the transcript file, which
|
|
7
|
+
* may not exist on disk yet (or at all) at the moment Stop fires. This
|
|
8
|
+
* module only ever *supplements* that with model/usage, and falls back to
|
|
9
|
+
* its own transcript-derived text if the hook payload somehow didn't have
|
|
10
|
+
* one.
|
|
11
|
+
*
|
|
12
|
+
* Transcripts can grow to hundreds of MB over a long session, so this only
|
|
13
|
+
* ever reads the last ~2MB from the end of the file.
|
|
14
|
+
*/
|
|
15
|
+
import type { AnalyticsEvent } from "../../shared/types.js";
|
|
16
|
+
export interface TranscriptTurn {
|
|
17
|
+
model: string | null;
|
|
18
|
+
assistantText: string | null;
|
|
19
|
+
usage: {
|
|
20
|
+
inputTokens: number | null;
|
|
21
|
+
outputTokens: number | null;
|
|
22
|
+
} | null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Read the last `maxBytes` of a transcript JSONL file and return the most
|
|
26
|
+
* recent assistant turn found in it, or `null` if the file is missing,
|
|
27
|
+
* unreadable, or has no assistant turn in the tail window.
|
|
28
|
+
*/
|
|
29
|
+
export declare function readLastAssistantTurn(transcriptPath: string, maxBytes?: number): Promise<TranscriptTurn | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Enrich a `turn.completed` event's payload with transcript data (model,
|
|
32
|
+
* usage, and a fallback assistantText). No-op for any other event type, or
|
|
33
|
+
* when no transcript path is available, or when the transcript can't be
|
|
34
|
+
* read (e.g. not written to disk yet) — none of that should ever clobber
|
|
35
|
+
* the assistantText the Stop hook payload already supplied.
|
|
36
|
+
*/
|
|
37
|
+
export declare function enrichTurnCompleted(event: AnalyticsEvent, transcriptPath: string | undefined, maxBytes?: number): Promise<AnalyticsEvent>;
|
|
38
|
+
//# sourceMappingURL=transcript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../../src/core/collector/transcript.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAI5D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;KAC7B,GAAG,IAAI,CAAC;CACV;AAiDD;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,cAAc,EAAE,MAAM,EACtB,QAAQ,SAAyB,GAChC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAiChC;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,cAAc,EACrB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC,CAkBzB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backfills `turn.completed` events with model + token usage by tail-reading
|
|
3
|
+
* the Claude Code transcript JSONL named in the hook payload's
|
|
4
|
+
* `transcript_path`. The assistant's message text itself comes straight off
|
|
5
|
+
* the Stop hook payload (`last_assistant_message`, see normalizer.ts) — it's
|
|
6
|
+
* available synchronously and doesn't depend on the transcript file, which
|
|
7
|
+
* may not exist on disk yet (or at all) at the moment Stop fires. This
|
|
8
|
+
* module only ever *supplements* that with model/usage, and falls back to
|
|
9
|
+
* its own transcript-derived text if the hook payload somehow didn't have
|
|
10
|
+
* one.
|
|
11
|
+
*
|
|
12
|
+
* Transcripts can grow to hundreds of MB over a long session, so this only
|
|
13
|
+
* ever reads the last ~2MB from the end of the file.
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from "node:fs/promises";
|
|
16
|
+
const DEFAULT_MAX_TAIL_BYTES = 2 * 1024 * 1024;
|
|
17
|
+
function extractText(content) {
|
|
18
|
+
if (typeof content === "string")
|
|
19
|
+
return content || null;
|
|
20
|
+
if (!Array.isArray(content))
|
|
21
|
+
return null;
|
|
22
|
+
const text = content
|
|
23
|
+
.filter((block) => block?.type === "text" && typeof block.text === "string")
|
|
24
|
+
.map((block) => block.text)
|
|
25
|
+
.join("\n")
|
|
26
|
+
.trim();
|
|
27
|
+
return text || null;
|
|
28
|
+
}
|
|
29
|
+
function extractUsage(usage) {
|
|
30
|
+
if (!usage)
|
|
31
|
+
return null;
|
|
32
|
+
const inputTokens = typeof usage.input_tokens === "number" ? usage.input_tokens : null;
|
|
33
|
+
const outputTokens = typeof usage.output_tokens === "number" ? usage.output_tokens : null;
|
|
34
|
+
if (inputTokens === null && outputTokens === null)
|
|
35
|
+
return null;
|
|
36
|
+
return { inputTokens, outputTokens };
|
|
37
|
+
}
|
|
38
|
+
function tryParseLine(line) {
|
|
39
|
+
try {
|
|
40
|
+
return JSON.parse(line);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Read the last `maxBytes` of a transcript JSONL file and return the most
|
|
48
|
+
* recent assistant turn found in it, or `null` if the file is missing,
|
|
49
|
+
* unreadable, or has no assistant turn in the tail window.
|
|
50
|
+
*/
|
|
51
|
+
export async function readLastAssistantTurn(transcriptPath, maxBytes = DEFAULT_MAX_TAIL_BYTES) {
|
|
52
|
+
let handle = null;
|
|
53
|
+
try {
|
|
54
|
+
const stat = await fs.stat(transcriptPath);
|
|
55
|
+
const start = Math.max(0, stat.size - maxBytes);
|
|
56
|
+
const length = stat.size - start;
|
|
57
|
+
if (length <= 0)
|
|
58
|
+
return null;
|
|
59
|
+
handle = await fs.open(transcriptPath, "r");
|
|
60
|
+
const buffer = Buffer.alloc(length);
|
|
61
|
+
await handle.read(buffer, 0, length, start);
|
|
62
|
+
const lines = buffer.toString("utf8").split("\n").filter((line) => line.length > 0);
|
|
63
|
+
// If we started mid-file, the first line is a truncated fragment.
|
|
64
|
+
if (start > 0 && lines.length > 0)
|
|
65
|
+
lines.shift();
|
|
66
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
67
|
+
const parsed = tryParseLine(lines[i]);
|
|
68
|
+
const message = parsed?.message;
|
|
69
|
+
if (parsed?.type === "assistant" && message) {
|
|
70
|
+
return {
|
|
71
|
+
model: typeof message.model === "string" ? message.model : null,
|
|
72
|
+
assistantText: extractText(message.content),
|
|
73
|
+
usage: extractUsage(message.usage),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
await handle?.close().catch(() => { });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Enrich a `turn.completed` event's payload with transcript data (model,
|
|
88
|
+
* usage, and a fallback assistantText). No-op for any other event type, or
|
|
89
|
+
* when no transcript path is available, or when the transcript can't be
|
|
90
|
+
* read (e.g. not written to disk yet) — none of that should ever clobber
|
|
91
|
+
* the assistantText the Stop hook payload already supplied.
|
|
92
|
+
*/
|
|
93
|
+
export async function enrichTurnCompleted(event, transcriptPath, maxBytes) {
|
|
94
|
+
if (event.type !== "turn.completed" || !transcriptPath)
|
|
95
|
+
return event;
|
|
96
|
+
const turn = await readLastAssistantTurn(transcriptPath, maxBytes);
|
|
97
|
+
if (!turn)
|
|
98
|
+
return event;
|
|
99
|
+
const existingAssistantText = typeof event.payload.assistantText === "string" ? event.payload.assistantText : null;
|
|
100
|
+
return {
|
|
101
|
+
...event,
|
|
102
|
+
payload: {
|
|
103
|
+
...event.payload,
|
|
104
|
+
model: turn.model,
|
|
105
|
+
assistantText: existingAssistantText ?? turn.assistantText,
|
|
106
|
+
usage: turn.usage,
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../../src/core/collector/transcript.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BusMessage } from "../shared/types.js";
|
|
2
|
+
export declare class EventBus {
|
|
3
|
+
private readonly emitter;
|
|
4
|
+
constructor();
|
|
5
|
+
publish(message: BusMessage): void;
|
|
6
|
+
/** Returns an unsubscribe function. */
|
|
7
|
+
subscribe(listener: (message: BusMessage) => void): () => void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=event-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/core/event-bus.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;;IAO9C,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAIlC,uCAAuC;IACvC,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI;CAI/D"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-process pub/sub for BusMessage — the single source every /ws/events
|
|
3
|
+
* connection forwards from, and every producer (session status, canvas
|
|
4
|
+
* watcher, port detector, workflow registry changes) publishes to. Keeping
|
|
5
|
+
* this as one shared instance (rather than each producer reaching into the
|
|
6
|
+
* WS layer directly) is what lets canvas.reload / port.detected be added
|
|
7
|
+
* without touching events-ws.ts's connection-handling logic.
|
|
8
|
+
*/
|
|
9
|
+
import { EventEmitter } from "node:events";
|
|
10
|
+
export class EventBus {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.emitter = new EventEmitter();
|
|
13
|
+
// Every open /ws/events connection subscribes for its lifetime.
|
|
14
|
+
this.emitter.setMaxListeners(0);
|
|
15
|
+
}
|
|
16
|
+
publish(message) {
|
|
17
|
+
this.emitter.emit("message", message);
|
|
18
|
+
}
|
|
19
|
+
/** Returns an unsubscribe function. */
|
|
20
|
+
subscribe(listener) {
|
|
21
|
+
this.emitter.on("message", listener);
|
|
22
|
+
return () => this.emitter.off("message", listener);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=event-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/core/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,OAAO,QAAQ;IAGnB;QAFiB,YAAO,GAAG,IAAI,YAAY,EAAE,CAAC;QAG5C,gEAAgE;QAChE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,CAAC,OAAmB;QACzB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,uCAAuC;IACvC,SAAS,CAAC,QAAuC;QAC/C,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACrC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type ResolvedVersions } from "@sapiom/agent-core";
|
|
2
|
+
export declare const SAMPLE_PROJECT_NAME = "order-triage";
|
|
3
|
+
export interface SeedExampleProjectOptions {
|
|
4
|
+
/** Directory the example lands in — the project goes to
|
|
5
|
+
* `<targetRoot>/order-triage/`, the canvas to `<targetRoot>/.sapiom/canvas/`. */
|
|
6
|
+
targetRoot: string;
|
|
7
|
+
/** Wipe and regenerate even when a seeded copy already exists (demo prep).
|
|
8
|
+
* Defaults to false: an existing copy is reused untouched. */
|
|
9
|
+
force?: boolean;
|
|
10
|
+
/** Pre-resolved @sapiom/* versions — skips the npm lookup (tests). */
|
|
11
|
+
versions?: ResolvedVersions;
|
|
12
|
+
/** Overrides where the scaffold templates live (tests). */
|
|
13
|
+
templatesDir?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface SeedExampleProjectResult {
|
|
16
|
+
/** == options.targetRoot, resolved — the directory to open a session in. */
|
|
17
|
+
root: string;
|
|
18
|
+
/** Absolute path of the scaffolded project (`<root>/order-triage`). */
|
|
19
|
+
projectDir: string;
|
|
20
|
+
/** False when an existing seeded copy was reused as-is. */
|
|
21
|
+
created: boolean;
|
|
22
|
+
/** Whether a git repo with an initial commit was created (false on reuse or when `git` is unavailable). */
|
|
23
|
+
gitInitialized: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Seeds (or reuses) the example project under `options.targetRoot`.
|
|
27
|
+
* Reuse is keyed on the project's own sapiom.json — the file the workflow
|
|
28
|
+
* scanner keys on too, so "reusable" here means exactly "the rail will
|
|
29
|
+
* discover it". The canvas pair is backfilled even on reuse (cheap, and an
|
|
30
|
+
* older/partial seed shouldn't leave the canvas pane empty), but a canvas
|
|
31
|
+
* the user's agent has since regenerated is left alone.
|
|
32
|
+
*/
|
|
33
|
+
export declare function seedExampleProject(options: SeedExampleProjectOptions): Promise<SeedExampleProjectResult>;
|
|
34
|
+
//# sourceMappingURL=example-seed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example-seed.d.ts","sourceRoot":"","sources":["../../src/core/example-seed.ts"],"names":[],"mappings":"AAqCA,OAAO,EAA0C,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAMnG,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AA6LlD,MAAM,WAAW,yBAAyB;IACxC;sFACkF;IAClF,UAAU,EAAE,MAAM,CAAC;IACnB;mEAC+D;IAC/D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,2GAA2G;IAC3G,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAoD9G"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seeds the bundled example project — a directory the harness opens
|
|
3
|
+
* beautifully on first run. Shared by two callers with different needs:
|
|
4
|
+
*
|
|
5
|
+
* - `POST /api/sample-project` (the welcome panel's "Run the sample
|
|
6
|
+
* project" action) — seeds `~/.sapiom/harness/sample-project` lazily and
|
|
7
|
+
* idempotently: an already-seeded copy is reused as-is, including any
|
|
8
|
+
* edits the user's agent has made to it since.
|
|
9
|
+
* - `scripts/seed-example.mjs` (demo prep) — same seeding with
|
|
10
|
+
* `force: true`, which wipes and regenerates from scratch.
|
|
11
|
+
*
|
|
12
|
+
* Produces:
|
|
13
|
+
* <targetRoot>/order-triage/ — a real scaffolded agent project
|
|
14
|
+
* (sapiom.json, index.ts, git repo) so the
|
|
15
|
+
* workflows rail discovers it immediately.
|
|
16
|
+
* Dependency versions are resolved the same
|
|
17
|
+
* way `sapiom agents init` does (current
|
|
18
|
+
* npm latest, offline fallback) — never
|
|
19
|
+
* hardcoded here, so this can't ship dead
|
|
20
|
+
* pins that no longer exist on npm.
|
|
21
|
+
* <targetRoot>/.sapiom/canvas/index.html + _template.html
|
|
22
|
+
* — the canvas kit's own template shell
|
|
23
|
+
* wrapping this project's real step-graph
|
|
24
|
+
* markup: the canvas pane's opening shot,
|
|
25
|
+
* and a reference for the shape of markup
|
|
26
|
+
* an agent should produce for Visualize.
|
|
27
|
+
* Rendered via the exact same
|
|
28
|
+
* renderCanvasDocument() shell the real
|
|
29
|
+
* visualize macro's edits go through, so
|
|
30
|
+
* the seed and the kit can never drift.
|
|
31
|
+
*/
|
|
32
|
+
import { execFileSync } from "node:child_process";
|
|
33
|
+
import { existsSync } from "node:fs";
|
|
34
|
+
import * as fs from "node:fs/promises";
|
|
35
|
+
import { createRequire } from "node:module";
|
|
36
|
+
import * as path from "node:path";
|
|
37
|
+
import { resolveVersions, scaffold, writeConfig } from "@sapiom/agent-core";
|
|
38
|
+
import { TEMPLATE_HTML, renderCanvasDocument } from "./canvas-template.js";
|
|
39
|
+
const nodeRequire = createRequire(import.meta.url);
|
|
40
|
+
export const SAMPLE_PROJECT_NAME = "order-triage";
|
|
41
|
+
/** Locate @sapiom/agent-core's bundled templates dir (no `__dirname` in ESM). */
|
|
42
|
+
function agentCoreTemplatesDir() {
|
|
43
|
+
const entry = nodeRequire.resolve("@sapiom/agent-core");
|
|
44
|
+
return path.resolve(path.dirname(entry), "..", "..", "templates");
|
|
45
|
+
}
|
|
46
|
+
function tryGit(cwd, args) {
|
|
47
|
+
try {
|
|
48
|
+
execFileSync("git", args, { cwd, stdio: "ignore" });
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** Fold the demo customizations (index.ts, sapiom.json) into the scaffold's initial commit. */
|
|
56
|
+
function commitCustomizations(projectDir) {
|
|
57
|
+
if (!existsSync(path.join(projectDir, ".git")))
|
|
58
|
+
return;
|
|
59
|
+
tryGit(projectDir, ["add", "-A"]);
|
|
60
|
+
tryGit(projectDir, ["commit", "-m", "Customize for order-triage demo"]) ||
|
|
61
|
+
tryGit(projectDir, [
|
|
62
|
+
"-c",
|
|
63
|
+
"user.name=Sapiom",
|
|
64
|
+
"-c",
|
|
65
|
+
"user.email=noreply@sapiom.ai",
|
|
66
|
+
"commit",
|
|
67
|
+
"-m",
|
|
68
|
+
"Customize for order-triage demo",
|
|
69
|
+
]);
|
|
70
|
+
}
|
|
71
|
+
const ORDER_TRIAGE_INDEX_TS = `import { defineAgent, defineStep, goto, terminate } from '@sapiom/agent';
|
|
72
|
+
import { z } from 'zod';
|
|
73
|
+
|
|
74
|
+
// A small support-ticket triage flow: intake logs the order, classify tags
|
|
75
|
+
// it, and route sends the easy cases down an auto-resolve path while billing
|
|
76
|
+
// disputes go to a human.
|
|
77
|
+
|
|
78
|
+
const OrderSchema = z.object({ category: z.string().optional() }).passthrough();
|
|
79
|
+
const ClassifyInput = z.object({ order: OrderSchema, receivedAt: z.string() });
|
|
80
|
+
const RouteInput = z.object({ order: OrderSchema, receivedAt: z.string(), category: z.string() });
|
|
81
|
+
|
|
82
|
+
const intake = defineStep({
|
|
83
|
+
name: 'intake',
|
|
84
|
+
next: ['classify'],
|
|
85
|
+
async run(input, ctx) {
|
|
86
|
+
ctx.logger.info('order received', { input });
|
|
87
|
+
return goto('classify', { order: input, receivedAt: new Date().toISOString() });
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const classify = defineStep({
|
|
92
|
+
name: 'classify',
|
|
93
|
+
next: ['route'],
|
|
94
|
+
inputSchema: ClassifyInput,
|
|
95
|
+
async run(input, ctx) {
|
|
96
|
+
const category = input.order.category ?? 'general';
|
|
97
|
+
ctx.logger.info('classified order', { category });
|
|
98
|
+
return goto('route', { ...input, category });
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const route = defineStep({
|
|
103
|
+
name: 'route',
|
|
104
|
+
next: ['auto_resolve', 'escalate'],
|
|
105
|
+
inputSchema: RouteInput,
|
|
106
|
+
async run(input) {
|
|
107
|
+
const needsHuman = input.category === 'billing_dispute';
|
|
108
|
+
return goto(needsHuman ? 'escalate' : 'auto_resolve', input);
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
const auto_resolve = defineStep({
|
|
113
|
+
name: 'auto_resolve',
|
|
114
|
+
next: [],
|
|
115
|
+
terminal: true,
|
|
116
|
+
inputSchema: RouteInput,
|
|
117
|
+
async run(input) {
|
|
118
|
+
return terminate({ resolved: true, category: input.category });
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const escalate = defineStep({
|
|
123
|
+
name: 'escalate',
|
|
124
|
+
next: [],
|
|
125
|
+
terminal: true,
|
|
126
|
+
inputSchema: RouteInput,
|
|
127
|
+
async run(input, ctx) {
|
|
128
|
+
ctx.logger.info('escalating to human', { category: input.category });
|
|
129
|
+
return terminate({ resolved: false, escalated: true });
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
export const agent = defineAgent({
|
|
134
|
+
name: 'order-triage',
|
|
135
|
+
entry: 'intake',
|
|
136
|
+
steps: { intake, classify, route, auto_resolve, escalate },
|
|
137
|
+
});
|
|
138
|
+
`;
|
|
139
|
+
/**
|
|
140
|
+
* Prefilled canvas-kit BODY for order-triage — hand-authored markup using
|
|
141
|
+
* the template's own classes/patterns (core/canvas-template.ts), exactly as
|
|
142
|
+
* an agent following the visualize macro's prompt would produce. Mirrors
|
|
143
|
+
* index.ts's real step graph (5 steps, 1 branch, 2 terminal outcomes).
|
|
144
|
+
*/
|
|
145
|
+
const ORDER_TRIAGE_CANVAS_BODY = `
|
|
146
|
+
<section class="canvas-panel">
|
|
147
|
+
<header class="canvas-header">
|
|
148
|
+
<div class="canvas-title-row">
|
|
149
|
+
<h1 class="canvas-title">order-triage</h1>
|
|
150
|
+
<span class="canvas-badge">standalone workflow</span>
|
|
151
|
+
<span class="canvas-badge">not deployed yet</span>
|
|
152
|
+
</div>
|
|
153
|
+
<p class="canvas-subtitle">Support-ticket triage: intake -> classify -> route, then auto-resolve or escalate to a human.</p>
|
|
154
|
+
<div class="canvas-stats">
|
|
155
|
+
<div class="canvas-stat"><span class="canvas-stat-value">5</span><span class="canvas-stat-label">steps</span></div>
|
|
156
|
+
<div class="canvas-stat"><span class="canvas-stat-value">2</span><span class="canvas-stat-label">terminal outcomes</span></div>
|
|
157
|
+
<div class="canvas-stat"><span class="canvas-stat-value">1</span><span class="canvas-stat-label">branch points</span></div>
|
|
158
|
+
</div>
|
|
159
|
+
</header>
|
|
160
|
+
<div class="canvas-diagram-panel">
|
|
161
|
+
<svg class="canvas-graph-svg" viewBox="0 0 960 500" width="960" height="500" xmlns="http://www.w3.org/2000/svg">
|
|
162
|
+
<path class="canvas-edge" d="M480,96 L480,150" marker-end="url(#canvas-arrow)" />
|
|
163
|
+
<path class="canvas-edge" d="M480,206 L480,260" marker-end="url(#canvas-arrow)" />
|
|
164
|
+
<path class="canvas-edge canvas-edge--success" d="M480,316 C480,360 288,360 288,410" marker-end="url(#canvas-arrow-success)" />
|
|
165
|
+
<path class="canvas-edge canvas-edge--warn" d="M480,316 C480,360 688,360 688,410" marker-end="url(#canvas-arrow-warn)" />
|
|
166
|
+
<text class="canvas-edge-label" x="440" y="345" text-anchor="end">category != billing_dispute</text>
|
|
167
|
+
<text class="canvas-edge-label" x="520" y="345" text-anchor="start">billing_dispute</text>
|
|
168
|
+
|
|
169
|
+
<g class="canvas-node node--entry" filter="url(#canvas-glow)" transform="translate(392,40)">
|
|
170
|
+
<rect class="canvas-node-rect" width="176" height="56" rx="14" />
|
|
171
|
+
<text class="canvas-node-title" x="88" y="24">intake</text>
|
|
172
|
+
<text class="canvas-node-sub" x="88" y="40">receive + log order</text>
|
|
173
|
+
</g>
|
|
174
|
+
<g class="canvas-node node--step" filter="url(#canvas-glow)" transform="translate(392,150)">
|
|
175
|
+
<rect class="canvas-node-rect" width="176" height="56" rx="14" />
|
|
176
|
+
<text class="canvas-node-title" x="88" y="24">classify</text>
|
|
177
|
+
<text class="canvas-node-sub" x="88" y="40">tag order category</text>
|
|
178
|
+
</g>
|
|
179
|
+
<g class="canvas-node node--step" filter="url(#canvas-glow)" transform="translate(392,260)">
|
|
180
|
+
<rect class="canvas-node-rect" width="176" height="56" rx="14" />
|
|
181
|
+
<text class="canvas-node-title" x="88" y="24">route</text>
|
|
182
|
+
<text class="canvas-node-sub" x="88" y="40">branch on category</text>
|
|
183
|
+
</g>
|
|
184
|
+
<g class="canvas-node node--terminal-success" filter="url(#canvas-glow)" transform="translate(200,410)">
|
|
185
|
+
<rect class="canvas-node-rect" width="176" height="56" rx="14" />
|
|
186
|
+
<text class="canvas-node-title" x="88" y="24">auto_resolve</text>
|
|
187
|
+
<text class="canvas-node-sub" x="88" y="40">terminate({resolved:true})</text>
|
|
188
|
+
</g>
|
|
189
|
+
<g class="canvas-node node--terminal-warn" filter="url(#canvas-glow)" transform="translate(600,410)">
|
|
190
|
+
<rect class="canvas-node-rect" width="176" height="56" rx="14" />
|
|
191
|
+
<text class="canvas-node-title" x="88" y="24">escalate</text>
|
|
192
|
+
<text class="canvas-node-sub" x="88" y="40">terminate({escalated:true})</text>
|
|
193
|
+
</g>
|
|
194
|
+
</svg>
|
|
195
|
+
</div>
|
|
196
|
+
</section>
|
|
197
|
+
|
|
198
|
+
<section class="canvas-panel canvas-interconnections">
|
|
199
|
+
<h2 class="canvas-panel-title">Interconnections</h2>
|
|
200
|
+
<div class="canvas-interconnection-row">
|
|
201
|
+
<span class="canvas-legend-marker canvas-legend-marker--entry"></span>
|
|
202
|
+
<span class="canvas-interconnection-title">external -> intake</span>
|
|
203
|
+
<span class="canvas-interconnection-tag">signal</span>
|
|
204
|
+
<p class="canvas-interconnection-desc">an order object enters here</p>
|
|
205
|
+
</div>
|
|
206
|
+
<div class="canvas-interconnection-row">
|
|
207
|
+
<span class="canvas-legend-marker canvas-legend-marker--terminal-warn"></span>
|
|
208
|
+
<span class="canvas-interconnection-title">escalate -> external</span>
|
|
209
|
+
<span class="canvas-interconnection-tag">handoff</span>
|
|
210
|
+
<p class="canvas-interconnection-desc">routes to a human out-of-band, not to another workflow</p>
|
|
211
|
+
</div>
|
|
212
|
+
</section>
|
|
213
|
+
|
|
214
|
+
<footer class="canvas-footer">
|
|
215
|
+
<div class="canvas-legend">
|
|
216
|
+
<span class="canvas-legend-item"><span class="canvas-legend-marker canvas-legend-marker--entry"></span>entry / active step</span>
|
|
217
|
+
<span class="canvas-legend-item"><span class="canvas-legend-marker canvas-legend-marker--step"></span>step</span>
|
|
218
|
+
<span class="canvas-legend-item"><span class="canvas-legend-marker canvas-legend-marker--terminal-success"></span>terminal · success</span>
|
|
219
|
+
<span class="canvas-legend-item"><span class="canvas-legend-marker canvas-legend-marker--terminal-warn"></span>terminal · escalation</span>
|
|
220
|
+
<span class="canvas-legend-item"><span class="canvas-legend-marker canvas-legend-marker--cross"></span>cross-workflow signal/handoff</span>
|
|
221
|
+
</div>
|
|
222
|
+
<p class="canvas-note">Static preview — ask your agent to regenerate this after you change the workflow.</p>
|
|
223
|
+
</footer>
|
|
224
|
+
`.trim();
|
|
225
|
+
/**
|
|
226
|
+
* Seeds (or reuses) the example project under `options.targetRoot`.
|
|
227
|
+
* Reuse is keyed on the project's own sapiom.json — the file the workflow
|
|
228
|
+
* scanner keys on too, so "reusable" here means exactly "the rail will
|
|
229
|
+
* discover it". The canvas pair is backfilled even on reuse (cheap, and an
|
|
230
|
+
* older/partial seed shouldn't leave the canvas pane empty), but a canvas
|
|
231
|
+
* the user's agent has since regenerated is left alone.
|
|
232
|
+
*/
|
|
233
|
+
export async function seedExampleProject(options) {
|
|
234
|
+
const root = path.resolve(options.targetRoot);
|
|
235
|
+
const projectDir = path.join(root, SAMPLE_PROJECT_NAME);
|
|
236
|
+
const canvasDir = path.join(root, ".sapiom", "canvas");
|
|
237
|
+
const canvasFile = path.join(canvasDir, "index.html");
|
|
238
|
+
const canvasTemplateFile = path.join(canvasDir, "_template.html");
|
|
239
|
+
const alreadySeeded = existsSync(path.join(projectDir, "sapiom.json"));
|
|
240
|
+
const writeCanvasPair = async (overwrite) => {
|
|
241
|
+
await fs.mkdir(canvasDir, { recursive: true });
|
|
242
|
+
// A pristine _template.html alongside the prefilled index.html — the same
|
|
243
|
+
// pairing SessionManager's ensureCanvasTemplate() maintains for every
|
|
244
|
+
// session, so re-visualizing this seeded project has a clean clone source.
|
|
245
|
+
if (overwrite || !existsSync(canvasTemplateFile)) {
|
|
246
|
+
await fs.writeFile(canvasTemplateFile, TEMPLATE_HTML, "utf8");
|
|
247
|
+
}
|
|
248
|
+
if (overwrite || !existsSync(canvasFile)) {
|
|
249
|
+
await fs.writeFile(canvasFile, renderCanvasDocument(ORDER_TRIAGE_CANVAS_BODY), "utf8");
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
if (alreadySeeded && !options.force) {
|
|
253
|
+
await writeCanvasPair(false);
|
|
254
|
+
return { root, projectDir, created: false, gitInitialized: false };
|
|
255
|
+
}
|
|
256
|
+
// Wipe a stale copy before rescaffolding — scaffold() refuses a non-empty dir.
|
|
257
|
+
await fs.rm(projectDir, { recursive: true, force: true });
|
|
258
|
+
await fs.mkdir(root, { recursive: true });
|
|
259
|
+
// Resolve the @sapiom/* dependency versions to stamp into the scaffold the
|
|
260
|
+
// same way `sapiom agents init` does: current npm latest, with a 5s
|
|
261
|
+
// timeout and an offline fallback (see @sapiom/agent-core's scaffold.ts) —
|
|
262
|
+
// never a versions object hardcoded here, which is exactly how the old
|
|
263
|
+
// standalone seed script once shipped dead pins that no longer exist on npm.
|
|
264
|
+
const versions = options.versions ?? (await resolveVersions());
|
|
265
|
+
const result = await scaffold({
|
|
266
|
+
targetDir: projectDir,
|
|
267
|
+
projectName: SAMPLE_PROJECT_NAME,
|
|
268
|
+
templatesDir: options.templatesDir ?? agentCoreTemplatesDir(),
|
|
269
|
+
versions,
|
|
270
|
+
});
|
|
271
|
+
await fs.writeFile(path.join(projectDir, "index.ts"), ORDER_TRIAGE_INDEX_TS, "utf8");
|
|
272
|
+
writeConfig(projectDir, { name: SAMPLE_PROJECT_NAME });
|
|
273
|
+
commitCustomizations(projectDir);
|
|
274
|
+
await writeCanvasPair(true);
|
|
275
|
+
return { root, projectDir, created: true, gitInitialized: result.gitInitialized };
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=example-seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example-seed.js","sourceRoot":"","sources":["../../src/core/example-seed.ts"],"names":[],"mappings":"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"}
|