agentfootprint 2.7.3 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/core/RunnerBase.js +6 -0
  2. package/dist/core/RunnerBase.js.map +1 -1
  3. package/dist/esm/core/RunnerBase.js +6 -0
  4. package/dist/esm/core/RunnerBase.js.map +1 -1
  5. package/dist/esm/strategies/attach.js +227 -0
  6. package/dist/esm/strategies/attach.js.map +1 -0
  7. package/dist/esm/strategies/compose.js +158 -0
  8. package/dist/esm/strategies/compose.js.map +1 -0
  9. package/dist/esm/strategies/defaults/chatBubbleLiveStatus.js +34 -0
  10. package/dist/esm/strategies/defaults/chatBubbleLiveStatus.js.map +1 -0
  11. package/dist/esm/strategies/defaults/consoleObservability.js +61 -0
  12. package/dist/esm/strategies/defaults/consoleObservability.js.map +1 -0
  13. package/dist/esm/strategies/defaults/inMemorySinkCost.js +48 -0
  14. package/dist/esm/strategies/defaults/inMemorySinkCost.js.map +1 -0
  15. package/dist/esm/strategies/defaults/index.js +31 -0
  16. package/dist/esm/strategies/defaults/index.js.map +1 -0
  17. package/dist/esm/strategies/defaults/noopLens.js +29 -0
  18. package/dist/esm/strategies/defaults/noopLens.js.map +1 -0
  19. package/dist/esm/strategies/index.js +23 -0
  20. package/dist/esm/strategies/index.js.map +1 -0
  21. package/dist/esm/strategies/registry.js +102 -0
  22. package/dist/esm/strategies/registry.js.map +1 -0
  23. package/dist/esm/strategies/types.js +36 -0
  24. package/dist/esm/strategies/types.js.map +1 -0
  25. package/dist/strategies/attach.js +256 -0
  26. package/dist/strategies/attach.js.map +1 -0
  27. package/dist/strategies/compose.js +165 -0
  28. package/dist/strategies/compose.js.map +1 -0
  29. package/dist/strategies/defaults/chatBubbleLiveStatus.js +38 -0
  30. package/dist/strategies/defaults/chatBubbleLiveStatus.js.map +1 -0
  31. package/dist/strategies/defaults/consoleObservability.js +65 -0
  32. package/dist/strategies/defaults/consoleObservability.js.map +1 -0
  33. package/dist/strategies/defaults/inMemorySinkCost.js +52 -0
  34. package/dist/strategies/defaults/inMemorySinkCost.js.map +1 -0
  35. package/dist/strategies/defaults/index.js +38 -0
  36. package/dist/strategies/defaults/index.js.map +1 -0
  37. package/dist/strategies/defaults/noopLens.js +33 -0
  38. package/dist/strategies/defaults/noopLens.js.map +1 -0
  39. package/dist/strategies/index.js +47 -0
  40. package/dist/strategies/index.js.map +1 -0
  41. package/dist/strategies/registry.js +118 -0
  42. package/dist/strategies/registry.js.map +1 -0
  43. package/dist/strategies/types.js +37 -0
  44. package/dist/strategies/types.js.map +1 -0
  45. package/dist/types/core/RunnerBase.d.ts.map +1 -1
  46. package/dist/types/core/runner.d.ts +29 -2
  47. package/dist/types/core/runner.d.ts.map +1 -1
  48. package/dist/types/strategies/attach.d.ts +48 -0
  49. package/dist/types/strategies/attach.d.ts.map +1 -0
  50. package/dist/types/strategies/compose.d.ts +49 -0
  51. package/dist/types/strategies/compose.d.ts.map +1 -0
  52. package/dist/types/strategies/defaults/chatBubbleLiveStatus.d.ts +37 -0
  53. package/dist/types/strategies/defaults/chatBubbleLiveStatus.d.ts.map +1 -0
  54. package/dist/types/strategies/defaults/consoleObservability.d.ts +43 -0
  55. package/dist/types/strategies/defaults/consoleObservability.d.ts.map +1 -0
  56. package/dist/types/strategies/defaults/inMemorySinkCost.d.ts +51 -0
  57. package/dist/types/strategies/defaults/inMemorySinkCost.d.ts.map +1 -0
  58. package/dist/types/strategies/defaults/index.d.ts +31 -0
  59. package/dist/types/strategies/defaults/index.d.ts.map +1 -0
  60. package/dist/types/strategies/defaults/noopLens.d.ts +29 -0
  61. package/dist/types/strategies/defaults/noopLens.d.ts.map +1 -0
  62. package/dist/types/strategies/index.d.ts +23 -0
  63. package/dist/types/strategies/index.d.ts.map +1 -0
  64. package/dist/types/strategies/registry.d.ts +71 -0
  65. package/dist/types/strategies/registry.d.ts.map +1 -0
  66. package/dist/types/strategies/types.d.ts +304 -0
  67. package/dist/types/strategies/types.d.ts.map +1 -0
  68. package/package.json +5 -5
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.RunnerBase = exports.makeRunId = void 0;
13
13
  const dispatcher_js_1 = require("../events/dispatcher.js");
