@fabric-harness/sdk 1.12.2 → 1.14.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 (114) hide show
  1. package/dist/agent-definition.d.ts +6 -0
  2. package/dist/agent-definition.d.ts.map +1 -1
  3. package/dist/agent-definition.js +5 -4
  4. package/dist/agent-definition.js.map +1 -1
  5. package/dist/agent.d.ts +6 -0
  6. package/dist/agent.d.ts.map +1 -1
  7. package/dist/agent.js +45 -1
  8. package/dist/agent.js.map +1 -1
  9. package/dist/channel.d.ts +77 -0
  10. package/dist/channel.d.ts.map +1 -0
  11. package/dist/channel.js +115 -0
  12. package/dist/channel.js.map +1 -0
  13. package/dist/context-budget.d.ts +16 -0
  14. package/dist/context-budget.d.ts.map +1 -1
  15. package/dist/context-budget.js +38 -3
  16. package/dist/context-budget.js.map +1 -1
  17. package/dist/cost-budget.d.ts +106 -1
  18. package/dist/cost-budget.d.ts.map +1 -1
  19. package/dist/cost-budget.js +48 -2
  20. package/dist/cost-budget.js.map +1 -1
  21. package/dist/dispatch.d.ts +95 -0
  22. package/dist/dispatch.d.ts.map +1 -0
  23. package/dist/dispatch.js +175 -0
  24. package/dist/dispatch.js.map +1 -0
  25. package/dist/error.d.ts +1 -1
  26. package/dist/error.d.ts.map +1 -1
  27. package/dist/error.js.map +1 -1
  28. package/dist/filesystem.d.ts +52 -0
  29. package/dist/filesystem.d.ts.map +1 -0
  30. package/dist/filesystem.js +24 -0
  31. package/dist/filesystem.js.map +1 -0
  32. package/dist/history.d.ts +22 -2
  33. package/dist/history.d.ts.map +1 -1
  34. package/dist/history.js +69 -0
  35. package/dist/history.js.map +1 -1
  36. package/dist/index.d.ts +31 -12
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +17 -6
  39. package/dist/index.js.map +1 -1
  40. package/dist/loop.d.ts +29 -3
  41. package/dist/loop.d.ts.map +1 -1
  42. package/dist/loop.js +167 -24
  43. package/dist/loop.js.map +1 -1
  44. package/dist/model.d.ts +47 -0
  45. package/dist/model.d.ts.map +1 -1
  46. package/dist/model.js +250 -79
  47. package/dist/model.js.map +1 -1
  48. package/dist/otel-observer.d.ts +44 -0
  49. package/dist/otel-observer.d.ts.map +1 -0
  50. package/dist/otel-observer.js +165 -0
  51. package/dist/otel-observer.js.map +1 -0
  52. package/dist/persistence.d.ts +70 -0
  53. package/dist/persistence.d.ts.map +1 -0
  54. package/dist/persistence.js +17 -0
  55. package/dist/persistence.js.map +1 -0
  56. package/dist/persistent-agent.d.ts +80 -0
  57. package/dist/persistent-agent.d.ts.map +1 -0
  58. package/dist/persistent-agent.js +69 -0
  59. package/dist/persistent-agent.js.map +1 -0
  60. package/dist/pi-loop-runtime.d.ts.map +1 -1
  61. package/dist/pi-loop-runtime.js +9 -3
  62. package/dist/pi-loop-runtime.js.map +1 -1
  63. package/dist/profile.d.ts +33 -0
  64. package/dist/profile.d.ts.map +1 -0
  65. package/dist/profile.js +10 -0
  66. package/dist/profile.js.map +1 -0
  67. package/dist/providers.d.ts +14 -0
  68. package/dist/providers.d.ts.map +1 -1
  69. package/dist/providers.js +18 -1
  70. package/dist/providers.js.map +1 -1
  71. package/dist/result.d.ts +12 -0
  72. package/dist/result.d.ts.map +1 -1
  73. package/dist/result.js +26 -0
  74. package/dist/result.js.map +1 -1
  75. package/dist/retrieval.d.ts +61 -0
  76. package/dist/retrieval.d.ts.map +1 -0
  77. package/dist/retrieval.js +26 -0
  78. package/dist/retrieval.js.map +1 -0
  79. package/dist/runtime-mode.d.ts +1 -1
  80. package/dist/runtime-mode.d.ts.map +1 -1
  81. package/dist/runtime-mode.js +2 -1
  82. package/dist/runtime-mode.js.map +1 -1
  83. package/dist/scope-key.d.ts +25 -0
  84. package/dist/scope-key.d.ts.map +1 -0
  85. package/dist/scope-key.js +34 -0
  86. package/dist/scope-key.js.map +1 -0
  87. package/dist/session.d.ts +40 -1
  88. package/dist/session.d.ts.map +1 -1
  89. package/dist/session.js +308 -34
  90. package/dist/session.js.map +1 -1
  91. package/dist/skills.d.ts +33 -0
  92. package/dist/skills.d.ts.map +1 -0
  93. package/dist/skills.js +65 -0
  94. package/dist/skills.js.map +1 -0
  95. package/dist/store.d.ts +36 -1
  96. package/dist/store.d.ts.map +1 -1
  97. package/dist/store.js +83 -0
  98. package/dist/store.js.map +1 -1
  99. package/dist/stream-chunks.d.ts +42 -0
  100. package/dist/stream-chunks.d.ts.map +1 -0
  101. package/dist/stream-chunks.js +138 -0
  102. package/dist/stream-chunks.js.map +1 -0
  103. package/dist/strict.d.ts +21 -11
  104. package/dist/strict.d.ts.map +1 -1
  105. package/dist/strict.js +11 -6
  106. package/dist/strict.js.map +1 -1
  107. package/dist/tools.d.ts +32 -4
  108. package/dist/tools.d.ts.map +1 -1
  109. package/dist/tools.js +132 -6
  110. package/dist/tools.js.map +1 -1
  111. package/dist/types.d.ts +110 -3
  112. package/dist/types.d.ts.map +1 -1
  113. package/dist/types.js.map +1 -1
  114. package/package.json +14 -10
