@smooai/smooth-operator-core 0.9.0 → 0.10.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.
Files changed (85) hide show
  1. package/dist/agent.d.ts +276 -0
  2. package/dist/agent.d.ts.map +1 -0
  3. package/dist/agent.js +450 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/cast.d.ts +81 -0
  6. package/dist/cast.d.ts.map +1 -0
  7. package/dist/cast.js +103 -0
  8. package/dist/cast.js.map +1 -0
  9. package/dist/checkpoint.d.ts +25 -0
  10. package/dist/checkpoint.d.ts.map +1 -0
  11. package/dist/checkpoint.js +23 -0
  12. package/dist/checkpoint.js.map +1 -0
  13. package/dist/compaction.d.ts +21 -0
  14. package/dist/compaction.d.ts.map +1 -0
  15. package/dist/compaction.js +50 -0
  16. package/dist/compaction.js.map +1 -0
  17. package/dist/cost.d.ts +34 -0
  18. package/dist/cost.d.ts.map +1 -0
  19. package/dist/cost.js +42 -0
  20. package/dist/cost.js.map +1 -0
  21. package/dist/extension/host.d.ts +199 -0
  22. package/dist/extension/host.d.ts.map +1 -0
  23. package/dist/extension/host.js +502 -0
  24. package/dist/extension/host.js.map +1 -0
  25. package/dist/extension/index.d.ts +36 -0
  26. package/dist/extension/index.d.ts.map +1 -0
  27. package/dist/extension/index.js +37 -0
  28. package/dist/extension/index.js.map +1 -0
  29. package/dist/extension/manifest.d.ts +111 -0
  30. package/dist/extension/manifest.d.ts.map +1 -0
  31. package/dist/extension/manifest.js +190 -0
  32. package/dist/extension/manifest.js.map +1 -0
  33. package/dist/extension/process.d.ts +118 -0
  34. package/dist/extension/process.d.ts.map +1 -0
  35. package/dist/extension/process.js +352 -0
  36. package/dist/extension/process.js.map +1 -0
  37. package/dist/extension/protocol.d.ts +254 -0
  38. package/dist/extension/protocol.d.ts.map +1 -0
  39. package/dist/extension/protocol.js +127 -0
  40. package/dist/extension/protocol.js.map +1 -0
  41. package/dist/extension/tool_proxy.d.ts +34 -0
  42. package/dist/extension/tool_proxy.d.ts.map +1 -0
  43. package/dist/extension/tool_proxy.js +48 -0
  44. package/dist/extension/tool_proxy.js.map +1 -0
  45. package/dist/humanGate.d.ts +44 -0
  46. package/dist/humanGate.d.ts.map +1 -0
  47. package/dist/humanGate.js +30 -0
  48. package/dist/humanGate.js.map +1 -0
  49. package/dist/index.d.ts +32 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +21 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/knowledge.d.ts +30 -0
  54. package/dist/knowledge.d.ts.map +1 -0
  55. package/dist/knowledge.js +43 -0
  56. package/dist/knowledge.js.map +1 -0
  57. package/dist/llmProvider.d.ts +106 -0
  58. package/dist/llmProvider.d.ts.map +1 -0
  59. package/dist/llmProvider.js +160 -0
  60. package/dist/llmProvider.js.map +1 -0
  61. package/dist/memory.d.ts +23 -0
  62. package/dist/memory.d.ts.map +1 -0
  63. package/dist/memory.js +40 -0
  64. package/dist/memory.js.map +1 -0
  65. package/dist/rerank.d.ts +27 -0
  66. package/dist/rerank.d.ts.map +1 -0
  67. package/dist/rerank.js +45 -0
  68. package/dist/rerank.js.map +1 -0
  69. package/dist/thread.d.ts +43 -0
  70. package/dist/thread.d.ts.map +1 -0
  71. package/dist/thread.js +60 -0
  72. package/dist/thread.js.map +1 -0
  73. package/dist/toolSearch.d.ts +55 -0
  74. package/dist/toolSearch.d.ts.map +1 -0
  75. package/dist/toolSearch.js +110 -0
  76. package/dist/toolSearch.js.map +1 -0
  77. package/dist/vector.d.ts +36 -0
  78. package/dist/vector.d.ts.map +1 -0
  79. package/dist/vector.js +75 -0
  80. package/dist/vector.js.map +1 -0
  81. package/dist/workflow.d.ts +62 -0
  82. package/dist/workflow.d.ts.map +1 -0
  83. package/dist/workflow.js +109 -0
  84. package/dist/workflow.js.map +1 -0
  85. package/package.json +1 -1