14
14
  const LoggingRecorder_js_1 = require("../recorders/observability/LoggingRecorder.js");
15
+ const attach_js_1 = require("../strategies/attach.js");
15
16
  const ThinkingRecorder_js_1 = require("../recorders/observability/ThinkingRecorder.js");
16
17
  const FlowchartRecorder_js_1 = require("../recorders/observability/FlowchartRecorder.js");
17
18
  let _runIdSeq = 0;
@@ -127,6 +128,11 @@ class RunnerBase {
127
128
  // via the attach path AND subscribes to the event dispatcher
128
129
  // for ReAct step transitions (stream.llm_* / stream.tool_*).
129
130
  (0, FlowchartRecorder_js_1.attachFlowchart)((r) => this.attach(r), this.dispatcher, opts),
131
+ // v2.8 grouped strategy enablers — see
132
+ // `docs/inspiration/strategy-everywhere.md`.
133
+ observability: (opts) => (0, attach_js_1.attachObservabilityStrategy)(this.dispatcher, opts),
134
+ cost: (opts) => (0, attach_js_1.attachCostStrategy)(this.dispatcher, opts),
135
+ liveStatus: (opts) => (0, attach_js_1.attachLiveStatusStrategy)(this.dispatcher, opts),
130
136
  };
131
137
  // ─── Consumer custom emit ──────────────────────────────────────
