@moxxy/sdk 0.1.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 (211) hide show
  1. package/dist/agent.d.ts +39 -0
  2. package/dist/agent.d.ts.map +1 -0
  3. package/dist/agent.js +2 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/cache-strategy.d.ts +35 -0
  6. package/dist/cache-strategy.d.ts.map +1 -0
  7. package/dist/cache-strategy.js +2 -0
  8. package/dist/cache-strategy.js.map +1 -0
  9. package/dist/channel.d.ts +146 -0
  10. package/dist/channel.d.ts.map +1 -0
  11. package/dist/channel.js +2 -0
  12. package/dist/channel.js.map +1 -0
  13. package/dist/client-session.d.ts +83 -0
  14. package/dist/client-session.d.ts.map +1 -0
  15. package/dist/client-session.js +2 -0
  16. package/dist/client-session.js.map +1 -0
  17. package/dist/command.d.ts +90 -0
  18. package/dist/command.d.ts.map +1 -0
  19. package/dist/command.js +15 -0
  20. package/dist/command.js.map +1 -0
  21. package/dist/compactor-helpers.d.ts +34 -0
  22. package/dist/compactor-helpers.d.ts.map +1 -0
  23. package/dist/compactor-helpers.js +156 -0
  24. package/dist/compactor-helpers.js.map +1 -0
  25. package/dist/compactor.d.ts +20 -0
  26. package/dist/compactor.d.ts.map +1 -0
  27. package/dist/compactor.js +2 -0
  28. package/dist/compactor.js.map +1 -0
  29. package/dist/define.d.ts +51 -0
  30. package/dist/define.d.ts.map +1 -0
  31. package/dist/define.js +71 -0
  32. package/dist/define.js.map +1 -0
  33. package/dist/elision-helpers.d.ts +27 -0
  34. package/dist/elision-helpers.d.ts.map +1 -0
  35. package/dist/elision-helpers.js +109 -0
  36. package/dist/elision-helpers.js.map +1 -0
  37. package/dist/elision-state.d.ts +49 -0
  38. package/dist/elision-state.d.ts.map +1 -0
  39. package/dist/elision-state.js +144 -0
  40. package/dist/elision-state.js.map +1 -0
  41. package/dist/embedding-cache.d.ts +32 -0
  42. package/dist/embedding-cache.d.ts.map +1 -0
  43. package/dist/embedding-cache.js +0 -0
  44. package/dist/embedding-cache.js.map +1 -0
  45. package/dist/embedding.d.ts +21 -0
  46. package/dist/embedding.d.ts.map +1 -0
  47. package/dist/embedding.js +2 -0
  48. package/dist/embedding.js.map +1 -0
  49. package/dist/errors.d.ts +81 -0
  50. package/dist/errors.d.ts.map +1 -0
  51. package/dist/errors.js +241 -0
  52. package/dist/errors.js.map +1 -0
  53. package/dist/events.d.ts +193 -0
  54. package/dist/events.d.ts.map +1 -0
  55. package/dist/events.js +2 -0
  56. package/dist/events.js.map +1 -0
  57. package/dist/hooks.d.ts +52 -0
  58. package/dist/hooks.d.ts.map +1 -0
  59. package/dist/hooks.js +2 -0
  60. package/dist/hooks.js.map +1 -0
  61. package/dist/ids.d.ts +18 -0
  62. package/dist/ids.d.ts.map +1 -0
  63. package/dist/ids.js +7 -0
  64. package/dist/ids.js.map +1 -0
  65. package/dist/index.d.ts +45 -0
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +18 -0
  68. package/dist/index.js.map +1 -0
  69. package/dist/install-hints.d.ts +26 -0
  70. package/dist/install-hints.d.ts.map +1 -0
  71. package/dist/install-hints.js +15 -0
  72. package/dist/install-hints.js.map +1 -0
  73. package/dist/isolation.d.ts +125 -0
  74. package/dist/isolation.d.ts.map +1 -0
  75. package/dist/isolation.js +11 -0
  76. package/dist/isolation.js.map +1 -0
  77. package/dist/log.d.ts +11 -0
  78. package/dist/log.d.ts.map +1 -0
  79. package/dist/log.js +2 -0
  80. package/dist/log.js.map +1 -0
  81. package/dist/mode-helpers.d.ts +99 -0
  82. package/dist/mode-helpers.d.ts.map +1 -0
  83. package/dist/mode-helpers.js +368 -0
  84. package/dist/mode-helpers.js.map +1 -0
  85. package/dist/mode.d.ts +133 -0
  86. package/dist/mode.d.ts.map +1 -0
  87. package/dist/mode.js +2 -0
  88. package/dist/mode.js.map +1 -0
  89. package/dist/permission.d.ts +35 -0
  90. package/dist/permission.d.ts.map +1 -0
  91. package/dist/permission.js +2 -0
  92. package/dist/permission.js.map +1 -0
  93. package/dist/plugin.d.ts +88 -0
  94. package/dist/plugin.d.ts.map +1 -0
  95. package/dist/plugin.js +2 -0
  96. package/dist/plugin.js.map +1 -0
  97. package/dist/provider-utils.d.ts +40 -0
  98. package/dist/provider-utils.d.ts.map +1 -0
  99. package/dist/provider-utils.js +163 -0
  100. package/dist/provider-utils.js.map +1 -0
  101. package/dist/provider.d.ts +219 -0
  102. package/dist/provider.d.ts.map +1 -0
  103. package/dist/provider.js +2 -0
  104. package/dist/provider.js.map +1 -0
  105. package/dist/requirements.d.ts +22 -0
  106. package/dist/requirements.d.ts.map +1 -0
  107. package/dist/requirements.js +2 -0
  108. package/dist/requirements.js.map +1 -0
  109. package/dist/schemas.d.ts +228 -0
  110. package/dist/schemas.d.ts.map +1 -0
  111. package/dist/schemas.js +88 -0
  112. package/dist/schemas.js.map +1 -0
  113. package/dist/session-like.d.ts +111 -0
  114. package/dist/session-like.d.ts.map +1 -0
  115. package/dist/session-like.js +2 -0
  116. package/dist/session-like.js.map +1 -0
  117. package/dist/skill.d.ts +30 -0
  118. package/dist/skill.d.ts.map +1 -0
  119. package/dist/skill.js +2 -0
  120. package/dist/skill.js.map +1 -0
  121. package/dist/subagent.d.ts +45 -0
  122. package/dist/subagent.d.ts.map +1 -0
  123. package/dist/subagent.js +11 -0
  124. package/dist/subagent.js.map +1 -0
  125. package/dist/token-accounting.d.ts +73 -0
  126. package/dist/token-accounting.d.ts.map +1 -0
  127. package/dist/token-accounting.js +129 -0
  128. package/dist/token-accounting.js.map +1 -0
  129. package/dist/tool-dispatch.d.ts +19 -0
  130. package/dist/tool-dispatch.d.ts.map +1 -0
  131. package/dist/tool-dispatch.js +118 -0
  132. package/dist/tool-dispatch.js.map +1 -0
  133. package/dist/tool-gating.d.ts +32 -0
  134. package/dist/tool-gating.d.ts.map +1 -0
  135. package/dist/tool-gating.js +83 -0
  136. package/dist/tool-gating.js.map +1 -0
  137. package/dist/tool.d.ts +166 -0
  138. package/dist/tool.d.ts.map +1 -0
  139. package/dist/tool.js +2 -0
  140. package/dist/tool.js.map +1 -0
  141. package/dist/transcriber.d.ts +64 -0
  142. package/dist/transcriber.d.ts.map +1 -0
  143. package/dist/transcriber.js +21 -0
  144. package/dist/transcriber.js.map +1 -0
  145. package/dist/tunnel.d.ts +25 -0
  146. package/dist/tunnel.d.ts.map +1 -0
  147. package/dist/tunnel.js +2 -0
  148. package/dist/tunnel.js.map +1 -0
  149. package/dist/type-contracts.d.ts +2 -0
  150. package/dist/type-contracts.d.ts.map +1 -0
  151. package/dist/type-contracts.js +4 -0
  152. package/dist/type-contracts.js.map +1 -0
  153. package/dist/types.test-d.d.ts +2 -0
  154. package/dist/types.test-d.d.ts.map +1 -0
  155. package/dist/types.test-d.js +22 -0
  156. package/dist/types.test-d.js.map +1 -0
  157. package/dist/view-renderer.d.ts +97 -0
  158. package/dist/view-renderer.d.ts.map +1 -0
  159. package/dist/view-renderer.js +72 -0
  160. package/dist/view-renderer.js.map +1 -0
  161. package/package.json +38 -0
  162. package/src/agent.ts +38 -0
  163. package/src/cache-strategy.ts +39 -0
  164. package/src/channel.ts +158 -0
  165. package/src/client-session.ts +88 -0
  166. package/src/command.ts +86 -0
  167. package/src/compactor-helpers.test.ts +206 -0
  168. package/src/compactor-helpers.ts +163 -0
  169. package/src/compactor.ts +20 -0
  170. package/src/define.test.ts +76 -0
  171. package/src/define.ts +113 -0
  172. package/src/elision-helpers.ts +143 -0
  173. package/src/elision-state.ts +170 -0
  174. package/src/embedding-cache.ts +0 -0
  175. package/src/embedding.ts +22 -0
  176. package/src/errors.test.ts +176 -0
  177. package/src/errors.ts +308 -0
  178. package/src/events.ts +250 -0
  179. package/src/hooks.ts +54 -0
  180. package/src/ids.ts +16 -0
  181. package/src/index.ts +304 -0
  182. package/src/install-hints.ts +43 -0
  183. package/src/isolation.ts +148 -0
  184. package/src/log.ts +11 -0
  185. package/src/loop-helpers.test.ts +78 -0
  186. package/src/mode-helpers.ts +483 -0
  187. package/src/mode.ts +139 -0
  188. package/src/package-root.test.ts +40 -0
  189. package/src/permission.ts +37 -0
  190. package/src/plugin.ts +92 -0
  191. package/src/provider-utils.test.ts +84 -0
  192. package/src/provider-utils.ts +171 -0
  193. package/src/provider.ts +195 -0
  194. package/src/requirements.ts +35 -0
  195. package/src/schemas.test.ts +106 -0
  196. package/src/schemas.ts +97 -0
  197. package/src/session-like.ts +118 -0
  198. package/src/skill.ts +34 -0
  199. package/src/subagent.ts +46 -0
  200. package/src/token-accounting.test.ts +93 -0
  201. package/src/token-accounting.ts +202 -0
  202. package/src/token-efficiency.test.ts +459 -0
  203. package/src/tool-dispatch.ts +137 -0
  204. package/src/tool-gating.ts +107 -0
  205. package/src/tool.ts +175 -0
  206. package/src/transcriber.ts +71 -0
  207. package/src/tunnel.ts +26 -0
  208. package/src/type-contracts.ts +4 -0
  209. package/src/types.test-d.ts +29 -0
  210. package/src/view-renderer.test.ts +90 -0
  211. package/src/view-renderer.ts +156 -0
