@inbrowser/agent 0.0.0-placeholder → 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 (202) hide show
  1. package/AGENTS.md +270 -0
  2. package/README.md +117 -2
  3. package/bin/agent.ts +10 -0
  4. package/dist/cli/commands/describe.d.ts +14 -0
  5. package/dist/cli/commands/describe.d.ts.map +1 -0
  6. package/dist/cli/commands/describe.js +179 -0
  7. package/dist/cli/commands/describe.js.map +1 -0
  8. package/dist/cli/commands/events.d.ts +21 -0
  9. package/dist/cli/commands/events.d.ts.map +1 -0
  10. package/dist/cli/commands/events.js +59 -0
  11. package/dist/cli/commands/events.js.map +1 -0
  12. package/dist/cli/commands/fleet.d.ts +15 -0
  13. package/dist/cli/commands/fleet.d.ts.map +1 -0
  14. package/dist/cli/commands/fleet.js +149 -0
  15. package/dist/cli/commands/fleet.js.map +1 -0
  16. package/dist/cli/commands/help.d.ts +15 -0
  17. package/dist/cli/commands/help.d.ts.map +1 -0
  18. package/dist/cli/commands/help.js +93 -0
  19. package/dist/cli/commands/help.js.map +1 -0
  20. package/dist/cli/commands/migrate.d.ts +27 -0
  21. package/dist/cli/commands/migrate.d.ts.map +1 -0
  22. package/dist/cli/commands/migrate.js +109 -0
  23. package/dist/cli/commands/migrate.js.map +1 -0
  24. package/dist/cli/commands/run.d.ts +38 -0
  25. package/dist/cli/commands/run.d.ts.map +1 -0
  26. package/dist/cli/commands/run.js +535 -0
  27. package/dist/cli/commands/run.js.map +1 -0
  28. package/dist/cli/commands/schema.d.ts +8 -0
  29. package/dist/cli/commands/schema.d.ts.map +1 -0
  30. package/dist/cli/commands/schema.js +12 -0
  31. package/dist/cli/commands/schema.js.map +1 -0
  32. package/dist/cli/commands/serve.d.ts +39 -0
  33. package/dist/cli/commands/serve.d.ts.map +1 -0
  34. package/dist/cli/commands/serve.js +65 -0
  35. package/dist/cli/commands/serve.js.map +1 -0
  36. package/dist/cli/commands/undo.d.ts +36 -0
  37. package/dist/cli/commands/undo.d.ts.map +1 -0
  38. package/dist/cli/commands/undo.js +132 -0
  39. package/dist/cli/commands/undo.js.map +1 -0
  40. package/dist/cli/fixtures.d.ts +17 -0
  41. package/dist/cli/fixtures.d.ts.map +1 -0
  42. package/dist/cli/fixtures.js +107 -0
  43. package/dist/cli/fixtures.js.map +1 -0
  44. package/dist/cli/hardening.d.ts +39 -0
  45. package/dist/cli/hardening.d.ts.map +1 -0
  46. package/dist/cli/hardening.js +68 -0
  47. package/dist/cli/hardening.js.map +1 -0
  48. package/dist/cli/index.d.ts +28 -0
  49. package/dist/cli/index.d.ts.map +1 -0
  50. package/dist/cli/index.js +19 -0
  51. package/dist/cli/index.js.map +1 -0
  52. package/dist/cli/llm/openrouter.d.ts +33 -0
  53. package/dist/cli/llm/openrouter.d.ts.map +1 -0
  54. package/dist/cli/llm/openrouter.js +285 -0
  55. package/dist/cli/llm/openrouter.js.map +1 -0
  56. package/dist/cli/main.d.ts +32 -0
  57. package/dist/cli/main.d.ts.map +1 -0
  58. package/dist/cli/main.js +106 -0
  59. package/dist/cli/main.js.map +1 -0
  60. package/dist/cli/output.d.ts +36 -0
  61. package/dist/cli/output.d.ts.map +1 -0
  62. package/dist/cli/output.js +95 -0
  63. package/dist/cli/output.js.map +1 -0
  64. package/dist/cli/parse.d.ts +26 -0
  65. package/dist/cli/parse.d.ts.map +1 -0
  66. package/dist/cli/parse.js +160 -0
  67. package/dist/cli/parse.js.map +1 -0
  68. package/dist/cli/session-log.d.ts +34 -0
  69. package/dist/cli/session-log.d.ts.map +1 -0
  70. package/dist/cli/session-log.js +52 -0
  71. package/dist/cli/session-log.js.map +1 -0
  72. package/dist/cli/spec.d.ts +62 -0
  73. package/dist/cli/spec.d.ts.map +1 -0
  74. package/dist/cli/spec.js +510 -0
  75. package/dist/cli/spec.js.map +1 -0
  76. package/dist/cli/ui/RunView.d.ts +134 -0
  77. package/dist/cli/ui/RunView.d.ts.map +1 -0
  78. package/dist/cli/ui/RunView.js +341 -0
  79. package/dist/cli/ui/RunView.js.map +1 -0
  80. package/dist/events/codec.d.ts +79 -0
  81. package/dist/events/codec.d.ts.map +1 -0
  82. package/dist/events/codec.js +142 -0
  83. package/dist/events/codec.js.map +1 -0
  84. package/dist/events/log-core.d.ts +76 -0
  85. package/dist/events/log-core.d.ts.map +1 -0
  86. package/dist/events/log-core.js +73 -0
  87. package/dist/events/log-core.js.map +1 -0
  88. package/dist/events/log.d.ts +60 -0
  89. package/dist/events/log.d.ts.map +1 -0
  90. package/dist/events/log.js +193 -0
  91. package/dist/events/log.js.map +1 -0
  92. package/dist/events/replay.d.ts +106 -0
  93. package/dist/events/replay.d.ts.map +1 -0
  94. package/dist/events/replay.js +137 -0
  95. package/dist/events/replay.js.map +1 -0
  96. package/dist/events/wrap.d.ts +100 -0
  97. package/dist/events/wrap.d.ts.map +1 -0
  98. package/dist/events/wrap.js +141 -0
  99. package/dist/events/wrap.js.map +1 -0
  100. package/dist/index.d.ts +52 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +37 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/llm-adapter.d.ts +96 -0
  105. package/dist/llm-adapter.d.ts.map +1 -0
  106. package/dist/llm-adapter.js +132 -0
  107. package/dist/llm-adapter.js.map +1 -0
  108. package/dist/mcp/serve.d.ts +70 -0
  109. package/dist/mcp/serve.d.ts.map +1 -0
  110. package/dist/mcp/serve.js +154 -0
  111. package/dist/mcp/serve.js.map +1 -0
  112. package/dist/metrics/runs.d.ts +58 -0
  113. package/dist/metrics/runs.d.ts.map +1 -0
  114. package/dist/metrics/runs.js +99 -0
  115. package/dist/metrics/runs.js.map +1 -0
  116. package/dist/metrics.d.ts +38 -0
  117. package/dist/metrics.d.ts.map +1 -0
  118. package/dist/metrics.js +123 -0
  119. package/dist/metrics.js.map +1 -0
  120. package/dist/node.d.ts +22 -0
  121. package/dist/node.d.ts.map +1 -0
  122. package/dist/node.js +22 -0
  123. package/dist/node.js.map +1 -0
  124. package/dist/session.d.ts +10 -0
  125. package/dist/session.d.ts.map +1 -0
  126. package/dist/session.js +179 -0
  127. package/dist/session.js.map +1 -0
  128. package/dist/storage.d.ts +14 -0
  129. package/dist/storage.d.ts.map +1 -0
  130. package/dist/storage.js +58 -0
  131. package/dist/storage.js.map +1 -0
  132. package/dist/strategy.d.ts +26 -0
  133. package/dist/strategy.d.ts.map +1 -0
  134. package/dist/strategy.js +200 -0
  135. package/dist/strategy.js.map +1 -0
  136. package/dist/tools.d.ts +26 -0
  137. package/dist/tools.d.ts.map +1 -0
  138. package/dist/tools.js +129 -0
  139. package/dist/tools.js.map +1 -0
  140. package/dist/types/agent.d.ts +94 -0
  141. package/dist/types/agent.d.ts.map +1 -0
  142. package/dist/types/agent.js +17 -0
  143. package/dist/types/agent.js.map +1 -0
  144. package/dist/types/capabilities.d.ts +17 -0
  145. package/dist/types/capabilities.d.ts.map +1 -0
  146. package/dist/types/capabilities.js +13 -0
  147. package/dist/types/capabilities.js.map +1 -0
  148. package/dist/types/chat.d.ts +74 -0
  149. package/dist/types/chat.d.ts.map +1 -0
  150. package/dist/types/chat.js +10 -0
  151. package/dist/types/chat.js.map +1 -0
  152. package/dist/types/events.d.ts +115 -0
  153. package/dist/types/events.d.ts.map +1 -0
  154. package/dist/types/events.js +30 -0
  155. package/dist/types/events.js.map +1 -0
  156. package/dist/types/llm.d.ts +89 -0
  157. package/dist/types/llm.d.ts.map +1 -0
  158. package/dist/types/llm.js +12 -0
  159. package/dist/types/llm.js.map +1 -0
  160. package/dist/types/metrics.d.ts +34 -0
  161. package/dist/types/metrics.d.ts.map +1 -0
  162. package/dist/types/metrics.js +10 -0
  163. package/dist/types/metrics.js.map +1 -0
  164. package/dist/types/observer.d.ts +41 -0
  165. package/dist/types/observer.d.ts.map +1 -0
  166. package/dist/types/observer.js +41 -0
  167. package/dist/types/observer.js.map +1 -0
  168. package/dist/types/project-context.d.ts +18 -0
  169. package/dist/types/project-context.d.ts.map +1 -0
  170. package/dist/types/project-context.js +11 -0
  171. package/dist/types/project-context.js.map +1 -0
  172. package/dist/types/runtime.d.ts +71 -0
  173. package/dist/types/runtime.d.ts.map +1 -0
  174. package/dist/types/runtime.js +21 -0
  175. package/dist/types/runtime.js.map +1 -0
  176. package/dist/types/session.d.ts +103 -0
  177. package/dist/types/session.d.ts.map +1 -0
  178. package/dist/types/session.js +11 -0
  179. package/dist/types/session.js.map +1 -0
  180. package/dist/types/storage.d.ts +20 -0
  181. package/dist/types/storage.d.ts.map +1 -0
  182. package/dist/types/storage.js +41 -0
  183. package/dist/types/storage.js.map +1 -0
  184. package/dist/types/strategy.d.ts +76 -0
  185. package/dist/types/strategy.d.ts.map +1 -0
  186. package/dist/types/strategy.js +10 -0
  187. package/dist/types/strategy.js.map +1 -0
  188. package/dist/types/tools.d.ts +136 -0
  189. package/dist/types/tools.d.ts.map +1 -0
  190. package/dist/types/tools.js +11 -0
  191. package/dist/types/tools.js.map +1 -0
  192. package/dist/types/trace.d.ts +125 -0
  193. package/dist/types/trace.d.ts.map +1 -0
  194. package/dist/types/trace.js +24 -0
  195. package/dist/types/trace.js.map +1 -0
  196. package/dist/types/workspace.d.ts +29 -0
  197. package/dist/types/workspace.d.ts.map +1 -0
  198. package/dist/types/workspace.js +18 -0
  199. package/dist/types/workspace.js.map +1 -0
  200. package/package.json +45 -14
  201. package/skills/agent-cli.md +218 -0
  202. package/index.js +0 -2