132
138
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"RunnerBase.js","sourceRoot":"","sources":["../../src/core/RunnerBase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RunnerBase.js","sourceRoot":"","sources":["../../src/core/RunnerBase.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import { EventDispatcher } from '../events/dispatcher.js';
11
11
  import { attachLogging } from '../recorders/observability/LoggingRecorder.js';
12
+ import { attachObservabilityStrategy, attachCostStrategy, attachLiveStatusStrategy, } from '../strategies/attach.js';
12
13
  import { attachThinking, } from '../recorders/observability/ThinkingRecorder.js';
13
14
  import { attachFlowchart, } from '../recorders/observability/FlowchartRecorder.js';
14
15
  let _runIdSeq = 0;
@@ -123,6 +124,11 @@ export class RunnerBase {
123
124
  // via the attach path AND subscribes to the event dispatcher
124
125
  // for ReAct step transitions (stream.llm_* / stream.tool_*).
125
126
  attachFlowchart((r) => this.attach(r), this.dispatcher, opts),
127
+ // v2.8 grouped strategy enablers — see
128
+ // `docs/inspiration/strategy-everywhere.md`.
129
+ observability: (opts) => attachObservabilityStrategy(this.dispatcher, opts),
130
+ cost: (opts) => attachCostStrategy(this.dispatcher, opts),
131
+ liveStatus: (opts) => attachLiveStatusStrategy(this.dispatcher, opts),
126
132
  };
127
133
  // ─── Consumer custom emit ──────────────────────────────────────
128
134
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"RunnerBase.js","sourceRoot":"","sources":["../../../src/core/RunnerBase.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAe1D,OAAO,EAAE,aAAa,EAAuB,MAAM,+CAA+C,CAAC;AACnG,OAAO,EACL,cAAc,GAEf,MAAM,gDAAgD,CAAC;AACxD,OAAO,EACL,eAAe,GAGhB,MAAM,iDAAiD,CAAC;AAGzD,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,OAAgB,UAAU;IACX,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,iBAAiB,GAAuB,EAAE,CAAC;IA4B9D,mEAAmE;IAEnE;;;;;;;;OAQG;IACO,WAAW,CACnB,QAA2B,EAC3B,MAAe;QAEf,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;YAAE,OAAO,SAAS,CAAC;QAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC5C,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAE/C,MAAM,SAAS,GACb,UAAU,CAAC,SAAS,KAAK,SAAS;YAChC,CAAC,CAAC,UAAU,CAAC,SAAS;YACtB,CAAC,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,QAAQ,IAAI,MAAM;gBACrE,CAAC,CAAE,MAAkC,CAAC,SAAS;gBAC/C,CAAC,CAAC,SAAS,CAAC;QAEhB,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAE7C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IACjD,CAAC;IAED;;;OAGG;IACK,gBAAgB,CAAC,UAA+B,EAAE,SAAkB;QAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,cAAc,GAClB,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,IAAI,QAAQ,IAAI,SAAS;YAC1E,CAAC,CAAC,MAAM,CAAE,SAAiC,CAAC,MAAM,CAAC;YACnD,CAAC,CAAC,uBAAuB,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YACvB,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE;gBACP,MAAM,EAAE,cAAc;gBACtB,eAAe,EACb,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI;oBACjD,CAAC,CAAE,SAA+C;oBAClD,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;aAC1B;YACD,IAAI,EAAE;gBACJ,GAAG,IAAI;gBACP,cAAc,EAAE,GAAG,UAAU,CAAC,aAAa,SAAS;gBACpD,WAAW,EAAE,UAAU,CAAC,WAAW;aACpC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACO,eAAe,CAAC,UAA+B,EAAE,KAAc;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YACvB,IAAI,EAAE,6BAA6B;YACnC,OAAO,EAAE;gBACP,WAAW,EACT,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;oBACzC,CAAC,CAAE,KAA2C;oBAC9C,CAAC,CAAC,EAAE,KAAK,EAAE;gBACf,gBAAgB;aACjB;YACD,IAAI,EAAE;gBACJ,GAAG,IAAI;gBACP,cAAc,EAAE,GAAG,UAAU,CAAC,aAAa,UAAU;gBACrD,WAAW,EAAE,UAAU,CAAC,WAAW;aACpC;SACF,CAAC,CAAC;IACL,CAAC;IAUD,EAAE,CACA,IAAY,EACZ,QAA8C,EAC9C,OAAuB;QAEvB,sEAAsE;QACtE,kEAAkE;QAClE,qEAAqE;QACrE,OACE,IAAI,CAAC,UAAU,CAAC,EAKjB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC;IAID,GAAG,CAAC,IAAY,EAAE,QAA8C;QAE5D,IAAI,CAAC,UAAU,CAAC,GAIjB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpB,CAAC;IAID,IAAI,CAAC,IAAY,EAAE,QAA8C;QAC/D,OACE,IAAI,CAAC,UAAU,CAAC,IAIjB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpB,CAAC;IAED,kEAAkE;IAElE,MAAM,CAAC,QAA0B;QAC/B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,GAAG,IAAI,CAAC;gBAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC;IACJ,CAAC;IAED,iEAAiE;IAExD,MAAM,GAAoB;QACjC,QAAQ,EAAE,CAAC,IAAqB,EAAe,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;QACvF,OAAO,EAAE,CAAC,IAAqB,EAAe,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;QACrF,SAAS,EAAE,CAAC,IAAuB,EAAmB,EAAE;QACtD,gEAAgE;QAChE,4DAA4D;QAC5D,8DAA8D;QAC9D,6DAA6D;QAC7D,6DAA6D;QAC7D,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;KAChE,CAAC;IAEF,kEAAkE;IAElE;;;;;;;OAOG;IACH,IAAI,CAAC,IAAY,EAAE,OAAgC;QACjD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAA+B,CAAC;YAAE,OAAO;QAC9E,MAAM,IAAI,GAAc,IAAI,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG;YACZ,IAAI,EAAE,IAAI;YACV,OAAO;YACP,IAAI;SACyD,CAAC;QAChE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,kEAAkE;IAElE;;;OAGG;IACO,WAAW;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,OAAO;YACL,WAAW,EAAE,GAAG;YAChB,WAAW,EAAE,CAAC;YACd,cAAc,EAAE,iBAAiB;YACjC,WAAW,EAAE,EAAE;YACf,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;YACvC,KAAK,EAAE,gBAAgB;SACxB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACO,eAAe;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;;OAIG;IACO,aAAa;QACrB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
1
+ {"version":3,"file":"RunnerBase.js","sourceRoot":"","sources":["../../../src/core/RunnerBase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Wire each grouped strategy to its data source on the dispatcher /
3
+ * recorder substrate. These are the 4 `enable.*` facades' actual
4
+ * implementations; `RunnerBase.enable` calls them with the right
5
+ * dispatcher / attach handle.
6
+ *
7
+ * Pattern: every facade follows the same shape:
8
+ *
9
+ * 1. Resolve strategy (consumer-supplied OR default)
10
+ * 2. Run `strategy.validate?()` — early-fail on misconfig (New Relic
11
+ * panel review)
12
+ * 3. Set up subscription / projection
13
+ * 4. Apply per-strategy event-type filter (`relevantEventTypes`)
14
+ * 5. Apply per-call sample rate
15
+ * 6. Wrap calls in try/catch — route errors to `_onError` (passive
16
+ * recorder rule: never throw to caller)
17
+ * 7. Return Unsubscribe (or handle for lens)
18
+ */
19
+ import { flowChart } from 'footprintjs';
20
+ import { selectThinkingState, renderThinkingLine, defaultThinkingTemplates, } from '../recorders/observability/thinking/thinkingTemplates.js';
21
+ // Registry-lookup helpers (`getObservabilityStrategy` etc.) are
22
+ // defined in `./registry.js` and used by consumers via the
23
+ // `enable.*({ vendor, config })` path elsewhere — not used in the
24
+ // current attach() implementations, which take `opts.strategy` directly.
25
+ /**
26
+ * Sentinel returned when consumer calls `enable.X()` without supplying
27
+ * a strategy or vendor. We DON'T auto-default — that would be an
28
+ * unwelcome opinion. Consumer chose to call `enable.X` but didn't hand
29
+ * us anywhere to ship; just no-op silently and return a stoppable
30
+ * unsubscribe so the call site stays composable.
31
+ */
32
+ const NOOP_UNSUBSCRIBE = () => { };
33
+ /** Build a one-stage flowchart that performs `args.work(event)` and
34
+ * routes any thrown error to `args.onError`. The driver schedules
35
+ * this chart per event. */
36
+ function buildDetachWrapperChart(args) {
37
+ return flowChart('agentfootprint:detach:wrapper', async (scope) => {
38
+ const event = scope.$getArgs();
39
+ try {
40
+ args.work(event);
41
+ }
42
+ catch (err) {
43
+ args.onError?.(err instanceof Error ? err : new Error(String(err)), event);
44
+ }
45
+ }, 'wrap').build();
46
+ }
47
+ let detachExecutorSingleton;
48
+ /** Lazy-import a shared `FlowChartExecutor` we use purely as the
49
+ * bare-executor entry point for `detachAndForget` / `detachAndJoinLater`.
50
+ * No chart actually runs through it — we just need its detach methods. */
51
+ async function getDetachExecutor() {
52
+ if (detachExecutorSingleton)
53
+ return detachExecutorSingleton;
54
+ const fp = await import('footprintjs');
55
+ // Trivial host chart — never run, just satisfies the constructor.
56
+ const noopChart = fp.flowChart('agentfootprint:detach:host', async () => { }, 'host').build();
57
+ detachExecutorSingleton = new fp.FlowChartExecutor(noopChart);
58
+ return detachExecutorSingleton;
59
+ }
60
+ /**
61
+ * Build an event-handling function that respects `opts.detach`.
62
+ *
63
+ * - `opts.detach` undefined → returns a sync handler that runs
64
+ * `work(event)` inline and routes errors to `onError`. Same as
65
+ * pre-v2.8 behavior.
66
+ *
67
+ * - `opts.detach` set → returns a handler that schedules a wrapper
68
+ * chart on the driver. `mode === 'forget'` discards the handle;
69
+ * `mode === 'join-later'` delivers it to `opts.detach.onHandle`.
70
+ *
71
+ * The detached path is async-loaded — the executor singleton is built
72
+ * on first call so consumers who don't enable detach pay zero cost.
73
+ */
74
+ function buildEventHandler(detach, args) {
75
+ if (!detach) {
76
+ // Sync path — current behavior.
77
+ return (event) => {
78
+ try {
79
+ args.work(event);
80
+ }
81
+ catch (err) {
82
+ args.onError?.(err instanceof Error ? err : new Error(String(err)), event);
83
+ }
84
+ };
85
+ }
86
+ // Detached path — schedule via the driver. We need the wrapper chart
87
+ // (for the runChild side) and the executor (for the bare-executor
88
+ // entry point that returns / discards the handle).
89
+ const wrapperChart = buildDetachWrapperChart(args);
90
+ const mode = detach.mode ?? 'forget';
91
+ const onHandle = detach.onHandle;
92
+ if (mode === 'join-later' && !onHandle) {
93
+ throw new TypeError(`[enable.*] detach.mode === 'join-later' requires \`onHandle\`. ` +
94
+ `Without it, the returned DetachHandle would be unreachable. ` +
95
+ `Pass \`onHandle: (h) => myHandles.push(h)\` (and await later via ` +
96
+ `Promise.all(myHandles.map(h => h.wait()))).`);
97
+ }
98
+ return (event) => {
99
+ // Lazy-resolve the executor. The Promise here is fire-and-forget
100
+ // itself — we never await it, so the agent loop returns sync. Any
101
+ // error from the import OR the schedule call routes to onError.
102
+ getDetachExecutor()
103
+ .then((exec) => {
104
+ if (mode === 'forget') {
105
+ exec.detachAndForget(detach.driver, wrapperChart, event);
106
+ }
107
+ else {
108
+ const handle = exec.detachAndJoinLater(detach.driver, wrapperChart, event);
109
+ onHandle(handle);
110
+ }
111
+ })
112
+ .catch((err) => {
113
+ args.onError?.(err instanceof Error ? err : new Error(String(err)), event);
114
+ });
115
+ };
116
+ }
117
+ const TIER_FILTER = {
118
+ minimal: (t) => t.startsWith('agentfootprint.error.') || t.startsWith('agentfootprint.agent.'),
119
+ standard: (t) => !t.startsWith('agentfootprint.stream.token'),
120
+ firehose: () => true,
121
+ };
122
+ export function attachObservabilityStrategy(dispatcher, opts = {}) {
123
+ const strategy = opts.strategy;
124
+ // Consumer chose to call enable.observability() but didn't supply
125
+ // a strategy. Don't auto-default — that imposes an opinion. Just
126
+ // no-op so the call site stays composable.
127
+ if (!strategy)
128
+ return NOOP_UNSUBSCRIBE;
129
+ strategy.validate?.();
130
+ const tierFilter = TIER_FILTER[opts.tier ?? 'standard'];
131
+ const sampleRate = opts.sampleRate ?? 1;
132
+ const relevant = strategy.relevantEventTypes
133
+ ? new Set(strategy.relevantEventTypes)
134
+ : null;
135
+ // Build the event handler ONCE per attach call. Sync if no
136
+ // `opts.detach`; otherwise schedules on the driver so the agent
137
+ // loop never blocks on slow exporters.
138
+ const handle = buildEventHandler(opts.detach, {
139
+ work: (event) => strategy.exportEvent(event),
140
+ onError: (err, event) => strategy._onError?.(err, event),
141
+ });
142
+ return dispatcher.on('*', (event) => {
143
+ if (!tierFilter(event.type))
144
+ return;
145
+ if (relevant && !relevant.has(event.type))
146
+ return;
147
+ if (sampleRate < 1 && Math.random() > sampleRate)
148
+ return;
149
+ handle(event);
150
+ });
151
+ }
152
+ /**
153
+ * Subscribe to `agentfootprint.cost.tick` events, project payload into
154
+ * the canonical `CostTick` shape, hand to strategy.
155
+ */
156
+ export function attachCostStrategy(dispatcher, opts = {}) {
157
+ const strategy = opts.strategy;
158
+ if (!strategy)
159
+ return NOOP_UNSUBSCRIBE;
160
+ strategy.validate?.();
161
+ // Cost strategy detach mirrors observability — sync by default,
162
+ // schedules on the driver when `opts.detach` is set. Useful when
163
+ // `recordCost` does heavy work (per-tick DB write, vendor budget
164
+ // API, etc.).
165
+ const handle = buildEventHandler(opts.detach, {
166
+ work: (tickInput) => strategy.recordCost(tickInput),
167
+ onError: (err, tickInput) => strategy._onError?.(err, tickInput),
168
+ });
169
+ return dispatcher.on('agentfootprint.cost.tick', (event) => {
170
+ const p = event.payload;
171
+ const tick = {
172
+ cumulativeInputTokens: Number(p.cumulativeInputTokens ?? 0),
173
+ cumulativeOutputTokens: Number(p.cumulativeOutputTokens ?? 0),
174
+ cumulativeCostUsd: Number(p.cumulativeCostUsd ?? 0),
175
+ recentInputTokens: Number(p.recentInputTokens ?? 0),
176
+ recentOutputTokens: Number(p.recentOutputTokens ?? 0),
177
+ recentCostUsd: Number(p.recentCostUsd ?? 0),
178
+ model: String(p.model ?? 'unknown'),
179
+ ...(typeof p.iteration === 'number' ? { iteration: p.iteration } : {}),
180
+ ...(typeof p.runtimeStageId === 'string' ? { runtimeStageId: p.runtimeStageId } : {}),
181
+ };
182
+ handle(tick);
183
+ });
184
+ }
185
+ /**
186
+ * Subscribe to '*', maintain a rolling event log, project current
187
+ * thinking state on each event, render via templates, hand to strategy.
188
+ *
189
+ * Lower bound on emissions: dedupes — only fires `renderStatus` when
190
+ * the rendered line CHANGES (avoids floods on every token).
191
+ */
192
+ /** Sliding-window cap for `attachLiveStatusStrategy`'s internal event
193
+ * log. Long-lived agent servers would otherwise leak memory through
194
+ * unbounded growth (per OTel SIG panel review). The cap is high
195
+ * enough that `selectThinkingState` always sees the relevant recent
196
+ * history. */
197
+ const LIVE_STATUS_LOG_CAP = 1000;
198
+ export function attachLiveStatusStrategy(dispatcher, opts) {
199
+ opts.strategy.validate?.();
200
+ const templates = { ...defaultThinkingTemplates, ...(opts.templates ?? {}) };
201
+ const ctx = { appName: opts.appName ?? 'Agent' };
202
+ const eventLog = [];
203
+ let lastLine = null;
204
+ return dispatcher.on('*', (event) => {
205
+ eventLog.push(event);
206
+ // Sliding-window — drop oldest when over cap. O(1) amortized
207
+ // because shift() runs only once per overflow.
208
+ while (eventLog.length > LIVE_STATUS_LOG_CAP)
209
+ eventLog.shift();
210
+ const state = selectThinkingState(eventLog);
211
+ if (!state) {
212
+ lastLine = null;
213
+ return;
214
+ }
215
+ const line = renderThinkingLine(state, ctx, templates);
216
+ if (line === null || line === lastLine)
217
+ return;
218
+ lastLine = line;
219
+ try {
220
+ opts.strategy.renderStatus({ line, state });
221
+ }
222
+ catch (err) {
223
+ opts.strategy._onError?.(err instanceof Error ? err : new Error(String(err)), event);
224
+ }
225
+ });
226
+ }
227
+ //# sourceMappingURL=attach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attach.js","sourceRoot":"","sources":["../../../src/strategies/attach.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * `compose([...])` — fan-out combinator.
3
+ *
4
+ * Pattern: Composite. Same shape as React's children array, RxJS's
5
+ * `merge`, OTel's `MultiSpanProcessor`. Pass an array of
6
+ * strategies; get back a single strategy that fan-outs each
7
+ * call to every child.
8
+ *
9
+ * Use when:
10
+ * - Multi-vendor pipelines (`compose([datadog(), otel(), console()])`)
11
+ * - Test instrumentation alongside production sink
12
+ * (`compose([inMemorySink(), stripeBilling()])`) so test assertions
13
+ * can read ticks while production also ships
14
+ * - Tier-staging — local dev mirrors what production sees
15
+ *
16
+ * Per-child error isolation: if one child's `exportEvent` throws, the
17
+ * other children still receive the event. The throwing child's
18
+ * `_onError` is called (if present); otherwise the error is logged
19
+ * via `console.warn` once. One bad sink never breaks the chain.
20
+ *
21
+ * Capabilities are OR-ed across children — if any child supports a
22
+ * capability, the composite reports it as supported. The dispatcher
23
+ * uses this to decide whether to bother building event objects at all.
24
+ *
25
+ * Idempotent operations:
26
+ * - `flush()` — calls every child's `flush()` (sync or async)
27
+ * concurrently, awaits all
28
+ * - `stop()` — calls every child's `stop()` once, in order; failures
29
+ * in one child don't block the others
30
+ */
31
+ // ─── Internal helpers ────────────────────────────────────────────────
32
+ /** Run `cb()` for every child; isolate errors via the child's
33
+ * `_onError` or a single `console.warn`. */
34
+ function safeForEach(children, cb) {
35
+ for (const child of children) {
36
+ try {
37
+ cb(child);
38
+ }
39
+ catch (err) {
40
+ const e = err instanceof Error ? err : new Error(String(err));
41
+ if (child._onError) {
42
+ try {
43
+ child._onError(e);
44
+ }
45
+ catch {
46
+ // Even _onError can throw; final fallback is silent drop —
47
+ // we MUST NOT propagate to the caller (passive recorder rule).
48
+ }
49
+ }
50
+ else {
51
+ // eslint-disable-next-line no-console
52
+ console.warn('[compose] child threw and has no _onError:', e.message);
53
+ }
54
+ }
55
+ }
56
+ }
57
+ /** OR-merge a capability bag across children. Generic over the
58
+ * concrete capability type — the runtime walk treats every entry as
59
+ * `boolean | undefined` regardless of the typed shape. */
60
+ function mergeCaps(children) {
61
+ const merged = {};
62
+ for (const c of children) {
63
+ for (const [k, v] of Object.entries(c.capabilities)) {
64
+ if (v === true)
65
+ merged[k] = true;
66
+ }
67
+ }
68
+ return merged;
69
+ }
70
+ /** Run every child's optional `flush` concurrently. */
71
+ async function flushAll(children) {
72
+ const promises = [];
73
+ for (const c of children) {
74
+ if (!c.flush)
75
+ continue;
76
+ try {
77
+ const result = c.flush();
78
+ if (result instanceof Promise)
79
+ promises.push(result.catch(() => { }));
80
+ }
81
+ catch {
82
+ // ignore — passive recorder rule
83
+ }
84
+ }
85
+ if (promises.length > 0)
86
+ await Promise.all(promises);
87
+ }
88
+ function stopAll(children) {
89
+ for (const c of children) {
90
+ if (!c.stop)
91
+ continue;
92
+ try {
93
+ c.stop();
94
+ }
95
+ catch {
96
+ // ignore — passive recorder rule
97
+ }
98
+ }
99
+ }
100
+ // ─── Composite factories — one per strategy kind ─────────────────────
101
+ /**
102
+ * Compose multiple ObservabilityStrategies into a single fan-out.
103
+ *
104
+ * @example
105
+ * const all = composeObservability([
106
+ * consoleObservability(),
107
+ * datadogObservability({ apiKey }),
108
+ * otelObservability(tracer),
109
+ * ]);
110
+ */
111
+ export function composeObservability(children) {
112
+ return {
113
+ name: 'compose',
114
+ capabilities: mergeCaps(children),
115
+ exportEvent(event) {
116
+ safeForEach(children, (c) => c.exportEvent(event));
117
+ },
118
+ flush: () => flushAll(children),
119
+ stop: () => stopAll(children),
120
+ };
121
+ }
122
+ /** Compose CostStrategies. */
123
+ export function composeCost(children) {
124
+ return {
125
+ name: 'compose',
126
+ capabilities: mergeCaps(children),
127
+ recordCost(tick) {
128
+ safeForEach(children, (c) => c.recordCost(tick));
129
+ },
130
+ flush: () => flushAll(children),
131
+ stop: () => stopAll(children),
132
+ };
133
+ }
134
+ /** Compose LiveStatusStrategies. */
135
+ export function composeLiveStatus(children) {
136
+ return {
137
+ name: 'compose',
138
+ capabilities: mergeCaps(children),
139
+ renderStatus(update) {
140
+ safeForEach(children, (c) => c.renderStatus(update));
141
+ },
142
+ flush: () => flushAll(children),
143
+ stop: () => stopAll(children),
144
+ };
145
+ }
146
+ /** Compose LensStrategies. */
147
+ export function composeLens(children) {
148
+ return {
149
+ name: 'compose',
150
+ capabilities: mergeCaps(children),
151
+ renderGraph(update) {
152
+ safeForEach(children, (c) => c.renderGraph(update));
153
+ },
154
+ flush: () => flushAll(children),
155
+ stop: () => stopAll(children),
156
+ };
157
+ }
158
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../../src/strategies/compose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * `chatBubbleLiveStatus()` — default LiveStatusStrategy.
3
+ *
4
+ * Pattern: Strategy. Adapter for a consumer-supplied callback.
5
+ * Role: The "every chat UI" sink. Wraps a `(line: string) => void`
6
+ * callback so the consumer just hands us the function their
7
+ * chat-bubble component needs and we drive it on every
8
+ * rendered status update.
9
+ *
10
+ * Use when:
11
+ * - Building a chat UI (Neo, Lens, embedded widget) where the
12
+ * consumer owns rendering but not state derivation
13
+ * - Tier-1 of compose chains (`compose([chatBubble(setLine), stdout()])`
14
+ * so dev console mirrors what the user sees)
15
+ *
16
+ * The callback runs on EVERY status transition. Consumer can debounce
17
+ * / coalesce per their needs (we don't impose UI policy).
18
+ */
19
+ export function chatBubbleLiveStatus(opts) {
20
+ return {
21
+ name: 'chat-bubble',
22
+ capabilities: { streaming: true },
23
+ renderStatus(update) {
24
+ opts.onLine(update.line);
25
+ },
26
+ validate() {
27
+ if (typeof opts.onLine !== 'function') {
28
+ throw new Error('chatBubbleLiveStatus: required `onLine` callback is missing or not a function. ' +
29
+ 'Pass the function that should receive each rendered status line.');
30
+ }
31
+ },
32
+ };
33
+ }
34
+ //# sourceMappingURL=chatBubbleLiveStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatBubbleLiveStatus.js","sourceRoot":"","sources":["../../../../src/strategies/defaults/chatBubbleLiveStatus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAqBH,MAAM,UAAU,oBAAoB,CAAC,IAAiC;IACpE,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;QACjC,YAAY,CAAC,MAAoB;YAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,QAAQ;YACN,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CACb,iFAAiF;oBAC/E,kEAAkE,CACrE,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * `consoleObservability()` — default ObservabilityStrategy.
3
+ *
4
+ * Pattern: Strategy. Adapter for `globalThis.console`. Used when no
5
+ * vendor-specific strategy is configured (zero-config dev
6
+ * experience). Same role as `NoOpCacheStrategy` is for the
7
+ * cache layer.
8
+ * Role: Tier-1 fallback — print every event to the console with a
9
+ * one-line type+payload summary. Vendor-neutral, dependency-
10
+ * free, works in browser + Node + Deno + Bun.
11
+ *
12
+ * Use when:
13
+ * - Local development (`agent.enable.observability()` with no opts)
14
+ * - CI logs ("what events fired during this test?")
15
+ * - Tier-1 of compose chains (`compose([console(), datadog()])`)
16
+ *
17
+ * Don't use when: production. Console output is unstructured + can't
18
+ * be queried; switch to a vendor strategy (Datadog, OTel, CloudWatch).
19
+ */
20
+ /**
21
+ * Default formatter — emits a single structured JSON line per event.
22
+ * Honeycomb / Datadog / Loki / any structured-log pipeline can ingest
23
+ * directly; `grep` still works because every line is `{` … `}`.
24
+ *
25
+ * Shape: `{type, ...payload}` — flattens payload to top level so
26
+ * filter expressions like `.type == "agentfootprint.cost.tick"` work
27
+ * without nesting.
28
+ */
29
+ const DEFAULT_FORMAT = (event) => {
30
+ const payload = typeof event.payload === 'object' && event.payload !== null
31
+ ? event.payload
32
+ : { value: event.payload };
33
+ return safeJson({ type: event.type, ...payload });
34
+ };
35
+ /**
36
+ * Factory. Returns a fresh ObservabilityStrategy each call so multiple
37
+ * agents in the same process get independent instances.
38
+ */
39
+ export function consoleObservability(opts = {}) {
40
+ const sink = opts.logger ?? globalThis.console;
41
+ const format = opts.format ?? DEFAULT_FORMAT;
42
+ return {
43
+ name: 'console',
44
+ capabilities: { events: true, logs: true },
45
+ exportEvent(event) {
46
+ sink.log(format(event));
47
+ },
48
+ };
49
+ }
50
+ /** JSON.stringify with circular-safety. Avoids breaking the agent loop
51
+ * if a payload contains a circular ref. Returns the type alone if
52
+ * serialization fails. */
53
+ function safeJson(value) {
54
+ try {
55
+ return JSON.stringify(value);
56
+ }
57
+ catch {
58
+ return '[unserializable]';
59
+ }
60
+ }
61
+ //# sourceMappingURL=consoleObservability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consoleObservability.js","sourceRoot":"","sources":["../../../../src/strategies/defaults/consoleObservability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAoBH;;;;;;;;GAQG;AACH,MAAM,cAAc,GAAG,CAAC,KAA0B,EAAU,EAAE;IAC5D,MAAM,OAAO,GACX,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;QACzD,CAAC,CAAC,KAAK,CAAC,OAAO;QACf,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IAC/B,OAAO,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAoC,EAAE;IAEtC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,OAAO,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,cAAc,CAAC;IAC7C,OAAO;QACL,IAAI,EAAE,SAAS;QACf,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;QAC1C,WAAW,CAAC,KAA0B;YACpC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;2BAE2B;AAC3B,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,kBAAkB,CAAC;IAC5B,CAAC;AACH,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * `inMemorySinkCost()` — default CostStrategy.
3
+ *
4
+ * Pattern: Strategy. In-process accumulator. Same role as InMemoryStore
5
+ * for memory-providers.
6
+ * Role: Tier-1 fallback — accumulate cost ticks in a process-local
7
+ * array. Consumer reads via `getTicks()` or hooks `onRecord`
8
+ * for streaming. Vendor-free.
9
+ *
10
+ * Use when:
11
+ * - Tests / CI ("what cost did this run accrue?")
12
+ * - Local dev before billing integration
13
+ * - Tier-1 of compose chains (`compose([inMemorySink(), stripeBilling()])`
14
+ * so test assertions can read ticks while production also ships)
15
+ *
16
+ * Don't use when: process is long-running with high cost-tick volume —
17
+ * the buffer grows unbounded. Add a `maxTicks` cap (drops oldest) or
18
+ * pair with a streaming strategy (`stripeBilling`, `webhook`).
19
+ */
20
+ export function inMemorySinkCost(opts = {}) {
21
+ const buffer = [];
22
+ const cap = opts.maxTicks ?? Infinity;
23
+ return {
24
+ name: 'in-memory-sink',
25
+ capabilities: { streaming: true, enforcement: false },
26
+ recordCost(tick) {
27
+ buffer.push(tick);
28
+ // FIFO eviction when over cap.
29
+ while (buffer.length > cap)
30
+ buffer.shift();
31
+ opts.onRecord?.(tick);
32
+ },
33
+ getTicks() {
34
+ return buffer.slice();
35
+ },
36
+ getTicksCount() {
37
+ return buffer.length;
38
+ },
39
+ getTicksSince(idx) {
40
+ // Clamp negative / out-of-range. `slice` handles bounds.
41
+ return buffer.slice(Math.max(0, idx));
42
+ },
43
+ clear() {
44
+ buffer.length = 0;
45
+ },
46
+ };
47
+ }
48
+ //# sourceMappingURL=inMemorySinkCost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inMemorySinkCost.js","sourceRoot":"","sources":["../../../../src/strategies/defaults/inMemorySinkCost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAmCH,MAAM,UAAU,gBAAgB,CAAC,OAAgC,EAAE;IACjE,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC;IACtC,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE;QACrD,UAAU,CAAC,IAAc;YACvB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,+BAA+B;YAC/B,OAAO,MAAM,CAAC,MAAM,GAAG,GAAG;gBAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,QAAQ;YACN,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QACD,aAAa;YACX,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;QACD,aAAa,CAAC,GAAW;YACvB,yDAAyD;YACzD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,KAAK;YACH,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC"}