@@ -1,6 +1,7 @@
1
1
  import type { FabricContext, JsonObject, Skill } from './types.js';
2
2
  import type { Schema } from './schema.js';
3
3
  import type { WebhookSubscriptionDefinition } from './webhook-subscription.js';
4
+ import type { ToolDef } from './tools.js';
4
5
  export interface AgentTriggers {
5
6
  webhook?: boolean;
6
7
  schedule?: string | string[];
@@ -10,12 +11,17 @@ export interface AgentTriggers {
10
11
  export interface AgentDefinition<TInput = JsonObject, TOutput = unknown> {
11
12
  name?: string;
12
13
  description?: string;
14
+ instructions?: string;
13
15
  input?: Schema<TInput>;
14
16
  output?: Schema<TOutput>;
15
17
  model?: string;
16
18
  target?: 'node' | 'temporal-worker';
17
19
  skills?: Skill[];
20
+ tools?: ToolDef[];
18
21
  triggers?: AgentTriggers;
22
+ policy?: import('./policy.js').CapabilityPolicy;
23
+ costBudget?: import('./cost-budget.js').CostLimit;
24
+ approvals?: import('./types.js').ApprovalOptions;
19
25
  /**
20
26
  * Webhook subscription definitions. Each subscription gets its own HTTP
21
27
  * route (`/agents/<name>/subscriptions/<id>`) on `fh server` and wakes the
@@ -1 +1 @@
1
- {"version":3,"file":"agent-definition.d.ts","sourceRoot":"","sources":["../src/agent-definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,aAAa,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AA4B/E,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,GAAG,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,eAAe,CAAC,MAAM,GAAG,UAAU,EAAE,OAAO,GAAG,OAAO;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACpC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,6BAA6B,CAAC,OAAO,CAAC,EAAE,CAAC;IACzD,GAAG,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CACzF;AAED,QAAA,MAAM,gBAAgB,eAAgD,CAAC;AAEvE,MAAM,MAAM,YAAY,CAAC,MAAM,GAAG,UAAU,EAAE,OAAO,GAAG,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG;IACpI,QAAQ,CAAC,CAAC,gBAAgB,CAAC,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9D,QAAQ,CAAC,aAAa,CAAC,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3D,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,MAAM,GAAG,UAAU,EAAE,OAAO,GAAG,OAAO,EAAE,UAAU,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBzI;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAIhG;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,GAAG,UAAU,EAAE,OAAO,GAAG,OAAO,EACtE,UAAU,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3C,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAkB/B"}
1
+ {"version":3,"file":"agent-definition.d.ts","sourceRoot":"","sources":["../src/agent-definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,aAAa,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AAE/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AA6B1C,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,GAAG,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,eAAe,CAAC,MAAM,GAAG,UAAU,EAAE,OAAO,GAAG,OAAO;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACpC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,aAAa,EAAE,gBAAgB,CAAC;IAChD,UAAU,CAAC,EAAE,OAAO,kBAAkB,EAAE,SAAS,CAAC;IAClD,SAAS,CAAC,EAAE,OAAO,YAAY,EAAE,eAAe,CAAC;IACjD;;;;;OAKG;IACH,aAAa,CAAC,EAAE,6BAA6B,CAAC,OAAO,CAAC,EAAE,CAAC;IACzD,GAAG,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CACzF;AAED,QAAA,MAAM,gBAAgB,eAAgD,CAAC;AAEvE,MAAM,MAAM,YAAY,CAAC,MAAM,GAAG,UAAU,EAAE,OAAO,GAAG,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG;IACpI,QAAQ,CAAC,CAAC,gBAAgB,CAAC,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9D,QAAQ,CAAC,aAAa,CAAC,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3D,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,MAAM,GAAG,UAAU,EAAE,OAAO,GAAG,OAAO,EAAE,UAAU,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBzI;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAIhG;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,GAAG,UAAU,EAAE,OAAO,GAAG,OAAO,EACtE,UAAU,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3C,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAkB/B"}
@@ -1,14 +1,15 @@
1
1
  import { getLogger } from './logger.js';
2
- import { createPiAgentLoopRuntime } from './pi-loop-runtime.js';
3
2
  /**
4
3
  * Lazy singleton: the bare-import default loop runtime is `pi-agent-core`.
5
4
  * Constructed on first defaults-injecting `init()` so users who only import
6
5
  * from `/strict` don't pay the construction cost.
7
6
  */
8
7
  let _defaultLoopRuntime;
9
- function getDefaultLoopRuntime() {
10
- if (!_defaultLoopRuntime)
8
+ async function getDefaultLoopRuntime() {
9
+ if (!_defaultLoopRuntime) {
10
+ const { createPiAgentLoopRuntime } = await import('./pi-loop-runtime.js');
11
11
  _defaultLoopRuntime = createPiAgentLoopRuntime();
12
+ }
12
13
  return _defaultLoopRuntime;
13
14
  }
14
15
  /** One-shot Temporal-on-bare-path warning (suppressed in production builds). */
@@ -81,7 +82,7 @@ export function agentWithDefaults(definition) {
81
82
  ...init,
82
83
  runtime: init.runtime ?? 'stateless',
83
84
  sandbox: init.sandbox ?? 'virtual',
84
- loopRuntime: init.loopRuntime ?? getDefaultLoopRuntime(),
85
+ loopRuntime: init.loopRuntime ?? (await getDefaultLoopRuntime()),
85
86
  compaction: init.compaction ?? { enabled: true },
86
87
  });
87
88
  },
@@ -1 +1 @@
1
- {"version":3,"file":"agent-definition.js","sourceRoot":"","sources":["../src/agent-definition.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-definition.js","sourceRoot":"","sources":["../src/agent-definition.ts"],"names":[],"mappings":"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"}
package/dist/agent.d.ts CHANGED
@@ -1,12 +1,18 @@
1
+ import type { FabricFs } from './filesystem.js';
1
2
  import { StubFabricSession } from './session.js';
3
+ import type { ThinkingLevel } from './model.js';
2
4
  import type { AgentInit, FabricAgent, FabricRuntime, Role, SessionOptions } from './types.js';
3
5
  export declare class StubFabricAgent implements FabricAgent {
4
6
  private readonly options;
5
7
  readonly id: string;
6
8
  readonly model?: string;
9
+ readonly thinkingLevel?: ThinkingLevel;
7
10
  readonly role?: string | Role;
8
11
  readonly runtime: FabricRuntime;
12
+ readonly fs: FabricFs;
13
+ private defaultFsSession;
9
14
  constructor(options?: AgentInit);
15
+ private getDefaultFsSession;
10
16
  session(id?: string, options?: SessionOptions): Promise<StubFabricSession>;
11
17
  }
12
18
  export declare function init(options?: AgentInit): Promise<FabricAgent>;
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAa9F,qBAAa,eAAgB,YAAW,WAAW;IAMrC,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;gBAEH,OAAO,GAAE,SAAc;IAsB9C,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA4ErF;AAED,wBAAsB,IAAI,CAAC,OAAO,GAAE,SAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAExE"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAa9F,qBAAa,eAAgB,YAAW,WAAW;IASrC,OAAO,CAAC,QAAQ,CAAC,OAAO;IARpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,OAAO,CAAC,gBAAgB,CAAyC;gBAEpC,OAAO,GAAE,SAAc;YA8BtC,mBAAmB;IAO3B,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA4FrF;AAED,wBAAsB,IAAI,CAAC,OAAO,GAAE,SAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAYxE"}
package/dist/agent.js CHANGED
@@ -1,3 +1,5 @@
1
+ import { createFabricFs } from './filesystem.js';
2
+ import { FabricError } from './error.js';
1
3
  import { getLogger } from './logger.js';
2
4
  import { resolveRuntimeMode } from './runtime-mode.js';
3
5
  import { StubFabricSession } from './session.js';
@@ -16,20 +18,30 @@ export class StubFabricAgent {
16
18
  options;
17
19
  id;
18
20
  model;
21
+ thinkingLevel;
19
22
  role;
20
23
  runtime;
24
+ fs;
25
+ defaultFsSession;
21
26
  constructor(options = {}) {
22
27
  this.options = options;
23
28
  this.id = options.id ?? `agent-${generateId()}`;
24
29
  if (typeof options.model === 'string') {
25
30
  this.model = options.model;
26
31
  }
32
+ if (options.thinkingLevel !== undefined) {
33
+ this.thinkingLevel = options.thinkingLevel;
34
+ }
27
35
  if (options.role !== undefined) {
28
36
  this.role = options.role;
29
37
  }
38
+ if (options.store !== undefined && options.persistence !== undefined) {
39
+ throw new FabricError({ code: 'INVALID_CONFIG', message: 'Cannot provide both `store` and `persistence` to agent init. Use one or the other.' });
40
+ }
30
41
  const resolved = resolveRuntimeMode({
31
42
  ...(options.runtime !== undefined ? { runtime: options.runtime } : {}),
32
43
  ...(options.store !== undefined ? { store: options.store } : {}),
44
+ ...(options.persistence !== undefined ? { persistence: options.persistence } : {}),
33
45
  });
34
46
  this.runtime = resolved.runtime;
35
47
  if (resolved.warnings.length > 0) {
@@ -40,6 +52,13 @@ export class StubFabricAgent {
40
52
  if (resolved.runtime === 'stateless' && this.options.store === undefined) {
41
53
  this.options = { ...this.options, store: noopSessionStore };
42
54
  }
55
+ this.fs = createFabricFs(async () => (await this.getDefaultFsSession()).sandbox);
56
+ }
57
+ async getDefaultFsSession() {
58
+ if (!this.defaultFsSession) {
59
+ this.defaultFsSession = this.session(`${this.id}-fs`);
60
+ }
61
+ return this.defaultFsSession;
43
62
  }
44
63
  async session(id, options = {}) {
45
64
  const sessionId = id ?? options.id ?? `session-${generateId()}`;
@@ -59,6 +78,9 @@ export class StubFabricAgent {
59
78
  if (sessionOptions.skills === undefined && this.options.skills !== undefined) {
60
79
  sessionOptions.skills = this.options.skills;
61
80
  }
81
+ if (sessionOptions.packagedSkills === undefined && this.options.packagedSkills !== undefined) {
82
+ sessionOptions.packagedSkills = this.options.packagedSkills;
83
+ }
62
84
  if (sessionOptions.role === undefined && this.options.role !== undefined) {
63
85
  sessionOptions.role = this.options.role;
64
86
  }
@@ -74,9 +96,15 @@ export class StubFabricAgent {
74
96
  if (sessionOptions.store === undefined && this.options.store !== undefined) {
75
97
  sessionOptions.store = this.options.store;
76
98
  }
99
+ if (sessionOptions.persistence === undefined && this.options.persistence !== undefined) {
100
+ sessionOptions.persistence = this.options.persistence;
101
+ }
77
102
  if (sessionOptions.model === undefined && this.options.model !== undefined) {
78
103
  sessionOptions.model = this.options.model;
79
104
  }
105
+ if (sessionOptions.thinkingLevel === undefined && this.options.thinkingLevel !== undefined) {
106
+ sessionOptions.thinkingLevel = this.options.thinkingLevel;
107
+ }
80
108
  if (sessionOptions.modelProvider === undefined && this.options.modelProvider !== undefined) {
81
109
  sessionOptions.modelProvider = this.options.modelProvider;
82
110
  }
@@ -113,10 +141,26 @@ export class StubFabricAgent {
113
141
  if (sessionOptions.memory === undefined && this.options.memory !== undefined) {
114
142
  sessionOptions.memory = this.options.memory;
115
143
  }
144
+ if (sessionOptions.store !== undefined && sessionOptions.persistence !== undefined) {
145
+ throw new FabricError({ code: 'INVALID_CONFIG', message: 'Cannot provide both `store` and `persistence` to session(). Use one or the other.' });
146
+ }
147
+ if (sessionOptions.persistence) {
148
+ sessionOptions.store = await sessionOptions.persistence.connect();
149
+ }
116
150
  return new StubFabricSession(this, sessionId, sessionOptions);
117
151
  }
118
152
  }
119
153
  export async function init(options = {}) {
120
- return new StubFabricAgent(options);
154
+ if (options.store !== undefined && options.persistence !== undefined) {
155
+ throw new FabricError({ code: 'INVALID_CONFIG', message: 'Cannot provide both `store` and `persistence` to init(). Use one or the other.' });
156
+ }
157
+ let resolvedOptions = options;
158
+ if (options.persistence) {
159
+ const store = await options.persistence.connect();
160
+ // Omit `persistence` rather than set it to undefined (exactOptionalPropertyTypes).
161
+ const { persistence: _persistence, ...rest } = options;
162
+ resolvedOptions = { ...rest, store };
163
+ }
164
+ return new StubFabricAgent(resolvedOptions);
121
165
  }
122
166
  //# sourceMappingURL=agent.js.map
package/dist/agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import type { DispatchReceipt } from './dispatch.js';
2
+ import type { FabricActor } from './types.js';
3
+ /**
4
+ * Channels turn platform webhooks (Slack, GitHub, …) into agent dispatches. Handlers are written
5
+ * against the Web `Request`/`Response` API and `crypto.subtle`, so the same channel runs on Node and
6
+ * Cloudflare. A channel is a stateless route container plus a conversation-id (de)serializer —
7
+ * session continuity falls out of the key (same thread → same key → same session).
8
+ */
9
+ export interface ChannelRoute {
10
+ /** HTTP method, uppercase (e.g. "POST"). */
11
+ method: string;
12
+ /** Absolute path suffix mounted under `/channels/:name` (e.g. "/events"). */
13
+ path: string;
14
+ handler: (request: Request, context: ChannelContext) => Promise<Response> | Response;
15
+ }
16
+ export interface Channel {
17
+ /** Optional stable name; the mount name usually comes from the file/registration. */
18
+ readonly name?: string;
19
+ readonly routes: readonly ChannelRoute[];
20
+ /** Serialize a platform reference (e.g. a Slack thread) into a stable instance id. */
21
+ conversationKey(ref: unknown): string;
22
+ /** Parse an instance id back into the platform reference. */
23
+ parseConversationKey(id: string): unknown;
24
+ }
25
+ export interface ChannelDispatchRequest {
26
+ /** Target persistent-agent instance id — typically `channel.conversationKey(ref)`. */
27
+ instanceId: string;
28
+ session?: string;
29
+ input: unknown;
30
+ /** Stable key (e.g. the platform event id) → `dispatchId` for exactly-once delivery. */
31
+ dedupeKey?: string;
32
+ tenantId?: string;
33
+ actor?: FabricActor;
34
+ }
35
+ export type ChannelDispatch = (agent: string, request: ChannelDispatchRequest) => Promise<DispatchReceipt>;
36
+ export interface ChannelContext {
37
+ /** Dispatch to a persistent agent. Provided by the runtime mounting the channel. */
38
+ dispatch: ChannelDispatch;
39
+ env: Record<string, string | undefined>;
40
+ }
41
+ /** Validates and brands a channel's routes. */
42
+ export declare function defineChannel(channel: Channel): Channel;
43
+ export declare function hmacSha256(secret: string | Uint8Array, message: Uint8Array): Promise<Uint8Array>;
44
+ /** Constant-time HMAC-SHA256 verification (via `crypto.subtle.verify`). */
45
+ export declare function verifyHmacSha256(secret: string | Uint8Array, message: Uint8Array, signature: Uint8Array): Promise<boolean>;
46
+ export declare function bytesToHex(bytes: Uint8Array): string;
47
+ export declare function hexToBytes(hex: string): Uint8Array;
48
+ export declare function conversationKey(provider: string, version: string, ...segments: string[]): string;
49
+ export interface ParsedConversationKey {
50
+ provider: string;
51
+ version: string;
52
+ segments: string[];
53
+ }
54
+ export declare function parseConversationKey(key: string): ParsedConversationKey;
55
+ /**
56
+ * Reads the full request body as bytes, or returns undefined if it exceeds `limitBytes`.
57
+ *
58
+ * NOTE: this consumes the request stream (single read). Signature-verifying channels need the *exact*
59
+ * bytes for HMAC and the parsed JSON afterward — don't call `request.json()` as well. Use
60
+ * {@link readJsonBody} to get both from one read.
61
+ */
62
+ export declare function readRequestBody(request: Request, limitBytes?: number): Promise<Uint8Array | undefined>;
63
+ export interface RequestBody {
64
+ /** Exact bytes — use these (or `text`) for signature verification. */
65
+ raw: Uint8Array;
66
+ /** UTF-8 decode of `raw`. */
67
+ text: string;
68
+ /** Parsed JSON, or `undefined` if the body isn't valid JSON. */
69
+ json: unknown;
70
+ }
71
+ /**
72
+ * Reads the body once and returns the raw bytes, the decoded text, and the parsed JSON together — so a
73
+ * channel can HMAC-verify the exact bytes and use the JSON without re-reading the (already consumed)
74
+ * stream. Returns undefined only when the body exceeds `limitBytes`.
75
+ */
76
+ export declare function readJsonBody(request: Request, limitBytes?: number): Promise<RequestBody | undefined>;
77
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ const METHOD_RE = /^[A-Z]+$/;
2
+ /** Validates and brands a channel's routes. */
3
+ export function defineChannel(channel) {
4
+ if (!Array.isArray(channel.routes) || channel.routes.length === 0) {
5
+ throw new Error('defineChannel: a channel must declare at least one route.');
6
+ }
7
+ const seen = new Set();
8
+ for (const route of channel.routes) {
9
+ if (!METHOD_RE.test(route.method))
10
+ throw new Error(`defineChannel: route method "${route.method}" must be uppercase letters.`);
11
+ if (!route.path.startsWith('/') || route.path.startsWith('//') || route.path.includes('?') || route.path.includes('#')) {
12
+ throw new Error(`defineChannel: route path "${route.path}" must be an absolute suffix without query or fragment.`);
13
+ }
14
+ const key = `${route.method} ${route.path}`;
15
+ if (seen.has(key))
16
+ throw new Error(`defineChannel: duplicate route "${key}".`);
17
+ seen.add(key);
18
+ }
19
+ return channel;
20
+ }
21
+ // ---------------------------------------------------------------------------
22
+ // Web-standard crypto helpers (HMAC-SHA256) — run identically on Node and edge.
23
+ // ---------------------------------------------------------------------------
24
+ const encoder = new TextEncoder();
25
+ function toBytes(value) {
26
+ return typeof value === 'string' ? encoder.encode(value) : value;
27
+ }
28
+ function viewToBuffer(bytes) {
29
+ return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
30
+ }
31
+ export async function hmacSha256(secret, message) {
32
+ const key = await crypto.subtle.importKey('raw', viewToBuffer(toBytes(secret)), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
33
+ const signature = await crypto.subtle.sign('HMAC', key, viewToBuffer(message));
34
+ return new Uint8Array(signature);
35
+ }
36
+ /** Constant-time HMAC-SHA256 verification (via `crypto.subtle.verify`). */
37
+ export async function verifyHmacSha256(secret, message, signature) {
38
+ try {
39
+ const key = await crypto.subtle.importKey('raw', viewToBuffer(toBytes(secret)), { name: 'HMAC', hash: 'SHA-256' }, false, ['verify']);
40
+ return await crypto.subtle.verify('HMAC', key, viewToBuffer(signature), viewToBuffer(message));
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ export function bytesToHex(bytes) {
47
+ let hex = '';
48
+ for (const byte of bytes)
49
+ hex += byte.toString(16).padStart(2, '0');
50
+ return hex;
51
+ }
52
+ export function hexToBytes(hex) {
53
+ const clean = hex.startsWith('0x') ? hex.slice(2) : hex;
54
+ if (clean.length % 2 !== 0)
55
+ throw new Error('hexToBytes: odd-length hex string.');
56
+ const bytes = new Uint8Array(clean.length / 2);
57
+ for (let i = 0; i < bytes.length; i += 1)
58
+ bytes[i] = Number.parseInt(clean.slice(i * 2, i * 2 + 2), 16);
59
+ return bytes;
60
+ }
61
+ // ---------------------------------------------------------------------------
62
+ // Conversation key encoding — `provider:version:seg1:seg2:...` with url-safe segments.
63
+ // ---------------------------------------------------------------------------
64
+ export function conversationKey(provider, version, ...segments) {
65
+ if (provider.includes(':') || version.includes(':'))
66
+ throw new Error('conversationKey: provider/version must not contain ":".');
67
+ return [provider, version, ...segments.map(encodeURIComponent)].join(':');
68
+ }
69
+ export function parseConversationKey(key) {
70
+ const parts = key.split(':');
71
+ if (parts.length < 2)
72
+ throw new Error(`parseConversationKey: invalid key "${key}".`);
73
+ const [provider, version, ...rest] = parts;
74
+ return { provider, version, segments: rest.map(decodeURIComponent) };
75
+ }
76
+ // ---------------------------------------------------------------------------
77
+ // Request body — read with a size guard (signature verification needs exact bytes).
78
+ // ---------------------------------------------------------------------------
79
+ const DEFAULT_BODY_LIMIT = 1_000_000;
80
+ /**
81
+ * Reads the full request body as bytes, or returns undefined if it exceeds `limitBytes`.
82
+ *
83
+ * NOTE: this consumes the request stream (single read). Signature-verifying channels need the *exact*
84
+ * bytes for HMAC and the parsed JSON afterward — don't call `request.json()` as well. Use
85
+ * {@link readJsonBody} to get both from one read.
86
+ */
87
+ export async function readRequestBody(request, limitBytes = DEFAULT_BODY_LIMIT) {
88
+ const contentLength = request.headers.get('content-length');
89
+ if (contentLength && Number(contentLength) > limitBytes)
90
+ return undefined;
91
+ const buffer = new Uint8Array(await request.arrayBuffer());
92
+ if (buffer.byteLength > limitBytes)
93
+ return undefined;
94
+ return buffer;
95
+ }
96
+ /**
97
+ * Reads the body once and returns the raw bytes, the decoded text, and the parsed JSON together — so a
98
+ * channel can HMAC-verify the exact bytes and use the JSON without re-reading the (already consumed)
99
+ * stream. Returns undefined only when the body exceeds `limitBytes`.
100
+ */
101
+ export async function readJsonBody(request, limitBytes = DEFAULT_BODY_LIMIT) {
102
+ const raw = await readRequestBody(request, limitBytes);
103
+ if (!raw)
104
+ return undefined;
105
+ const text = new TextDecoder().decode(raw);
106
+ let json;
107
+ try {
108
+ json = JSON.parse(text);
109
+ }
110
+ catch {
111
+ json = undefined;
112
+ }
113
+ return { raw, text, json };
114
+ }
115
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"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"}
@@ -6,15 +6,31 @@ export interface ContextBudget {
6
6
  reserveTokens: number;
7
7
  compactAtTokens?: number;
8
8
  shouldCompact: boolean;
9
+ keepRecentTokens?: number;
9
10
  }
10
11
  export interface ContextBudgetOptions {
11
12
  contextWindowTokens?: number;
12
13
  compactAtTokens?: number;
13
14
  reserveTokens?: number;
15
+ keepRecentTokens?: number;
14
16
  }
15
17
  export declare function estimateTextTokens(text: string): number;
16
18
  export declare function estimateModelMessagesTokens(messages: ModelMessage[]): number;
19
+ export declare function estimateSessionEntryTokens(entry: SessionEntry): number;
17
20
  export declare function estimateSessionEntriesTokens(entries: SessionEntry[]): number;
21
+ /**
22
+ * Compute model-aware compaction defaults. Reserve is capped at the model's
23
+ * max output because reserving more than the model can emit in one turn
24
+ * wastes context; the preserved tail stays flat because recent-context
25
+ * fidelity depends on the active work, not on the model's total window size.
26
+ */
27
+ export declare function deriveCompactionDefaults(input: {
28
+ contextWindowTokens: number;
29
+ maxOutputTokens?: number;
30
+ }): {
31
+ reserveTokens: number;
32
+ keepRecentTokens: number;
33
+ };
18
34
  export declare function evaluateContextBudget(messages: ModelMessage[], options?: ContextBudgetOptions): ContextBudget;
19
35
  export declare function isContextOverflowError(error: unknown): boolean;
20
36
  //# sourceMappingURL=context-budget.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context-budget.d.ts","sourceRoot":"","sources":["../src/context-budget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAE5E;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAE5E;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAWjH;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAG9D"}
1
+ {"version":3,"file":"context-budget.d.ts","sourceRoot":"","sources":["../src/context-budget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAKD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAE5E;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAEtE;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAE5E;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAatD;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAuBjH;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAG9D"}
@@ -1,16 +1,50 @@
1
- const DEFAULT_RESERVE_TOKENS = 4096;
1
+ const DEFAULT_RESERVE_TOKENS = 20_000;
2
+ const DEFAULT_KEEP_RECENT_TOKENS = 8_000;
2
3
  export function estimateTextTokens(text) {
3
4
  return Math.ceil(text.length / 4);
4
5
  }
5
6
  export function estimateModelMessagesTokens(messages) {
6
7
  return messages.reduce((sum, message) => sum + estimateTextTokens(message.content) + 8, 0);
7
8
  }
9
+ export function estimateSessionEntryTokens(entry) {
10
+ return estimateTextTokens(JSON.stringify({ type: entry.type, data: entry.data ?? {} })) + 8;
11
+ }
8
12
  export function estimateSessionEntriesTokens(entries) {
9
- return entries.reduce((sum, entry) => sum + estimateTextTokens(JSON.stringify({ type: entry.type, data: entry.data ?? {} })) + 8, 0);
13
+ return entries.reduce((sum, entry) => sum + estimateSessionEntryTokens(entry), 0);
14
+ }
15
+ /**
16
+ * Compute model-aware compaction defaults. Reserve is capped at the model's
17
+ * max output because reserving more than the model can emit in one turn
18
+ * wastes context; the preserved tail stays flat because recent-context
19
+ * fidelity depends on the active work, not on the model's total window size.
20
+ */
21
+ export function deriveCompactionDefaults(input) {
22
+ const reserveCap = input.maxOutputTokens !== undefined && input.maxOutputTokens > 0
23
+ ? input.maxOutputTokens
24
+ : DEFAULT_RESERVE_TOKENS;
25
+ let reserveTokens = Math.min(DEFAULT_RESERVE_TOKENS, reserveCap);
26
+ if (input.contextWindowTokens > 0 && reserveTokens * 2 >= input.contextWindowTokens) {
27
+ reserveTokens = Math.max(1024, Math.floor(input.contextWindowTokens / 3));
28
+ }
29
+ return {
30
+ reserveTokens,
31
+ keepRecentTokens: DEFAULT_KEEP_RECENT_TOKENS,
32
+ };
10
33
  }
11
34
  export function evaluateContextBudget(messages, options = {}) {
12
35
  const estimatedTokens = estimateModelMessagesTokens(messages);
13
- const reserveTokens = options.reserveTokens ?? DEFAULT_RESERVE_TOKENS;
36
+ let reserveTokens;
37
+ if (options.reserveTokens !== undefined) {
38
+ reserveTokens = options.reserveTokens;
39
+ }
40
+ else if (options.contextWindowTokens !== undefined) {
41
+ const defaults = deriveCompactionDefaults({ contextWindowTokens: options.contextWindowTokens });
42
+ reserveTokens = defaults.reserveTokens;
43
+ }
44
+ else {
45
+ reserveTokens = DEFAULT_RESERVE_TOKENS;
46
+ }
47
+ const keepRecentTokens = options.keepRecentTokens ?? DEFAULT_KEEP_RECENT_TOKENS;
14
48
  const compactAtTokens = options.compactAtTokens ?? (options.contextWindowTokens ? Math.max(0, options.contextWindowTokens - reserveTokens) : undefined);
15
49
  return {
16
50
  estimatedTokens,
@@ -18,6 +52,7 @@ export function evaluateContextBudget(messages, options = {}) {
18
52
  ...(options.contextWindowTokens !== undefined ? { contextWindowTokens: options.contextWindowTokens } : {}),
19
53
  ...(compactAtTokens !== undefined ? { compactAtTokens } : {}),
20
54
  shouldCompact: compactAtTokens !== undefined && estimatedTokens >= compactAtTokens,
55
+ keepRecentTokens,
21
56
  };
22
57
  }
23
58
  export function isContextOverflowError(error) {
@@ -1 +1 @@
1
- {"version":3,"file":"context-budget.js","sourceRoot":"","sources":["../src/context-budget.ts"],"names":[],"mappings":"AAiBA,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,QAAwB;IAClE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAAuB;IAClE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACvI,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAwB,EAAE,UAAgC,EAAE;IAChG,MAAM,eAAe,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,sBAAsB,CAAC;IACtE,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,mBAAmB,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACxJ,OAAO;QACL,eAAe;QACf,aAAa;QACb,GAAG,CAAC,OAAO,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1G,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,aAAa,EAAE,eAAe,KAAK,SAAS,IAAI,eAAe,IAAI,eAAe;KACnF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,yGAAyG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjI,CAAC"}
1
+ {"version":3,"file":"context-budget.js","sourceRoot":"","sources":["../src/context-budget.ts"],"names":[],"mappings":"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"}