@@ -0,0 +1,156 @@
1
+ import { computeElisionState, conversationalStub, conversationalStubbed, toolResultBytes, toolResultStub, toolResultStubbed, } from './elision-state.js';
2
+ /**
3
+ * Cheap, no-network estimate of how many tokens the current event log
4
+ * would consume on the next provider request. Char-based (chars/4) with
5
+ * compaction events honored — events covered by a CompactionEvent.replacedRange
6
+ * count as the (much shorter) summary rather than their original bytes — and
7
+ * elision honored: old tool results (seq ≤ the elision high-water mark) count
8
+ * as their ~stub size rather than their full payload, matching what
9
+ * `projectMessagesFromLog` actually sends.
10
+ *
11
+ * Used by the auto-compact helper (see `runCompactionIfNeeded`) and by
12
+ * the TUI's context meter. For perfect accuracy callers can use the
13
+ * provider's `countTokens(req)`; this is the fast path that doesn't
14
+ * touch the network and is safe to run on every iteration.
15
+ */
16
+ export function estimateContextTokens(log) {
17
+ const events = log.slice();
18
+ // Share the exact stub decision with projection so the estimate matches what
19
+ // is actually sent — pinned recalls / never-elide / tiny turns counted full,
20
+ // not undercounted (which would let the context overflow before compaction).
21
+ const el = computeElisionState(events);
22
+ let chars = 0;
23
+ const compactedSeqs = new Set();
24
+ for (const e of events) {
25
+ if (e.type === 'compaction') {
26
+ for (let seq = e.replacedRange[0]; seq <= e.replacedRange[1]; seq++) {
27
+ compactedSeqs.add(seq);
28
+ }
29
+ chars += e.summary.length;
30
+ }
31
+ }
32
+ for (const e of events) {
33
+ if (compactedSeqs.has(e.seq))
34
+ continue;
35
+ if (e.type === 'tool_result' && toolResultStubbed(e, el)) {
36
+ const recalled = el.recalledCallIds.has(e.callId) || el.recalledSeqs.has(e.seq);
37
+ chars += toolResultStub(e.callId, toolResultBytes(e.output), recalled).length;
38
+ continue;
39
+ }
40
+ if ((e.type === 'user_prompt' || e.type === 'assistant_message') && conversationalStubbed(e, el)) {
41
+ chars += conversationalStub(e.type === 'user_prompt' ? 'user' : 'assistant', e.seq).length;
42
+ continue;
43
+ }
44
+ chars += eventChars(e);
45
+ }
46
+ return Math.ceil(chars / 4);
47
+ }
48
+ function eventChars(e) {
49
+ switch (e.type) {
50
+ case 'user_prompt':
51
+ return e.text.length;
52
+ case 'assistant_message':
53
+ return e.content.length;
54
+ case 'tool_call_requested':
55
+ return e.name.length + safeJsonLen(e.input);
56
+ case 'tool_result':
57
+ if (e.error)
58
+ return (e.error.message?.length ?? 0) + 12;
59
+ if (typeof e.output === 'string')
60
+ return e.output.length;
61
+ return safeJsonLen(e.output);
62
+ default:
63
+ return 0;
64
+ }
65
+ }
66
+ function safeJsonLen(v) {
67
+ try {
68
+ return JSON.stringify(v ?? '').length;
69
+ }
70
+ catch {
71
+ return 0;
72
+ }
73
+ }
74
+ /**
75
+ * Auto-compaction hook every mode calls once per iteration, right
76
+ * before building messages for the next provider call. Reads the
77
+ * active model's real `contextWindow` (not a magic max-int sentinel),
78
+ * estimates current token use, and — if the configured compactor's
79
+ * `shouldCompact` returns true — runs `compact()` and emits the
80
+ * resulting CompactionEvent onto the log. `projectMessagesFromLog`
81
+ * already honors compaction events, so the next provider call sees
82
+ * the summarized prefix automatically.
83
+ *
84
+ * Designed to be tolerant: no compactor, no model descriptor, no
85
+ * contextWindow, or a compactor throw all degrade to a no-op so a
86
+ * compactor bug can't kill the turn. Failures emit a non-fatal
87
+ * `error` event for observability.
88
+ */
89
+ export async function runCompactionIfNeeded(ctx) {
90
+ const compactor = ctx.compactor;
91
+ if (!compactor)
92
+ return;
93
+ // Resolve the active model's descriptor so we use the *real* context
94
+ // window. `Number.MAX_SAFE_INTEGER` (the old /compact behavior) made
95
+ // threshold-based compactors always look comfortable, even at 99%.
96
+ const descriptor = ctx.provider.models.find((m) => m.id === ctx.model);
97
+ const contextWindow = descriptor?.contextWindow;
98
+ if (!contextWindow || contextWindow <= 0)
99
+ return;
100
+ const events = ctx.log.slice();
101
+ if (events.length === 0)
102
+ return;
103
+ const budget = {
104
+ contextWindow,
105
+ estimatedTokens: estimateContextTokens(ctx.log),
106
+ reserveForOutput: descriptor?.maxOutputTokens ?? 0,
107
+ };
108
+ let shouldRun = false;
109
+ try {
110
+ shouldRun = compactor.shouldCompact(ctx.log, budget);
111
+ }
112
+ catch (err) {
113
+ await ctx.emit({
114
+ type: 'error',
115
+ sessionId: ctx.sessionId,
116
+ turnId: ctx.turnId,
117
+ source: 'system',
118
+ kind: 'retryable',
119
+ message: `compactor.shouldCompact threw: ${err instanceof Error ? err.message : String(err)}`,
120
+ });
121
+ return;
122
+ }
123
+ if (!shouldRun)
124
+ return;
125
+ try {
126
+ const result = await compactor.compact(events, {
127
+ log: ctx.log,
128
+ budget,
129
+ signal: ctx.signal,
130
+ });
131
+ if (result.tokensSaved <= 0 || result.summary.trim().length === 0)
132
+ return;
133
+ // `compactor.compact` declares `Omit<CompactionEvent, keyof EventBase>`,
134
+ // but every shipped compactor (and the SDK examples) fills sessionId /
135
+ // turnId / source. Defensive-fill from ctx so a compactor that obeyed
136
+ // the type contract literally still emits a valid event.
137
+ const emittable = {
138
+ sessionId: ctx.sessionId,
139
+ turnId: ctx.turnId,
140
+ source: 'compactor',
141
+ ...result,
142
+ };
143
+ await ctx.emit(emittable);
144
+ }
145
+ catch (err) {
146
+ await ctx.emit({
147
+ type: 'error',
148
+ sessionId: ctx.sessionId,
149
+ turnId: ctx.turnId,
150
+ source: 'system',
151
+ kind: 'retryable',
152
+ message: `compactor.compact threw: ${err instanceof Error ? err.message : String(err)}`,
153
+ });
154
+ }
155
+ }
156
+ //# sourceMappingURL=compactor-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compactor-helpers.js","sourceRoot":"","sources":["../src/compactor-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { CompactionEvent, MoxxyEvent } from './events.js';
2
+ import type { EventLogReader } from './log.js';
3
+ export interface TokenBudget {
4
+ readonly contextWindow: number;
5
+ readonly estimatedTokens: number;
6
+ readonly reserveForOutput: number;
7
+ }
8
+ export interface CompactContext {
9
+ readonly log: EventLogReader;
10
+ readonly budget: TokenBudget;
11
+ readonly signal: AbortSignal;
12
+ }
13
+ export interface CompactorDef {
14
+ readonly name: string;
15
+ shouldCompact(log: EventLogReader, budget: TokenBudget): boolean;
16
+ compact(events: ReadonlyArray<MoxxyEvent>, ctx: CompactContext): Promise<Omit<CompactionEvent, keyof import('./events.js').EventBase> & {
17
+ ts?: number;
18
+ }>;
19
+ }
20
+ //# sourceMappingURL=compactor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compactor.d.ts","sourceRoot":"","sources":["../src/compactor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IACjE,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,OAAO,aAAa,EAAE,SAAS,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1J"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compactor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compactor.js","sourceRoot":"","sources":["../src/compactor.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import type { AgentDef } from './agent.js';
2
+ import type { CacheStrategyDef } from './cache-strategy.js';
3
+ import type { ChannelDef } from './channel.js';
4
+ import type { CommandDef } from './command.js';
5
+ import type { CompactorDef } from './compactor.js';
6
+ import type { ModeDef } from './mode.js';
7
+ import type { PermissionRule } from './permission.js';
8
+ import type { Plugin, PluginSpec } from './plugin.js';
9
+ import type { ProviderDef } from './provider.js';
10
+ import type { SkillDef, SkillFrontmatter } from './skill.js';
11
+ import type { ToolCompactPresentation, ToolContext, ToolDef } from './tool.js';
12
+ import type { ToolIsolationSpec } from './isolation.js';
13
+ import type { TranscriberDef } from './transcriber.js';
14
+ import type { ViewRendererDef } from './view-renderer.js';
15
+ import type { TunnelProviderDef } from './tunnel.js';
16
+ import type { z } from 'zod';
17
+ export declare function definePlugin(spec: PluginSpec): Plugin;
18
+ /**
19
+ * `defineTool` carries an extra generic `<S, O>` so the `handler`'s `input`
20
+ * parameter is typed as `z.output<S>` rather than `unknown` — that's the
21
+ * authoring-ergonomics benefit. The returned `ToolDef` widens the handler
22
+ * to the runtime contract `(unknown, ToolContext) => unknown` because the
23
+ * registry parses input via `inputSchema` before calling.
24
+ */
25
+ export declare function defineTool<S extends z.ZodTypeAny, O = unknown>(spec: {
26
+ name: string;
27
+ description: string;
28
+ inputSchema: S;
29
+ inputJsonSchema?: unknown;
30
+ outputSchema?: z.ZodType<O>;
31
+ permission?: PermissionRule;
32
+ handler: (input: z.output<S>, ctx: ToolContext) => Promise<O> | O;
33
+ compact?: ToolCompactPresentation;
34
+ isolation?: ToolIsolationSpec;
35
+ }): ToolDef;
36
+ export declare function defineProvider(spec: ProviderDef): ProviderDef;
37
+ export declare function defineMode(spec: ModeDef): ModeDef;
38
+ export declare function defineCompactor(spec: CompactorDef): CompactorDef;
39
+ export declare function defineCacheStrategy(spec: CacheStrategyDef): CacheStrategyDef;
40
+ export declare function defineViewRenderer(spec: ViewRendererDef): ViewRendererDef;
41
+ export declare function defineTunnelProvider(spec: TunnelProviderDef): TunnelProviderDef;
42
+ export declare function defineChannel<TStartOpts = unknown>(spec: ChannelDef<TStartOpts>): ChannelDef<TStartOpts>;
43
+ export declare function definePermission(spec: PermissionRule): PermissionRule;
44
+ export declare function defineSkill(spec: {
45
+ frontmatter: SkillFrontmatter;
46
+ body: string;
47
+ }): SkillDef;
48
+ export declare function defineTranscriber(spec: TranscriberDef): TranscriberDef;
49
+ export declare function defineCommand(spec: CommandDef): CommandDef;
50
+ export declare function defineAgent(spec: AgentDef): AgentDef;
51
+ //# sourceMappingURL=define.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"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"}
package/dist/define.js ADDED
@@ -0,0 +1,71 @@
1
+ export function definePlugin(spec) {
2
+ // Spread spec first so the defaults below can't be clobbered by an
3
+ // explicit `version: undefined` in the spec (which violates Plugin.version
4
+ // typed as `string`).
5
+ return Object.freeze({
6
+ ...spec,
7
+ __moxxy: 'plugin',
8
+ version: spec.version ?? '0.0.0',
9
+ });
10
+ }
11
+ /**
12
+ * `defineTool` carries an extra generic `<S, O>` so the `handler`'s `input`
13
+ * parameter is typed as `z.output<S>` rather than `unknown` — that's the
14
+ * authoring-ergonomics benefit. The returned `ToolDef` widens the handler
15
+ * to the runtime contract `(unknown, ToolContext) => unknown` because the
16
+ * registry parses input via `inputSchema` before calling.
17
+ */
18
+ export function defineTool(spec) {
19
+ return Object.freeze({
20
+ name: spec.name,
21
+ description: spec.description,
22
+ inputSchema: spec.inputSchema,
23
+ inputJsonSchema: spec.inputJsonSchema,
24
+ outputSchema: spec.outputSchema,
25
+ permission: spec.permission,
26
+ handler: spec.handler,
27
+ compact: spec.compact,
28
+ isolation: spec.isolation,
29
+ });
30
+ }
31
+ // Every other `defineX` follows the same `(spec: XDef): XDef` shape: it
32
+ // freezes the spec and hands it back. The compile-time win is a clean
33
+ // "this is how you author one" signature; the runtime win is
34
+ // Object.freeze so plugin authors can't mutate published defs.
35
+ export function defineProvider(spec) {
36
+ return Object.freeze(spec);
37
+ }
38
+ export function defineMode(spec) {
39
+ return Object.freeze(spec);
40
+ }
41
+ export function defineCompactor(spec) {
42
+ return Object.freeze(spec);
43
+ }
44
+ export function defineCacheStrategy(spec) {
45
+ return Object.freeze(spec);
46
+ }
47
+ export function defineViewRenderer(spec) {
48
+ return Object.freeze(spec);
49
+ }
50
+ export function defineTunnelProvider(spec) {
51
+ return Object.freeze(spec);
52
+ }
53
+ export function defineChannel(spec) {
54
+ return Object.freeze(spec);
55
+ }
56
+ export function definePermission(spec) {
57
+ return Object.freeze(spec);
58
+ }
59
+ export function defineSkill(spec) {
60
+ return Object.freeze(spec);
61
+ }
62
+ export function defineTranscriber(spec) {
63
+ return Object.freeze(spec);
64
+ }
65
+ export function defineCommand(spec) {
66
+ return Object.freeze(spec);
67
+ }
68
+ export function defineAgent(spec) {
69
+ return Object.freeze(spec);
70
+ }
71
+ //# sourceMappingURL=define.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,YAAY,CAAC,IAAgB;IAC3C,mEAAmE;IACnE,2EAA2E;IAC3E,sBAAsB;IACtB,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,IAAI;QACP,OAAO,EAAE,QAAiB;QAC1B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO;KACjC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAsC,IAU/D;IACC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,IAAI,CAAC,OAA2E;QACzF,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CAAC;AACL,CAAC;AAED,wEAAwE;AACxE,sEAAsE;AACtE,6DAA6D;AAC7D,+DAA+D;AAE/D,MAAM,UAAU,cAAc,CAAC,IAAiB;IAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAkB;IAChD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAsB;IACxD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAqB;IACtD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAuB;IAC1D,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,IAA4B;IAE5B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAoB;IACnD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAqD;IAC/E,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAoB;IACpD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAgB;IAC5C,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { ElisionSettings, ModeContext } from './mode.js';
2
+ /**
3
+ * Turn-boundary elision (context-on-demand). Called once per loop iteration by
4
+ * every mode, right next to `runCompactionIfNeeded`. When the recent window
5
+ * exceeds `keepRecentTurns` AND the context is at least `minContextRatioToElide`
6
+ * full, it advances a high-water mark (in whole-turn steps) by appending an
7
+ * `ElisionEvent`. `projectMessagesFromLog` then renders events at or below that
8
+ * mark as compact stubs the model can expand via the `recall` tool.
9
+ *
10
+ * Hard invariants (independent of config): never elide the in-progress turn,
11
+ * never elide the first user_prompt (task anchor — enforced in projection),
12
+ * and degrade to a no-op on any internal error so an elision bug can't kill a
13
+ * turn. The mark only advances on completed-turn boundaries, which keeps the
14
+ * elided prefix byte-stable across a turn's iterations so caching still hits.
15
+ */
16
+ export interface ResolvedElisionSettings {
17
+ readonly enabled: boolean;
18
+ readonly keepRecentTurns: number;
19
+ readonly minContextRatioToElide: number;
20
+ readonly elideConversational: boolean;
21
+ readonly conversationalRecallThreshold: number;
22
+ readonly maxRecallBytes: number;
23
+ readonly neverElideTools: ReadonlyArray<string>;
24
+ }
25
+ export declare function resolveElisionSettings(s?: ElisionSettings): ResolvedElisionSettings;
26
+ export declare function runElisionIfNeeded(ctx: ModeContext): Promise<void>;
27
+ //# sourceMappingURL=elision-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elision-helpers.d.ts","sourceRoot":"","sources":["../src/elision-helpers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE9D;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,6BAA6B,EAAE,MAAM,CAAC;IAC/C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACjD;AAgBD,wBAAgB,sBAAsB,CAAC,CAAC,CAAC,EAAE,eAAe,GAAG,uBAAuB,CAYnF;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DxE"}
@@ -0,0 +1,109 @@
1
+ import { estimateContextTokens } from './compactor-helpers.js';
2
+ import { toolResultBytes } from './elision-state.js';
3
+ const DEFAULTS = {
4
+ enabled: true,
5
+ keepRecentTurns: 4,
6
+ minContextRatioToElide: 0.3,
7
+ // User-selected default: aggressive context-on-demand (collapse old text
8
+ // turns too), but with adaptive auto-disable below.
9
+ elideConversational: true,
10
+ // After this many seq-based recalls, conversational elision switches off for
11
+ // the session (the model is clearly leaning on elided text turns).
12
+ conversationalRecallThreshold: 4,
13
+ maxRecallBytes: 32_768,
14
+ neverElideTools: [],
15
+ };
16
+ export function resolveElisionSettings(s) {
17
+ return {
18
+ enabled: s?.enabled ?? DEFAULTS.enabled,
19
+ // Hard floor: never keep fewer than 2 recent turns verbatim.
20
+ keepRecentTurns: Math.max(2, s?.keepRecentTurns ?? DEFAULTS.keepRecentTurns),
21
+ minContextRatioToElide: s?.minContextRatioToElide ?? DEFAULTS.minContextRatioToElide,
22
+ elideConversational: s?.elideConversational ?? DEFAULTS.elideConversational,
23
+ conversationalRecallThreshold: s?.conversationalRecallThreshold ?? DEFAULTS.conversationalRecallThreshold,
24
+ maxRecallBytes: s?.maxRecallBytes ?? DEFAULTS.maxRecallBytes,
25
+ neverElideTools: s?.neverElideTools ?? DEFAULTS.neverElideTools,
26
+ };
27
+ }
28
+ export async function runElisionIfNeeded(ctx) {
29
+ try {
30
+ const s = resolveElisionSettings(ctx.elision);
31
+ if (!s.enabled)
32
+ return;
33
+ const descriptor = ctx.provider.models.find((m) => m.id === ctx.model);
34
+ const contextWindow = descriptor?.contextWindow;
35
+ if (!contextWindow || contextWindow <= 0)
36
+ return;
37
+ // Gate: below this fill the whole history fits comfortably — eliding would
38
+ // only add missed-context risk for no token benefit.
39
+ if (estimateContextTokens(ctx.log) < s.minContextRatioToElide * contextWindow)
40
+ return;
41
+ const events = ctx.log.slice();
42
+ if (events.length === 0)
43
+ return;
44
+ const priorHWM = events.reduce((max, e) => (e.type === 'elision' ? Math.max(max, e.elidedThrough) : max), -1);
45
+ // Distinct COMPLETED turns in order (exclude the in-progress turn).
46
+ const turnOrder = [];
47
+ const seen = new Set();
48
+ for (const e of events) {
49
+ if (e.turnId === ctx.turnId)
50
+ continue;
51
+ if (!seen.has(e.turnId)) {
52
+ seen.add(e.turnId);
53
+ turnOrder.push(e.turnId);
54
+ }
55
+ }
56
+ if (turnOrder.length <= s.keepRecentTurns)
57
+ return;
58
+ // Elide every completed turn before the recent window.
59
+ const elideTurns = new Set(turnOrder.slice(0, turnOrder.length - s.keepRecentTurns));
60
+ let to = -1;
61
+ for (const e of events) {
62
+ if (elideTurns.has(e.turnId))
63
+ to = Math.max(to, e.seq);
64
+ }
65
+ if (to <= priorHWM)
66
+ return; // nothing new to elide
67
+ const from = priorHWM + 1;
68
+ const tokensSaved = estimateElisionSavings(events, from, to, s.neverElideTools);
69
+ const emittable = {
70
+ type: 'elision',
71
+ sessionId: ctx.sessionId,
72
+ turnId: ctx.turnId,
73
+ source: 'system',
74
+ elidedThrough: to,
75
+ stubbedRanges: [[from, to]],
76
+ elideConversational: s.elideConversational,
77
+ conversationalRecallThreshold: s.conversationalRecallThreshold,
78
+ maxRecallBytes: s.maxRecallBytes,
79
+ neverElideTools: s.neverElideTools,
80
+ tokensSaved,
81
+ };
82
+ await ctx.emit(emittable);
83
+ }
84
+ catch {
85
+ // Elision is best-effort; a bug here must never kill the turn.
86
+ }
87
+ }
88
+ function estimateElisionSavings(events, from, to, neverElide) {
89
+ const neverSet = new Set(neverElide);
90
+ const toolNameByCall = new Map();
91
+ for (const e of events) {
92
+ if (e.type === 'tool_call_requested')
93
+ toolNameByCall.set(e.callId, e.name);
94
+ }
95
+ let savedChars = 0;
96
+ for (const e of events) {
97
+ if (e.seq < from || e.seq > to)
98
+ continue;
99
+ if (e.type === 'tool_result' && !e.error) {
100
+ const name = toolNameByCall.get(e.callId);
101
+ if (name && neverSet.has(name))
102
+ continue;
103
+ const bytes = toolResultBytes(e.output);
104
+ savedChars += Math.max(0, bytes - 60); // stub is ~60 chars
105
+ }
106
+ }
107
+ return Math.ceil(savedChars / 4);
108
+ }
109
+ //# sourceMappingURL=elision-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elision-helpers.js","sourceRoot":"","sources":["../src/elision-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { MoxxyEvent } from './events.js';
2
+ /**
3
+ * Shared elision decision logic — the single source of truth for "is this event
4
+ * stubbed, and to what size", consumed by BOTH `projectMessagesFromLog` (what we
5
+ * send) and `estimateContextTokens` (what we think we send). Keeping them in one
6
+ * leaf module guarantees the estimate matches reality (no overflow from
7
+ * undercounting pinned recalls) and avoids a circular import between the
8
+ * projection and the estimate.
9
+ */
10
+ /** Below this size, eliding a turn/result saves nothing — keep it verbatim. */
11
+ export declare const TINY_TURN_CHARS = 200;
12
+ /** Bytes of a tool_result payload (for stub labels + the recall cap). */
13
+ export declare function toolResultBytes(output: unknown, errorMessage?: string): number;
14
+ /** Deterministic stub for an elided tool result. Stable bytes → cache-safe. */
15
+ export declare function toolResultStub(callId: string, bytes: number, recalled: boolean): string;
16
+ /** Deterministic stub for an elided conversational (user/assistant) turn. */
17
+ export declare function conversationalStub(role: 'user' | 'assistant', seq: number): string;
18
+ export interface ElisionState {
19
+ /** Inclusive seq high-water mark; -1 when no elision is active. */
20
+ readonly hwm: number;
21
+ /** Conversational elision after the adaptive auto-disable check. */
22
+ readonly effectiveElideConversational: boolean;
23
+ readonly neverElide: ReadonlySet<string>;
24
+ readonly toolNameByCall: ReadonlyMap<string, string>;
25
+ /** callIds an earlier `recall` referenced (their stub says "already recalled"). */
26
+ readonly recalledCallIds: ReadonlySet<string>;
27
+ readonly recalledSeqs: ReadonlySet<number>;
28
+ /** callIds whose tool_result IS a recall's output — pinned verbatim... */
29
+ readonly recallResultCallIds: ReadonlySet<string>;
30
+ /** ...except these, which exceeded `maxRecallBytes` and get stubbed. */
31
+ readonly unpinnedRecallCallIds: ReadonlySet<string>;
32
+ /** Seq of the first user_prompt (task anchor) — never elided. */
33
+ readonly firstUserPromptSeq: number;
34
+ }
35
+ /**
36
+ * Derive elision state purely from the log: the active high-water mark + flags
37
+ * (from the latest ElisionEvent), the callId→tool map, recall bookkeeping, the
38
+ * adaptive conversational auto-disable, and which pinned recalls exceed the cap.
39
+ */
40
+ export declare function computeElisionState(events: ReadonlyArray<MoxxyEvent>): ElisionState;
41
+ /** Is this tool_result sent as a stub? (Shared by projection + estimate.) */
42
+ export declare function toolResultStubbed(e: Extract<MoxxyEvent, {
43
+ type: 'tool_result';
44
+ }>, state: ElisionState): boolean;
45
+ /** Is this user/assistant turn collapsed to a conversational stub? */
46
+ export declare function conversationalStubbed(e: Extract<MoxxyEvent, {
47
+ type: 'user_prompt' | 'assistant_message';
48
+ }>, state: ElisionState): boolean;
49
+ //# sourceMappingURL=elision-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elision-state.d.ts","sourceRoot":"","sources":["../src/elision-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;;GAOG;AAEH,+EAA+E;AAC/E,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ9E;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAIvF;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAElF;AAED,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,QAAQ,CAAC,4BAA4B,EAAE,OAAO,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,mFAAmF;IACnF,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,0EAA0E;IAC1E,QAAQ,CAAC,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClD,wEAAwE;IACxE,QAAQ,CAAC,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpD,iEAAiE;IACjE,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAcD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,YAAY,CAqEnF;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC,EAC/C,KAAK,EAAE,YAAY,GAClB,OAAO,CAUT;AAED,sEAAsE;AACtE,wBAAgB,qBAAqB,CACnC,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,aAAa,GAAG,mBAAmB,CAAA;CAAE,CAAC,EACrE,KAAK,EAAE,YAAY,GAClB,OAAO,CAMT"}