package/dist/cast.js ADDED
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Multi-agent cast: roles and per-role tool-access policy.
3
+ *
4
+ * Phase-2 sibling of the C# reference (`dotnet/core/src/Cast.cs`) and the Rust
5
+ * engine. A *cast* is the set of named roles a lead can dispatch to; each role has
6
+ * a {@link RoleKind} (Lead / Sidekick / Shadow) and a {@link Clearance} that gates
7
+ * which tools it may call.
8
+ *
9
+ * {@link Clearance} semantics (mirrors the reference engines):
10
+ * - a **deny always wins** — a denied tool is never permitted;
11
+ * - a **non-empty allow-list is a whitelist** — only listed tools are permitted;
12
+ * - **empty allow + empty deny means "all tools"**.
13
+ *
14
+ * Clearance is wired into the agent loop: if `AgentOptions.clearance` forbids a
15
+ * tool the model asked for, that tool is *not* executed — a clear "not permitted"
16
+ * result is returned to the model instead, mirroring how the engine surfaces other
17
+ * tool errors.
18
+ */
19
+ /** A role's place in a multi-agent cast. Mirrors the reference engines' `RoleKind`. */
20
+ export var RoleKind;
21
+ (function (RoleKind) {
22
+ /** The orchestrator that delegates to sidekicks. */
23
+ RoleKind["Lead"] = "lead";
24
+ /** A focused specialist a lead can dispatch a sub-task to. */
25
+ RoleKind["Sidekick"] = "sidekick";
26
+ /** A passive observer (e.g. for logging/critique); not directly dispatchable. */
27
+ RoleKind["Shadow"] = "shadow";
28
+ })(RoleKind || (RoleKind = {}));
29
+ /**
30
+ * Tool-access policy for a role. A deny always wins; a non-empty `allowTools` is a
31
+ * whitelist; empty allow + empty deny means "all tools". `denyEverything` blocks
32
+ * every tool regardless of the lists.
33
+ */
34
+ export class Clearance {
35
+ allowTools;
36
+ denyTools;
37
+ denyEverything;
38
+ constructor(options = {}) {
39
+ this.allowTools = new Set(options.allowTools ?? []);
40
+ this.denyTools = new Set(options.denyTools ?? []);
41
+ this.denyEverything = options.denyEverything ?? false;
42
+ }
43
+ static allowAll() {
44
+ return new Clearance();
45
+ }
46
+ static denyAll() {
47
+ return new Clearance({ denyEverything: true });
48
+ }
49
+ static allow(...tools) {
50
+ return new Clearance({ allowTools: tools });
51
+ }
52
+ static deny(...tools) {
53
+ return new Clearance({ denyTools: tools });
54
+ }
55
+ /** Whether `tool` is permitted under this clearance. */
56
+ isAllowed(tool) {
57
+ if (this.denyEverything)
58
+ return false;
59
+ if (this.denyTools.has(tool))
60
+ return false;
61
+ if (this.allowTools.size > 0)
62
+ return this.allowTools.has(tool);
63
+ return true;
64
+ }
65
+ }
66
+ /** Build an {@link OperatorRole} with the reference-engine defaults applied. */
67
+ export function makeRole(name, kind, overrides = {}) {
68
+ return {
69
+ name,
70
+ kind,
71
+ instructions: overrides.instructions ?? '',
72
+ permissions: overrides.permissions ?? Clearance.allowAll(),
73
+ maxIterations: overrides.maxIterations ?? 8,
74
+ hidden: overrides.hidden ?? false,
75
+ };
76
+ }
77
+ /** The registered set of roles a lead can dispatch to. Mirrors the reference engines' `Cast`. */
78
+ export class Cast {
79
+ roles = new Map();
80
+ register(role) {
81
+ this.roles.set(role.name, role);
82
+ return this;
83
+ }
84
+ get(name) {
85
+ return this.roles.get(name);
86
+ }
87
+ list() {
88
+ return [...this.roles.values()];
89
+ }
90
+ listVisible() {
91
+ return this.list().filter((r) => !r.hidden);
92
+ }
93
+ sidekicks() {
94
+ return this.list().filter((r) => r.kind === RoleKind.Sidekick);
95
+ }
96
+ get count() {
97
+ return this.roles.size;
98
+ }
99
+ get isEmpty() {
100
+ return this.roles.size === 0;
101
+ }
102
+ }
103
+ //# sourceMappingURL=cast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cast.js","sourceRoot":"","sources":["../src/cast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Conversation checkpointing — persist a turn's state so it can resume.
3
+ *
4
+ * Phase-1 sibling of the reference engines' checkpointing. A `CheckpointStore`
5
+ * saves and loads the conversation (the non-system messages) keyed by a
6
+ * conversation id, so a later turn — even in a new process — can pick up where
7
+ * the last left off. `InMemoryCheckpointStore` is the zero-dependency default.
8
+ */
9
+ type Message = Record<string, unknown>;
10
+ export interface Checkpoint {
11
+ conversationId: string;
12
+ messages: Message[];
13
+ }
14
+ export interface CheckpointStore {
15
+ save(checkpoint: Checkpoint): void;
16
+ load(conversationId: string): Checkpoint | undefined;
17
+ }
18
+ /** A process-local checkpoint store backed by a Map. */
19
+ export declare class InMemoryCheckpointStore implements CheckpointStore {
20
+ private readonly store;
21
+ save(checkpoint: Checkpoint): void;
22
+ load(conversationId: string): Checkpoint | undefined;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=checkpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../src/checkpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEvC,MAAM,WAAW,UAAU;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC5B,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;CACxD;AAED,wDAAwD;AACxD,qBAAa,uBAAwB,YAAW,eAAe;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IAEvD,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAQlC,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;CAGvD"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Conversation checkpointing — persist a turn's state so it can resume.
3
+ *
4
+ * Phase-1 sibling of the reference engines' checkpointing. A `CheckpointStore`
5
+ * saves and loads the conversation (the non-system messages) keyed by a
6
+ * conversation id, so a later turn — even in a new process — can pick up where
7
+ * the last left off. `InMemoryCheckpointStore` is the zero-dependency default.
8
+ */
9
+ /** A process-local checkpoint store backed by a Map. */
10
+ export class InMemoryCheckpointStore {
11
+ store = new Map();
12
+ save(checkpoint) {
13
+ // Copy the messages so later mutation of the live list doesn't bleed in.
14
+ this.store.set(checkpoint.conversationId, {
15
+ conversationId: checkpoint.conversationId,
16
+ messages: checkpoint.messages.map((m) => ({ ...m })),
17
+ });
18
+ }
19
+ load(conversationId) {
20
+ return this.store.get(conversationId);
21
+ }
22
+ }
23
+ //# sourceMappingURL=checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../src/checkpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,wDAAwD;AACxD,MAAM,OAAO,uBAAuB;IACf,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEvD,IAAI,CAAC,UAAsB;QACvB,yEAAyE;QACzE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,EAAE;YACtC,cAAc,EAAE,UAAU,CAAC,cAAc;YACzC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;SACvD,CAAC,CAAC;IACP,CAAC;IAED,IAAI,CAAC,cAAsB;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC;CACJ"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Token-aware conversation compaction (sliding window).
3
+ *
4
+ * Phase-1 sibling of the reference engines' compaction. When a conversation's
5
+ * estimated token count exceeds a budget, drop the oldest non-system messages
6
+ * (keeping the system prompt and most recent turns) so the next model call stays
7
+ * within context. A coarse char/4 token estimate is used.
8
+ *
9
+ * Safety: the kept window never *starts* on a `tool` message (which would orphan
10
+ * a tool result whose preceding `assistant` tool_call was trimmed).
11
+ */
12
+ type Message = Record<string, unknown>;
13
+ export declare function estimateTokens(message: Message): number;
14
+ /**
15
+ * Return `messages` trimmed to roughly `maxTokens`, preserving system messages
16
+ * and the most recent turns. Returns the input unchanged when already within
17
+ * budget or when `maxTokens` is non-positive (disabled).
18
+ */
19
+ export declare function compact(messages: Message[], maxTokens: number): Message[];
20
+ export {};
21
+ //# sourceMappingURL=compaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../src/compaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEvC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAOvD;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,CAwBzE"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Token-aware conversation compaction (sliding window).
3
+ *
4
+ * Phase-1 sibling of the reference engines' compaction. When a conversation's
5
+ * estimated token count exceeds a budget, drop the oldest non-system messages
6
+ * (keeping the system prompt and most recent turns) so the next model call stays
7
+ * within context. A coarse char/4 token estimate is used.
8
+ *
9
+ * Safety: the kept window never *starts* on a `tool` message (which would orphan
10
+ * a tool result whose preceding `assistant` tool_call was trimmed).
11
+ */
12
+ const CHARS_PER_TOKEN = 4;
13
+ export function estimateTokens(message) {
14
+ let text = typeof message.content === 'string' ? message.content : '';
15
+ const toolCalls = message.tool_calls ?? [];
16
+ for (const tc of toolCalls) {
17
+ text += String(tc.function?.name ?? '') + String(tc.function?.arguments ?? '');
18
+ }
19
+ return Math.max(1, Math.ceil(text.length / CHARS_PER_TOKEN));
20
+ }
21
+ /**
22
+ * Return `messages` trimmed to roughly `maxTokens`, preserving system messages
23
+ * and the most recent turns. Returns the input unchanged when already within
24
+ * budget or when `maxTokens` is non-positive (disabled).
25
+ */
26
+ export function compact(messages, maxTokens) {
27
+ if (maxTokens <= 0)
28
+ return messages;
29
+ const system = messages.filter((m) => m.role === 'system');
30
+ const rest = messages.filter((m) => m.role !== 'system');
31
+ const systemTokens = system.reduce((sum, m) => sum + estimateTokens(m), 0);
32
+ const total = systemTokens + rest.reduce((sum, m) => sum + estimateTokens(m), 0);
33
+ if (total <= maxTokens)
34
+ return messages;
35
+ const budget = maxTokens - systemTokens;
36
+ const kept = [];
37
+ let running = 0;
38
+ for (let i = rest.length - 1; i >= 0; i--) {
39
+ const t = estimateTokens(rest[i]);
40
+ if (running + t > budget && kept.length > 0)
41
+ break;
42
+ kept.unshift(rest[i]);
43
+ running += t;
44
+ }
45
+ // Never start the kept window on an orphaned tool result.
46
+ while (kept.length > 0 && kept[0].role === 'tool')
47
+ kept.shift();
48
+ return [...system, ...kept];
49
+ }
50
+ //# sourceMappingURL=compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction.js","sourceRoot":"","sources":["../src/compaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,eAAe,GAAG,CAAC,CAAC;AAI1B,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC3C,IAAI,IAAI,GAAG,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,MAAM,SAAS,GAAI,OAAO,CAAC,UAAsF,IAAI,EAAE,CAAC;IACxH,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QACzB,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;AACjE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,QAAmB,EAAE,SAAiB;IAC1D,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEpC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAEzD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjF,IAAI,KAAK,IAAI,SAAS;QAAE,OAAO,QAAQ,CAAC;IAExC,MAAM,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;IACxC,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,OAAO,GAAG,CAAC,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM;QACnD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC,CAAC;IACjB,CAAC;IAED,0DAA0D;IAC1D,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM;QAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAEhE,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;AAChC,CAAC"}
package/dist/cost.d.ts ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Token-usage accounting and budget enforcement.
3
+ *
4
+ * Phase-1 sibling of the reference engines' cost tracking. Accumulates token
5
+ * usage across a turn's model calls, optionally converts it to a USD cost via a
6
+ * per-model pricing table, and lets a turn stop early once a token or cost budget
7
+ * is hit. Usage is exact; cost depends on the (approximate, overridable) pricing.
8
+ */
9
+ export interface Usage {
10
+ promptTokens: number;
11
+ completionTokens: number;
12
+ }
13
+ export declare function totalTokens(u: Usage): number;
14
+ /** USD per 1,000,000 tokens, input and output. */
15
+ export interface ModelPricing {
16
+ inputPerMTok: number;
17
+ outputPerMTok: number;
18
+ }
19
+ export declare function pricingCost(p: ModelPricing, u: Usage): number;
20
+ /** Approximate default pricing (USD / 1M tokens). Override via AgentOptions.pricing. */
21
+ export declare const DEFAULT_PRICING: Record<string, ModelPricing>;
22
+ /** A ceiling for a turn. Either limit may be set; the first hit stops the turn. */
23
+ export interface CostBudget {
24
+ maxUsd?: number;
25
+ maxTokens?: number;
26
+ }
27
+ /** Accumulates usage + cost across a turn's model calls. */
28
+ export declare class CostTracker {
29
+ usage: Usage;
30
+ costUsd: number;
31
+ record(model: string, usage: Usage, pricing?: Record<string, ModelPricing>): void;
32
+ exceeds(budget?: CostBudget): boolean;
33
+ }
34
+ //# sourceMappingURL=cost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,KAAK;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAE5C;AAED,kDAAkD;AAClD,MAAM,WAAW,YAAY;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,CAE7D;AAED,wFAAwF;AACxF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAGxD,CAAC;AAEF,mFAAmF;AACnF,MAAM,WAAW,UAAU;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,4DAA4D;AAC5D,qBAAa,WAAW;IACpB,KAAK,EAAE,KAAK,CAA4C;IACxD,OAAO,SAAK;IAEZ,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,IAAI;IAQjF,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO;CAMxC"}
package/dist/cost.js ADDED
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Token-usage accounting and budget enforcement.
3
+ *
4
+ * Phase-1 sibling of the reference engines' cost tracking. Accumulates token
5
+ * usage across a turn's model calls, optionally converts it to a USD cost via a
6
+ * per-model pricing table, and lets a turn stop early once a token or cost budget
7
+ * is hit. Usage is exact; cost depends on the (approximate, overridable) pricing.
8
+ */
9
+ export function totalTokens(u) {
10
+ return u.promptTokens + u.completionTokens;
11
+ }
12
+ export function pricingCost(p, u) {
13
+ return (u.promptTokens * p.inputPerMTok + u.completionTokens * p.outputPerMTok) / 1_000_000;
14
+ }
15
+ /** Approximate default pricing (USD / 1M tokens). Override via AgentOptions.pricing. */
16
+ export const DEFAULT_PRICING = {
17
+ 'claude-haiku-4-5': { inputPerMTok: 1.0, outputPerMTok: 5.0 },
18
+ 'claude-sonnet-4-5': { inputPerMTok: 3.0, outputPerMTok: 15.0 },
19
+ };
20
+ /** Accumulates usage + cost across a turn's model calls. */
21
+ export class CostTracker {
22
+ usage = { promptTokens: 0, completionTokens: 0 };
23
+ costUsd = 0;
24
+ record(model, usage, pricing) {
25
+ this.usage.promptTokens += usage.promptTokens;
26
+ this.usage.completionTokens += usage.completionTokens;
27
+ const table = pricing ?? DEFAULT_PRICING;
28
+ const mp = table[model];
29
+ if (mp)
30
+ this.costUsd += pricingCost(mp, usage);
31
+ }
32
+ exceeds(budget) {
33
+ if (!budget)
34
+ return false;
35
+ if (budget.maxTokens !== undefined && totalTokens(this.usage) >= budget.maxTokens)
36
+ return true;
37
+ if (budget.maxUsd !== undefined && this.costUsd >= budget.maxUsd)
38
+ return true;
39
+ return false;
40
+ }
41
+ }
42
+ //# sourceMappingURL=cost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,UAAU,WAAW,CAAC,CAAQ;IAChC,OAAO,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,gBAAgB,CAAC;AAC/C,CAAC;AAQD,MAAM,UAAU,WAAW,CAAC,CAAe,EAAE,CAAQ;IACjD,OAAO,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;AAChG,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,MAAM,eAAe,GAAiC;IACzD,kBAAkB,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE;IAC7D,mBAAmB,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE;CAClE,CAAC;AAQF,4DAA4D;AAC5D,MAAM,OAAO,WAAW;IACpB,KAAK,GAAU,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC;IACxD,OAAO,GAAG,CAAC,CAAC;IAEZ,MAAM,CAAC,KAAa,EAAE,KAAY,EAAE,OAAsC;QACtE,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,gBAAgB,CAAC;QACtD,MAAM,KAAK,GAAG,OAAO,IAAI,eAAe,CAAC;QACzC,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,EAAE;YAAE,IAAI,CAAC,OAAO,IAAI,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,CAAC,MAAmB;QACvB,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC/F,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAC9E,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * `ExtensionHost` — orchestrates the loaded extensions: hook chaining in load
3
+ * order, non-blocking event fanout, tool proxies, and the ext→host delegate seam.
4
+ * The TS sibling of the Rust host's `extension/host.rs`.
5
+ *
6
+ * The security-critical part is {@link foldHookChain}: how per-extension hook
7
+ * outcomes combine, and what happens on timeout/crash. It is a pure function so it
8
+ * can be tested exhaustively against adversarial inputs without spawning anything.
9
+ */
10
+ import type { Tool } from '../agent.js';
11
+ import { type DiscoveredExtension } from './manifest.js';
12
+ import { type CommandExecuteResult, type CommandRegistration, type Completion, type Context, type HookOutcome, type HostInfo, PROTOCOL_VERSION, type ShortcutRegistration, type Tier, type WorkspaceInfo } from './protocol.js';
13
+ export { PROTOCOL_VERSION };
14
+ /** Classifies a hook by its failure policy and default timeout. */
15
+ export type HookType = 'tool_call' | 'user_bash' | 'tool_result' | 'input' | 'before_agent_start' | 'context' | 'before_provider_request' | 'message_end' | 'session_before_compact' | 'session_before_tree';
16
+ export declare function hookTypeFromName(name: string): HookType | undefined;
17
+ /**
18
+ * Fail-closed hooks (`tool_call`, `user_bash`) block the operation when an
19
+ * extension times out or crashes. Everything else fails open (proceeds).
20
+ */
21
+ export declare function hookFailClosed(hook: HookType): boolean;
22
+ /**
23
+ * Default hook timeout (ms): 60s for fail-closed (they gate execution), 5s for
24
+ * fail-open. Manifest `hook_timeout_ms` overrides this.
25
+ */
26
+ export declare function hookDefaultTimeoutMs(hook: HookType): number;
27
+ /** One extension's reply within a hook chain, as seen by the fold. */
28
+ export type HookStep = {
29
+ kind: 'replied';
30
+ outcome: HookOutcome;
31
+ } | {
32
+ kind: 'failed';
33
+ };
34
+ /** The folded result of a whole hook chain. */
35
+ export type FoldedHook = {
36
+ kind: 'proceed';
37
+ value: unknown;
38
+ } | {
39
+ kind: 'blocked';
40
+ reason: string;
41
+ };
42
+ /**
43
+ * Fold a hook chain over `input`, in load order. `steps` are the per-extension
44
+ * results in that order. This is the security-critical policy:
45
+ *
46
+ * - `continue` → value unchanged, next extension sees it.
47
+ * - `modify` → value replaced by the patch, next extension sees the patch.
48
+ * - `block` → short-circuit; the operation is vetoed (honored for every hook).
49
+ * - failed → for a fail-closed hook, block; for a fail-open hook, proceed unchanged.
50
+ */
51
+ export declare function foldHookChain(hook: HookType, input: unknown, steps: readonly HookStep[]): FoldedHook;
52
+ /**
53
+ * Effective event subscriptions: what the extension asked for at handshake,
54
+ * clamped to what its manifest `[capabilities] events` declared. An empty declared
55
+ * list means "no declared filter" → trust the handshake as-is; a non-empty list is
56
+ * the outer bound the extension can never widen past.
57
+ */
58
+ export declare function effectiveSubscriptions(declared: readonly string[], requested: readonly string[]): Set<string>;
59
+ /**
60
+ * The two-tier deadlock guard: a session-mutating ext→host action is valid only
61
+ * when it presents a COMMAND-tier context whose epoch is still current. An
62
+ * event-tier context, or a stale token minted before a reload bumped the epoch, is
63
+ * rejected with `-32003 ContextViolation`. Security-critical; a pure function so it
64
+ * can be tested exhaustively.
65
+ */
66
+ export declare function validateCommandContext(params: unknown, currentEpoch: number): void;
67
+ /**
68
+ * The host's side of ext→host requests. The engine ships headless defaults
69
+ * ({@link DefaultHostDelegate}); frontends (smooth-code, the daemon, the servers)
70
+ * subclass it and override.
71
+ */
72
+ export interface HostDelegate {
73
+ /** Answer a `ui/request`. Headless default: no UI available. */
74
+ uiRequest(ext: string, params: unknown): Promise<unknown>;
75
+ /** `kv/get`. */
76
+ kvGet(ext: string, key: string): Promise<unknown>;
77
+ /** `kv/set`. */
78
+ kvSet(ext: string, key: string, value: unknown): Promise<void>;
79
+ /** `exec/run`. Headless default: deny. */
80
+ execRun(ext: string, params: unknown): Promise<unknown>;
81
+ /** `session/send_message`. Context already validated. Default: unavailable. */
82
+ sessionSendMessage(ext: string, params: unknown): Promise<unknown>;
83
+ /** `session/send_user_message`. Context already validated. Default: unavailable. */
84
+ sessionSendUserMessage(ext: string, params: unknown): Promise<unknown>;
85
+ /** `session/append_entry`. Context already validated. Default: unavailable. */
86
+ sessionAppendEntry(ext: string, params: unknown): Promise<unknown>;
87
+ /** A `tool/update` progress notification during an in-flight `tool/execute`. Fire-and-forget. */
88
+ toolUpdate(ext: string, params: unknown): void;
89
+ }
90
+ /** The engine's headless delegate: NoUI, JSON-file kv, exec denied, session disabled. */
91
+ export declare class DefaultHostDelegate implements HostDelegate {
92
+ uiRequest(_ext: string, _params: unknown): Promise<unknown>;
93
+ kvGet(ext: string, key: string): Promise<unknown>;
94
+ kvSet(ext: string, key: string, value: unknown): Promise<void>;
95
+ execRun(_ext: string, _params: unknown): Promise<unknown>;
96
+ sessionSendMessage(_ext: string, _params: unknown): Promise<unknown>;
97
+ sessionSendUserMessage(_ext: string, _params: unknown): Promise<unknown>;
98
+ sessionAppendEntry(_ext: string, _params: unknown): Promise<unknown>;
99
+ toolUpdate(_ext: string, _params: unknown): void;
100
+ }
101
+ /** A `(name, error message)` pair for an extension that failed to load. */
102
+ export type LoadFailure = [name: string, error: string];
103
+ /** Orchestrates the set of loaded extensions in load order. */
104
+ export declare class ExtensionHost {
105
+ private readonly host;
106
+ private readonly workspace;
107
+ private readonly mode;
108
+ private readonly uiCapabilities;
109
+ private extensions;
110
+ private epoch;
111
+ private constructor();
112
+ /** An empty host: no extensions, every hook a passthrough. The zero-cost default. */
113
+ static empty(): ExtensionHost;
114
+ /**
115
+ * Load and initialize each discovered extension. Per-extension failures (spawn,
116
+ * handshake) are tolerated and returned alongside the host. In an untrusted
117
+ * workspace, project-scoped extensions are skipped.
118
+ */
119
+ static load(discovered: DiscoveredExtension[], host: HostInfo, workspace: WorkspaceInfo, mode: string, uiCapabilities: string[], delegate: HostDelegate): Promise<{
120
+ host: ExtensionHost;
121
+ failures: LoadFailure[];
122
+ }>;
123
+ private loadOne;
124
+ /** Send `initialize` and parse the registrations. Shared by load and reload. */
125
+ private initialize;
126
+ /** Number of successfully loaded extensions. */
127
+ get length(): number;
128
+ isEmpty(): boolean;
129
+ /** Names of loaded extensions, in load order. */
130
+ names(): string[];
131
+ /**
132
+ * A fresh dispatch context. Session-mutating actions need `command` tier. The
133
+ * token embeds the current epoch so it is invalidated across reloads.
134
+ */
135
+ context(tier: Tier): Context;
136
+ /** Bump the epoch, invalidating every previously minted context token. */
137
+ bumpEpoch(): void;
138
+ /** True if any loaded extension subscribed to `event`. */
139
+ hasSubscriber(event: string): boolean;
140
+ /**
141
+ * Fire-and-forget event fanout to every subscribed extension. Non-blocking: a
142
+ * slow or dead extension never stalls the caller (bounded, lossy observe lane).
143
+ */
144
+ dispatchEvent(event: string, payload: unknown): void;
145
+ /**
146
+ * Run a hook across every extension in load order, folding the chain. Each
147
+ * extension sees the prior extension's patch. Fail-open/closed per hook type.
148
+ */
149
+ runHook(hook: HookType, input: unknown): Promise<FoldedHook>;
150
+ /** Convenience: run the `tool_call` hook (fail-closed) on a pending call. */
151
+ runToolCallHook(tool: string, args: unknown): Promise<FoldedHook>;
152
+ /**
153
+ * Run the `before_agent_start` hook on a system prompt, returning the
154
+ * possibly-rewritten prompt. Fail-open: a blocked/failed hook leaves it unchanged.
155
+ */
156
+ beforeAgentStart(systemPrompt: string): Promise<string>;
157
+ /**
158
+ * Tool proxies for every eager tool every extension registered. Names are dotted
159
+ * `<ext>.<tool>`. Deferred tools are returned by {@link deferredTools}.
160
+ */
161
+ tools(): Tool[];
162
+ /** Deferred tool proxies. */
163
+ deferredTools(): Tool[];
164
+ private collectTools;
165
+ /**
166
+ * Eager tool proxies for a single extension, minted at the CURRENT epoch. The
167
+ * frontend calls this after a {@link reload} to re-register the reloaded
168
+ * extension's tools (its old proxies carry a stale context).
169
+ */
170
+ toolsFor(extName: string): Tool[];
171
+ /** Every registered slash-command across all extensions, paired with the owning extension name. */
172
+ commands(): Array<[string, CommandRegistration]>;
173
+ /** Every keyboard shortcut across all extensions, paired with the owning extension name. */
174
+ shortcuts(): Array<[string, ShortcutRegistration]>;
175
+ private commandOwner;
176
+ /**
177
+ * Dispatch a registered slash-command to its owning extension with a COMMAND-tier
178
+ * context. Pass `extName` to disambiguate a command registered by more than one
179
+ * extension; `undefined` picks the first match in load order.
180
+ */
181
+ runCommand(extName: string | undefined, command: string, args: unknown): Promise<CommandExecuteResult>;
182
+ /**
183
+ * Ask the extension that owns `command` for argument completions given the
184
+ * `partial` text typed so far. Returns an empty list on error (best-effort —
185
+ * never fail the caller's keystroke).
186
+ */
187
+ completeCommand(extName: string | undefined, command: string, partial: string): Promise<Completion[]>;
188
+ /**
189
+ * Hot-reload a single extension by name: notify it (`session_shutdown` reason
190
+ * `reload`), bump the epoch so every context token it still holds is invalidated,
191
+ * respawn its subprocess (the generation guard discards any late reply), re-run
192
+ * `initialize`, then notify it (`session_start` reason `reload`). The caller
193
+ * re-registers the extension's tools via {@link toolsFor}.
194
+ */
195
+ reload(name: string): Promise<void>;
196
+ /** Gracefully shut down every extension (5s grace each, then SIGKILL). */
197
+ shutdownAll(): Promise<void>;
198
+ }
199
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/extension/host.ts"],"names":[],"mappings":"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"}