@@ -0,0 +1,137 @@
1
+ /**
2
+ * `replayEvents()` — forward replay of a project's event log against a
3
+ * caller-supplied `ToolDispatch`.
4
+ *
5
+ * Pair to `wrapMutating()` + `agent undo`:
6
+ * - `wrapMutating` writes structured events as a side effect of
7
+ * running tools.
8
+ * - `undoCommand` walks the log backwards (commit → rollback) to
9
+ * reverse a single mutation.
10
+ * - `replayEvents()` walks the log forwards (`commit` events in id
11
+ * order) and re-dispatches each tool with its recorded args, so
12
+ * the same mutations can be re-applied to a *different* dispatch
13
+ * (typical case: dev simulator → production registry).
14
+ *
15
+ * Idempotency:
16
+ * - Each successfully-applied event gets a `migrate_applied` marker
17
+ * event written back to the same log (or a separate target log
18
+ * when `targetLog` is provided). Re-running `replayEvents()` skips
19
+ * events whose marker is already present, so partial-failure +
20
+ * retry is safe.
21
+ * - The caller can additionally provide `shouldApply` to gate
22
+ * events. The callback fires for every event (it is NOT a
23
+ * conflict-only hook); the caller is responsible for whatever
24
+ * state-read or business logic decides apply / skip / abort.
25
+ *
26
+ * Boundaries:
27
+ * - This function calls `dispatch.execute()`. It is therefore
28
+ * *not* CLI-safe — it expects a real dispatch wired to real
29
+ * services. The `agent migrate` subcommand only PLANS replay; the
30
+ * host runs `replayEvents()` against its prod dispatch.
31
+ * - **The dispatch handlers MUST be unwrapped.** If you re-apply
32
+ * `wrapMutating()` at replay time, each replayed event spawns a
33
+ * fresh plan/commit pair on the target log — and a subsequent
34
+ * replay run would try to re-replay those. Wrap on the system
35
+ * that PRODUCES the log; do not wrap on the system that CONSUMES
36
+ * it via replay.
37
+ */
38
+ const APPLIED_MARKER_TYPE = 'migrate_applied';
39
+ export class ReplayInvariantError extends Error {
40
+ name = 'ReplayInvariantError';
41
+ }
42
+ export async function* replayEvents(opts) {
43
+ const targetLog = opts.targetLog ?? opts.log;
44
+ const agent = opts.agent ?? 'replay';
45
+ const sessionId = opts.sessionId ?? `replay-${Date.now().toString(36)}`;
46
+ const toolAllow = opts.toolAllowlist ? new Set(opts.toolAllowlist) : null;
47
+ const pathDeny = opts.pathDenyList ? new Set(opts.pathDenyList) : null;
48
+ const applied = opts.dryRun ? new Set() : targetLog.appliedEventIds();
49
+ const all = opts.log
50
+ .read({ phase: 'commit' })
51
+ // Markers written by a prior `replayEvents()` run are themselves
52
+ // commit-phase events — exclude them so re-runs don't try to
53
+ // replay bookkeeping rows.
54
+ .filter((e) => e.metadata?.type !== APPLIED_MARKER_TYPE);
55
+ // Stable in-emission-order (event ids are lexically sortable by ts prefix).
56
+ all.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
57
+ let total = 0;
58
+ let appliedCount = 0;
59
+ let skippedCount = 0;
60
+ let errorCount = 0;
61
+ for (const event of all) {
62
+ if (opts.sinceEventId && event.id < opts.sinceEventId)
63
+ continue;
64
+ total += 1;
65
+ if (toolAllow && !toolAllow.has(event.tool)) {
66
+ yield { type: 'skipped', event, reason: 'tool_denied' };
67
+ skippedCount += 1;
68
+ continue;
69
+ }
70
+ if (pathDeny && pathDeny.has(event.target.path)) {
71
+ yield { type: 'skipped', event, reason: 'path_denied' };
72
+ skippedCount += 1;
73
+ continue;
74
+ }
75
+ if (event.args === undefined) {
76
+ // Every commit event written by wrapMutating carries args. An
77
+ // event without args is either a bookkeeping marker (caught
78
+ // above) or a manually-appended commit that didn't follow the
79
+ // protocol — fail loudly rather than silently skipping.
80
+ throw new ReplayInvariantError(`event ${event.id} has phase=commit and target.kind=${event.target.kind} but no args. ` +
81
+ `Commit events emitted by wrapMutating always carry args. ` +
82
+ `If you're appending commits manually, include args. ` +
83
+ `Reading log: ${opts.log.path}`);
84
+ }
85
+ if (!opts.dryRun && applied.has(event.id)) {
86
+ yield { type: 'skipped', event, reason: 'already_applied' };
87
+ skippedCount += 1;
88
+ continue;
89
+ }
90
+ if (opts.dryRun) {
91
+ yield { type: 'plan', event };
92
+ continue;
93
+ }
94
+ const decision = opts.shouldApply ? opts.shouldApply(event) : 'apply';
95
+ if (decision === 'abort') {
96
+ yield { type: 'error', event, message: 'shouldApply returned abort' };
97
+ errorCount += 1;
98
+ return;
99
+ }
100
+ if (decision === 'skip') {
101
+ yield { type: 'skipped', event, reason: 'shouldapply_skip' };
102
+ skippedCount += 1;
103
+ continue;
104
+ }
105
+ try {
106
+ const result = await opts.dispatch.execute({ id: `replay-${event.id}`, name: event.tool, args: event.args }, opts.toolContext());
107
+ if (!result.ok) {
108
+ yield { type: 'error', event, message: result.summary };
109
+ errorCount += 1;
110
+ continue;
111
+ }
112
+ const marker = targetLog.append({
113
+ agent,
114
+ sessionId,
115
+ tool: event.tool,
116
+ phase: 'commit',
117
+ target: { kind: 'other', path: `replay/${event.id}` },
118
+ reversible: false,
119
+ irreversibleReason: 'migrate_applied markers are bookkeeping, not state changes',
120
+ metadata: {
121
+ type: APPLIED_MARKER_TYPE,
122
+ appliedEventId: event.id,
123
+ originalTool: event.tool,
124
+ originalTarget: event.target,
125
+ },
126
+ });
127
+ yield { type: 'applied', event, markerId: marker.id, result };
128
+ appliedCount += 1;
129
+ }
130
+ catch (err) {
131
+ yield { type: 'error', event, message: err instanceof Error ? err.message : String(err) };
132
+ errorCount += 1;
133
+ }
134
+ }
135
+ yield { type: 'done', total, applied: appliedCount, skipped: skippedCount, errors: errorCount };
136
+ }
137
+ //# sourceMappingURL=replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/events/replay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * `wrapMutating()` — decorate a `ToolHandler` so every invocation emits
3
+ * plan + commit (or plan + rollback) events to a project's event log.
4
+ *
5
+ * Each wrapped handler is still a regular `ToolHandler` — it can be
6
+ * registered in any `ToolRegistry` and dispatched normally. The
7
+ * wrapping is invisible to the strategy / session.
8
+ *
9
+ * ## CRITICAL INVARIANT: wrap on the producer, NOT on the consumer
10
+ *
11
+ * Wrap your handlers on the system that PRODUCES the log (the dev
12
+ * environment, the agent session generating mutations). Do NOT wrap
13
+ * the handlers on the system that CONSUMES the log via
14
+ * `replayEvents()`. If you do:
15
+ *
16
+ * 1. Each replayed event spawns its own plan/commit pair on the
17
+ * target log (not just a `migrate_applied` marker).
18
+ * 2. A subsequent replay run sees those new commits and tries to
19
+ * re-replay them — loop possible.
20
+ *
21
+ * In code: dev registers `wrapMutating(setDoc, {...})`. Prod
22
+ * registers the BARE `setDoc` (no wrap). `replayEvents` dispatches
23
+ * dev's log against prod's bare registry. Markers go to the log;
24
+ * mutations go to prod state. Auditable from either side.
25
+ *
26
+ * Use `isWrappedHandler(handler)` to assert: a defensive check
27
+ * before dispatching unknown registries through replay.
28
+ *
29
+ * ## Pattern
30
+ *
31
+ * const wrapped = wrapMutating(writeRulesHandler, {
32
+ * log,
33
+ * sessionId: 'sess-1',
34
+ * target: (args) => ({ kind: 'workspace', path: 'workspace.rules' }),
35
+ * snapshot: async (_args, ctx) => ctx.workspace.rules,
36
+ * reverseOp: (args, _result) => ({
37
+ * tool: 'writeRules',
38
+ * args: { source: args.previousSource },
39
+ * }),
40
+ * });
41
+ *
42
+ * ## Failure semantics
43
+ *
44
+ * - Handler throws / promise rejects → emit rollback event with
45
+ * `reason: 'failure'`, re-throw. The strategy / dispatcher sees
46
+ * the error normally.
47
+ * - Handler returns `{ ok: false }` → still emit commit (the
48
+ * mutation didn't happen, but the *intent* was reached and the
49
+ * audit log should show the attempt + result). Most external API
50
+ * handlers follow this pattern.
51
+ */
52
+ import type { MutationTarget, ReverseOp } from '../types/events.js';
53
+ import type { ToolContext, ToolHandler, ToolResult } from '../types/tools.js';
54
+ import { type EventLog } from './log-core.js';
55
+ export interface WrapMutatingOptions<A, D> {
56
+ /** Where to append events. */
57
+ log: EventLog;
58
+ /** Session id used on every event. Same id as the active AgentSession. */
59
+ sessionId: string;
60
+ /** Naming the agent that's invoking this tool. Default: `'host'`. */
61
+ agent?: string;
62
+ /** Compute the `target` field from the handler's args. Called for
63
+ * both the plan and commit events. */
64
+ target: (args: A, ctx: ToolContext) => MutationTarget;
65
+ /** Optional snapshot of the *before* state. Called once, before
66
+ * execute. Returned value lands on the plan event AND the commit
67
+ * event so an auditor can diff. */
68
+ snapshot?: (args: A, ctx: ToolContext) => Promise<unknown> | unknown;
69
+ /** Compute the reverse operation. Called after a successful execute.
70
+ * Receives the `before` value `opts.snapshot` returned (or `undefined`
71
+ * when no snapshot was configured) so the reverse can restore the
72
+ * exact pre-mutation state. Return `null` (or omit the option) for
73
+ * irreversible mutations — the commit event then carries
74
+ * `reversible: false`. */
75
+ reverseOp?: (args: A, result: ToolResult<D>, ctx: ToolContext, before: unknown) => ReverseOp | null;
76
+ /** When `reverseOp` is omitted entirely (not just returning null on
77
+ * a given call), default to false. Set to true for handlers that
78
+ * *could* be reversible but don't need to declare the reverse op
79
+ * ahead of time (rare). */
80
+ reversibleByDefault?: boolean;
81
+ /** When the mutation is irreversible, why. Surfaced to `agent undo`. */
82
+ irreversibleReason?: string;
83
+ /** Optional static metadata stamped on every event from this tool. */
84
+ metadata?: Record<string, unknown>;
85
+ }
86
+ /**
87
+ * Non-enumerable marker added to every `wrapMutating()` output.
88
+ * Used by `isWrappedHandler` to assert "this handler is NOT what
89
+ * you want in a prod replay target."
90
+ */
91
+ export declare const WRAPPED_MARKER: unique symbol;
92
+ /**
93
+ * Returns true when `handler` was produced by `wrapMutating()`.
94
+ * Use this in your replay target's setup to assert that no handler
95
+ * is wrapped — wrapped handlers in a replay target spawn runaway
96
+ * plan/commit cascades. See `wrapMutating`'s header.
97
+ */
98
+ export declare function isWrappedHandler(handler: ToolHandler): boolean;
99
+ export declare function wrapMutating<A = unknown, D = unknown>(handler: ToolHandler<A, D>, opts: WrapMutatingOptions<A, D>): ToolHandler<A, D>;
100
+ //# sourceMappingURL=wrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../src/events/wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,OAAO,KAAK,EAAiB,cAAc,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,KAAK,QAAQ,EAAqC,MAAM,eAAe,CAAC;AAEjF,MAAM,WAAW,mBAAmB,CAAC,CAAC,EAAE,CAAC;IACvC,8BAA8B;IAC9B,GAAG,EAAE,QAAQ,CAAC;IACd,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;2CACuC;IACvC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,KAAK,cAAc,CAAC;IACtD;;wCAEoC;IACpC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACrE;;;;;+BAK2B;IAC3B,SAAS,CAAC,EAAE,CACV,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EACrB,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,OAAO,KACZ,SAAS,GAAG,IAAI,CAAC;IACtB;;;gCAG4B;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,wEAAwE;IACxE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,OAAO,MAAoD,CAAC;AAEzF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAE9D;AAED,wBAAgB,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EACnD,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,IAAI,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC9B,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CA+EnB"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * `wrapMutating()` — decorate a `ToolHandler` so every invocation emits
3
+ * plan + commit (or plan + rollback) events to a project's event log.
4
+ *
5
+ * Each wrapped handler is still a regular `ToolHandler` — it can be
6
+ * registered in any `ToolRegistry` and dispatched normally. The
7
+ * wrapping is invisible to the strategy / session.
8
+ *
9
+ * ## CRITICAL INVARIANT: wrap on the producer, NOT on the consumer
10
+ *
11
+ * Wrap your handlers on the system that PRODUCES the log (the dev
12
+ * environment, the agent session generating mutations). Do NOT wrap
13
+ * the handlers on the system that CONSUMES the log via
14
+ * `replayEvents()`. If you do:
15
+ *
16
+ * 1. Each replayed event spawns its own plan/commit pair on the
17
+ * target log (not just a `migrate_applied` marker).
18
+ * 2. A subsequent replay run sees those new commits and tries to
19
+ * re-replay them — loop possible.
20
+ *
21
+ * In code: dev registers `wrapMutating(setDoc, {...})`. Prod
22
+ * registers the BARE `setDoc` (no wrap). `replayEvents` dispatches
23
+ * dev's log against prod's bare registry. Markers go to the log;
24
+ * mutations go to prod state. Auditable from either side.
25
+ *
26
+ * Use `isWrappedHandler(handler)` to assert: a defensive check
27
+ * before dispatching unknown registries through replay.
28
+ *
29
+ * ## Pattern
30
+ *
31
+ * const wrapped = wrapMutating(writeRulesHandler, {
32
+ * log,
33
+ * sessionId: 'sess-1',
34
+ * target: (args) => ({ kind: 'workspace', path: 'workspace.rules' }),
35
+ * snapshot: async (_args, ctx) => ctx.workspace.rules,
36
+ * reverseOp: (args, _result) => ({
37
+ * tool: 'writeRules',
38
+ * args: { source: args.previousSource },
39
+ * }),
40
+ * });
41
+ *
42
+ * ## Failure semantics
43
+ *
44
+ * - Handler throws / promise rejects → emit rollback event with
45
+ * `reason: 'failure'`, re-throw. The strategy / dispatcher sees
46
+ * the error normally.
47
+ * - Handler returns `{ ok: false }` → still emit commit (the
48
+ * mutation didn't happen, but the *intent* was reached and the
49
+ * audit log should show the attempt + result). Most external API
50
+ * handlers follow this pattern.
51
+ */
52
+ import { HOST_AGENT_ID, buildRollbackEvent } from './log-core.js';
53
+ /**
54
+ * Non-enumerable marker added to every `wrapMutating()` output.
55
+ * Used by `isWrappedHandler` to assert "this handler is NOT what
56
+ * you want in a prod replay target."
57
+ */
58
+ export const WRAPPED_MARKER = Symbol.for('@inbrowser/agent/wrapMutating');
59
+ /**
60
+ * Returns true when `handler` was produced by `wrapMutating()`.
61
+ * Use this in your replay target's setup to assert that no handler
62
+ * is wrapped — wrapped handlers in a replay target spawn runaway
63
+ * plan/commit cascades. See `wrapMutating`'s header.
64
+ */
65
+ export function isWrappedHandler(handler) {
66
+ return handler[WRAPPED_MARKER] === true;
67
+ }
68
+ export function wrapMutating(handler, opts) {
69
+ const agent = opts.agent ?? HOST_AGENT_ID;
70
+ const wrapped = {
71
+ name: handler.name,
72
+ description: handler.description,
73
+ parameters: handler.parameters,
74
+ ...(handler.available ? { available: handler.available } : {}),
75
+ async execute(args, ctx) {
76
+ const target = opts.target(args, ctx);
77
+ const before = opts.snapshot ? await opts.snapshot(args, ctx) : undefined;
78
+ const planEvent = opts.log.append({
79
+ agent,
80
+ sessionId: opts.sessionId,
81
+ tool: handler.name,
82
+ args,
83
+ phase: 'plan',
84
+ target,
85
+ ...(before !== undefined ? { before } : {}),
86
+ reversible: opts.reversibleByDefault ?? !!opts.reverseOp,
87
+ ...(opts.irreversibleReason ? { irreversibleReason: opts.irreversibleReason } : {}),
88
+ ...(opts.metadata ? { metadata: opts.metadata } : {}),
89
+ });
90
+ void planEvent;
91
+ let result;
92
+ try {
93
+ result = await handler.execute(args, ctx);
94
+ }
95
+ catch (err) {
96
+ opts.log.append(buildRollbackEvent({
97
+ original: planEvent,
98
+ reason: 'failure',
99
+ agent,
100
+ sessionId: opts.sessionId,
101
+ }));
102
+ throw err;
103
+ }
104
+ const reverseOp = opts.reverseOp ? opts.reverseOp(args, result, ctx, before) : null;
105
+ opts.log.append({
106
+ agent,
107
+ sessionId: opts.sessionId,
108
+ tool: handler.name,
109
+ args,
110
+ phase: 'commit',
111
+ target,
112
+ ...(before !== undefined ? { before } : {}),
113
+ after: result.data,
114
+ reversible: !!reverseOp,
115
+ ...(reverseOp ? { reverseOp } : {}),
116
+ ...(reverseOp
117
+ ? {}
118
+ : opts.irreversibleReason
119
+ ? { irreversibleReason: opts.irreversibleReason }
120
+ : {}),
121
+ metadata: {
122
+ ...(opts.metadata ?? {}),
123
+ planEventId: planEvent.id,
124
+ ok: result.ok,
125
+ ...(result.summary ? { summary: result.summary } : {}),
126
+ },
127
+ });
128
+ return result;
129
+ },
130
+ };
131
+ // Stamp the wrapped marker as a non-enumerable property so it
132
+ // doesn't leak into JSON serialization (e.g. inside tool decls).
133
+ Object.defineProperty(wrapped, WRAPPED_MARKER, {
134
+ value: true,
135
+ enumerable: false,
136
+ writable: false,
137
+ configurable: false,
138
+ });
139
+ return wrapped;
140
+ }
141
+ //# sourceMappingURL=wrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap.js","sourceRoot":"","sources":["../../src/events/wrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * `@inbrowser/agent` — agent runtime + agent-friendly CLI.
3
+ *
4
+ * The library surface (this module) exports the primitives the
5
+ * playground UI consumes: `AgentSession`, `AgentStrategy`, `ToolRegistry`,
6
+ * `LlmClient`, `MetricsCollector`, `SandboxObserver`, plus the default
7
+ * `createReactLoopStrategy()` and `createAgentSession()`.
8
+ *
9
+ * The CLI surface lives under `@inbrowser/agent/cli` and the `agent` binary
10
+ * — see `src/cli/main.ts` and the package's `AGENTS.md` for invariants.
11
+ *
12
+ * No React, no DOM, no localStorage, no fetch. All I/O is via injected
13
+ * interfaces.
14
+ */
15
+ export type { Workspace, StitchContext } from './types/workspace.js';
16
+ export { EMPTY_WORKSPACE } from './types/workspace.js';
17
+ export type { ProjectContext } from './types/project-context.js';
18
+ export type { RuntimeState, TerminalSection, TerminalEntry, RunSummary, DeployState, DeployMessage, ParseError, UiError, } from './types/runtime.js';
19
+ export { EMPTY_RUNTIME } from './types/runtime.js';
20
+ export type { ChatMessage, ChatRole, ToolCall as ChatToolCall, TurnMetrics, TurnDetails, NormalizedMessage, } from './types/chat.js';
21
+ export type { LlmClient, LlmClientFactory, LlmConfig, ChatRequest, ChatEvent, ToolDeclaration, JsonSchema, RawUsage, } from './types/llm.js';
22
+ export { legacyProviderAsLlmClient } from './llm-adapter.js';
23
+ export type { LegacyProvider, LegacyChatTurnResult, LegacyChatCallbacks, LegacyChatMessage, LegacyToolDecl, LegacyProviderUsage, LegacyTurnDetails, } from './llm-adapter.js';
24
+ export type { ToolHandler, ToolContext, ToolResult, ToolCall, ToolRegistry, ToolDispatch, SandboxHandle, LintFn, LintWarning, StitchClient, } from './types/tools.js';
25
+ export { createToolRegistry, createDispatch } from './tools.js';
26
+ export type { Capabilities } from './types/capabilities.js';
27
+ export { DEFAULT_CAPABILITIES } from './types/capabilities.js';
28
+ export type { AgentSession, AgentSessionConfig, SessionEvent, } from './types/session.js';
29
+ export { createAgentSession } from './session.js';
30
+ export type { AgentStrategy, StrategyRunInput, StrategyEvent, } from './types/strategy.js';
31
+ export { createReactLoopStrategy } from './strategy.js';
32
+ export type { Tracer, TraceEvent, LlmRequestTrace, LlmResponseTrace, ToolDeclarationView, } from './types/trace.js';
33
+ export type { MetricsCollector, RecordTurnInput, SessionTotals, } from './types/metrics.js';
34
+ export { computeTurnMetrics, createMetricsCollector, findPricing, } from './metrics.js';
35
+ export type { Storage } from './types/storage.js';
36
+ export { noopStorage, createMemoryStorage } from './types/storage.js';
37
+ export { createLocalStorageAdapter } from './storage.js';
38
+ export type { ObserverEvent, SandboxObserver, } from './types/observer.js';
39
+ export { combineObservers, noopObserver } from './types/observer.js';
40
+ export type { AgentDefinition, AgentTool, AgentContext, AgentToolResult, } from './types/agent.js';
41
+ export type { ServeAgentsOptions, ServeAgentsHandle } from './mcp/serve.js';
42
+ export type { RunRecord, RunRecordFilter, RunLog, OpenRunLogOptions, } from './metrics/runs.js';
43
+ export type { MutationEvent, MutationEventFilter, MutationPhase, MutationTarget, ReverseOp, TargetKind, } from './types/events.js';
44
+ export { wrapMutating, isWrappedHandler, WRAPPED_MARKER } from './events/wrap.js';
45
+ export type { WrapMutatingOptions } from './events/wrap.js';
46
+ export { replayEvents, ReplayInvariantError } from './events/replay.js';
47
+ export type { ReplayOptions, ReplayProgress } from './events/replay.js';
48
+ export { defaultEventValueCodec, identityCodec, composeCodecs, walkValue, ENVELOPE_KEY, } from './events/codec.js';
49
+ export type { EventValueCodec } from './events/codec.js';
50
+ export type { EventLog, AppendDraft } from './events/log-core.js';
51
+ export type { EventLogIO, OpenEventLogOptions } from './events/log.js';
52
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,37 @@
1
+ /**
2
+ * `@inbrowser/agent` — agent runtime + agent-friendly CLI.
3
+ *
4
+ * The library surface (this module) exports the primitives the
5
+ * playground UI consumes: `AgentSession`, `AgentStrategy`, `ToolRegistry`,
6
+ * `LlmClient`, `MetricsCollector`, `SandboxObserver`, plus the default
7
+ * `createReactLoopStrategy()` and `createAgentSession()`.
8
+ *
9
+ * The CLI surface lives under `@inbrowser/agent/cli` and the `agent` binary
10
+ * — see `src/cli/main.ts` and the package's `AGENTS.md` for invariants.
11
+ *
12
+ * No React, no DOM, no localStorage, no fetch. All I/O is via injected
13
+ * interfaces.
14
+ */
15
+ export { EMPTY_WORKSPACE } from './types/workspace.js';
16
+ export { EMPTY_RUNTIME } from './types/runtime.js';
17
+ export { legacyProviderAsLlmClient } from './llm-adapter.js';
18
+ export { createToolRegistry, createDispatch } from './tools.js';
19
+ export { DEFAULT_CAPABILITIES } from './types/capabilities.js';
20
+ export { createAgentSession } from './session.js';
21
+ export { createReactLoopStrategy } from './strategy.js';
22
+ export { computeTurnMetrics, createMetricsCollector, findPricing, } from './metrics.js';
23
+ export { noopStorage, createMemoryStorage } from './types/storage.js';
24
+ export { createLocalStorageAdapter } from './storage.js';
25
+ export { combineObservers, noopObserver } from './types/observer.js';
26
+ // Browser-safe events utilities — wrap, replay, codec. These live
27
+ // in files that don't import `node:fs` / `node:os`, so they're safe
28
+ // on the universal entry. Import them DIRECTLY (not via
29
+ // `./events/index.js`) because that barrel re-exports `./events/log.js`,
30
+ // which DOES pull in Node builtins.
31
+ //
32
+ // Node-only event log values (openEventLog, defaultProjectLogDir,
33
+ // HOST_AGENT_ID, etc.) live on `@inbrowser/agent/node` — see src/node.ts.
34
+ export { wrapMutating, isWrappedHandler, WRAPPED_MARKER } from './events/wrap.js';
35
+ export { replayEvents, ReplayInvariantError } from './events/replay.js';
36
+ export { defaultEventValueCodec, identityCodec, composeCodecs, walkValue, ENVELOPE_KEY, } from './events/codec.js';
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAcvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAqBnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAuB7D,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGhE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAO/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAOlD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAexD,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,GACZ,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAMzD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AA+BrE,kEAAkE;AAClE,oEAAoE;AACpE,wDAAwD;AACxD,yEAAyE;AACzE,oCAAoC;AACpC,EAAE;AACF,kEAAkE;AAClE,0EAA0E;AAC1E,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElF,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAExE,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,SAAS,EACT,YAAY,GACb,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Adapter from the playground's existing `LlmProvider` shape to the
3
+ * core `LlmClient` interface. Lets new core code (AgentSession,
4
+ * AgentStrategy) consume providers via the narrow event-stream
5
+ * surface without each provider needing a refactor.
6
+ *
7
+ * The existing `LlmProvider` is callback-based (`onText`,
8
+ * `onToolCall`, etc.) and lives in the React host alongside its
9
+ * BYOK forms + localStorage wiring. This file flips it into the
10
+ * `AsyncIterable<ChatEvent>` shape the core wants.
11
+ *
12
+ * Each provider can later migrate to natively implement `LlmClient`
13
+ * to drop this adapter. The plan calls this "slice 4 — one
14
+ * provider at a time"; the adapter exists so slice 4 doesn't have
15
+ * to land atomically.
16
+ */
17
+ import type { LlmClient } from './types/llm.js';
18
+ /**
19
+ * Minimal external surface the adapter expects. Matches the shape
20
+ * `examples/admin-compat-browser/src/llm.ts` exports. We re-declare
21
+ * it here so `@inbrowser/agent` doesn't import from the playground.
22
+ */
23
+ export interface LegacyProviderUsage {
24
+ promptTokens?: number;
25
+ outputTokens?: number;
26
+ totalTokens?: number;
27
+ costUsd?: number;
28
+ costEstimated?: boolean;
29
+ cachedTokens?: number;
30
+ reasoningTokens?: number;
31
+ isByok?: boolean;
32
+ }
33
+ export interface LegacyTurnDetails {
34
+ generationId?: string;
35
+ servedModel?: string;
36
+ requestedModel?: string;
37
+ fingerprint?: string;
38
+ routing?: Record<string, unknown>;
39
+ }
40
+ export interface LegacyChatTurnResult {
41
+ text?: string;
42
+ thinking?: string;
43
+ finishReason?: 'stop' | 'tool' | 'abort' | 'error';
44
+ usage?: LegacyProviderUsage;
45
+ details?: LegacyTurnDetails;
46
+ }
47
+ export interface LegacyChatCallbacks {
48
+ onText(chunk: string): void;
49
+ onThinking?(chunk: string): void;
50
+ onToolCall(call: {
51
+ callId: string;
52
+ name: string;
53
+ args: unknown;
54
+ signature?: string;
55
+ }): void;
56
+ signal?: AbortSignal;
57
+ }
58
+ export interface LegacyToolDecl {
59
+ name: string;
60
+ description: string;
61
+ parameters: unknown;
62
+ }
63
+ export interface LegacyChatMessage {
64
+ role: 'system' | 'user' | 'assistant' | 'tool';
65
+ text?: string;
66
+ toolCalls?: {
67
+ callId: string;
68
+ name: string;
69
+ args: unknown;
70
+ signature?: string;
71
+ }[];
72
+ callId?: string;
73
+ name?: string;
74
+ resultJson?: string;
75
+ }
76
+ export interface LegacyProvider {
77
+ readonly label: string;
78
+ readonly supportsTools?: boolean;
79
+ chatWithTools?(messages: LegacyChatMessage[], tools: LegacyToolDecl[], callbacks: LegacyChatCallbacks): Promise<LegacyChatTurnResult>;
80
+ ask(prompt: string, onChunk: (chunk: string) => void, options?: {
81
+ signal?: AbortSignal;
82
+ }): Promise<LegacyChatTurnResult>;
83
+ }
84
+ /**
85
+ * Wrap a legacy `LlmProvider` instance in the `LlmClient` shape.
86
+ * The adapter:
87
+ *
88
+ * - Translates `ChatRequest` → legacy `chatWithTools` / `ask`
89
+ * call.
90
+ * - Buffers callback events into an async queue and replays them
91
+ * as a `ChatEvent` `AsyncIterable`.
92
+ * - Forwards the final usage + details as a `turn_complete`
93
+ * event before closing the stream.
94
+ */
95
+ export declare function legacyProviderAsLlmClient(legacy: LegacyProvider, id: string): LlmClient;
96
+ //# sourceMappingURL=llm-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-adapter.d.ts","sourceRoot":"","sources":["../src/llm-adapter.ts"],"names":[],"mappings":"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"}