@autonome-research/thread-phase-agents 3.0.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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +207 -0
  3. package/dist/acp/adapter.d.ts +89 -0
  4. package/dist/acp/adapter.d.ts.map +1 -0
  5. package/dist/acp/adapter.js +461 -0
  6. package/dist/acp/adapter.js.map +1 -0
  7. package/dist/acp/index.d.ts +12 -0
  8. package/dist/acp/index.d.ts.map +1 -0
  9. package/dist/acp/index.js +10 -0
  10. package/dist/acp/index.js.map +1 -0
  11. package/dist/acp/transport.d.ts +82 -0
  12. package/dist/acp/transport.d.ts.map +1 -0
  13. package/dist/acp/transport.js +199 -0
  14. package/dist/acp/transport.js.map +1 -0
  15. package/dist/acp/types.d.ts +157 -0
  16. package/dist/acp/types.d.ts.map +1 -0
  17. package/dist/acp/types.js +34 -0
  18. package/dist/acp/types.js.map +1 -0
  19. package/dist/anthropic/adapter.d.ts +55 -0
  20. package/dist/anthropic/adapter.d.ts.map +1 -0
  21. package/dist/anthropic/adapter.js +259 -0
  22. package/dist/anthropic/adapter.js.map +1 -0
  23. package/dist/anthropic/index.d.ts +8 -0
  24. package/dist/anthropic/index.d.ts.map +1 -0
  25. package/dist/anthropic/index.js +8 -0
  26. package/dist/anthropic/index.js.map +1 -0
  27. package/dist/claude-code/adapter.d.ts +56 -0
  28. package/dist/claude-code/adapter.d.ts.map +1 -0
  29. package/dist/claude-code/adapter.js +319 -0
  30. package/dist/claude-code/adapter.js.map +1 -0
  31. package/dist/claude-code/index.d.ts +8 -0
  32. package/dist/claude-code/index.d.ts.map +1 -0
  33. package/dist/claude-code/index.js +8 -0
  34. package/dist/claude-code/index.js.map +1 -0
  35. package/dist/codex/adapter.d.ts +62 -0
  36. package/dist/codex/adapter.d.ts.map +1 -0
  37. package/dist/codex/adapter.js +258 -0
  38. package/dist/codex/adapter.js.map +1 -0
  39. package/dist/codex/index.d.ts +9 -0
  40. package/dist/codex/index.d.ts.map +1 -0
  41. package/dist/codex/index.js +9 -0
  42. package/dist/codex/index.js.map +1 -0
  43. package/dist/codex-cli/adapter.d.ts +70 -0
  44. package/dist/codex-cli/adapter.d.ts.map +1 -0
  45. package/dist/codex-cli/adapter.js +368 -0
  46. package/dist/codex-cli/adapter.js.map +1 -0
  47. package/dist/codex-cli/index.d.ts +10 -0
  48. package/dist/codex-cli/index.d.ts.map +1 -0
  49. package/dist/codex-cli/index.js +10 -0
  50. package/dist/codex-cli/index.js.map +1 -0
  51. package/dist/hermes/index.d.ts +50 -0
  52. package/dist/hermes/index.d.ts.map +1 -0
  53. package/dist/hermes/index.js +43 -0
  54. package/dist/hermes/index.js.map +1 -0
  55. package/dist/index.d.ts +11 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +14 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/injectors.d.ts +104 -0
  60. package/dist/injectors.d.ts.map +1 -0
  61. package/dist/injectors.js +219 -0
  62. package/dist/injectors.js.map +1 -0
  63. package/dist/openclaw/index.d.ts +54 -0
  64. package/dist/openclaw/index.d.ts.map +1 -0
  65. package/dist/openclaw/index.js +61 -0
  66. package/dist/openclaw/index.js.map +1 -0
  67. package/dist/pi/adapter.d.ts +79 -0
  68. package/dist/pi/adapter.d.ts.map +1 -0
  69. package/dist/pi/adapter.js +396 -0
  70. package/dist/pi/adapter.js.map +1 -0
  71. package/dist/pi/index.d.ts +14 -0
  72. package/dist/pi/index.d.ts.map +1 -0
  73. package/dist/pi/index.js +14 -0
  74. package/dist/pi/index.js.map +1 -0
  75. package/dist/thread-bridge.d.ts +83 -0
  76. package/dist/thread-bridge.d.ts.map +1 -0
  77. package/dist/thread-bridge.js +143 -0
  78. package/dist/thread-bridge.js.map +1 -0
  79. package/package.json +46 -0
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Pre-built `inject` callbacks for `withMemory` and `withThread`.
3
+ *
4
+ * Both wrappers in `thread-phase/agents` take a caller-supplied
5
+ * `inject` function because each adapter shapes its prompt field
6
+ * differently — `inferenceAgent` puts it on `config.config.systemPrompt`,
7
+ * Anthropic uses `systemPrompt`, Codex uses `instructions`, ACP-based
8
+ * adapters use `config.prompt`. Writing the right splicer at every
9
+ * call site is friction; these tables ship the canonical ones for the
10
+ * bundled adapter set.
11
+ *
12
+ * Composes with `withMemory` / `withThread`:
13
+ *
14
+ * const memoryAware = withMemory(claudeCodeAgent, {
15
+ * scope: { userId: 'alice' },
16
+ * inject: injectMemory.claudeCode,
17
+ * });
18
+ *
19
+ * const threadAware = withThread(hermesAgent, thread, {
20
+ * applyResume: injectResume.hermes,
21
+ * });
22
+ *
23
+ * The keys match each adapter's public id (`'claude-code'` → `claudeCode`
24
+ * etc., camelCased for TypeScript ergonomics).
25
+ *
26
+ * @internal
27
+ */
28
+ import type { InferenceAgentConfig, ResumeToken } from '@autonome-research/thread-phase/agents';
29
+ import type { AcpAgentConfig } from './acp/index.js';
30
+ import type { AnthropicAgentConfig } from './anthropic/index.js';
31
+ import type { ClaudeCodeAgentConfig } from './claude-code/index.js';
32
+ import type { CodexAgentConfig } from './codex/index.js';
33
+ import type { CodexCliAgentConfig } from './codex-cli/index.js';
34
+ import type { HermesAgentConfig } from './hermes/index.js';
35
+ import type { OpenClawAgentConfig } from './openclaw/index.js';
36
+ import type { PiAgentConfig } from './pi/index.js';
37
+ /** @internal */
38
+ export declare const injectMemory: {
39
+ /**
40
+ * Append memory to the agent runner's system prompt. Leaves config
41
+ * unchanged when memory is empty (first-run users with no recall).
42
+ */
43
+ inference(cfg: InferenceAgentConfig, memory: string): InferenceAgentConfig;
44
+ /** Append memory to Anthropic's system prompt. */
45
+ anthropic(cfg: AnthropicAgentConfig, memory: string): AnthropicAgentConfig;
46
+ /** Append memory to Codex's `instructions` (Responses API system equivalent). */
47
+ codex(cfg: CodexAgentConfig, memory: string): CodexAgentConfig;
48
+ /**
49
+ * Prepend memory to Claude Code's prompt. Claude Code's CLI has no
50
+ * separate system-prompt flag at this layer, so memory becomes part
51
+ * of the user prompt.
52
+ */
53
+ claudeCode(cfg: ClaudeCodeAgentConfig, memory: string): ClaudeCodeAgentConfig;
54
+ /**
55
+ * Prepend memory to the ACP prompt. ACP's `session/prompt` has no
56
+ * system slot — memory becomes part of the user message content.
57
+ * Preserves a non-text prompt (ContentBlock[]) by injecting the
58
+ * memory as a leading text block.
59
+ */
60
+ acp(cfg: AcpAgentConfig, memory: string): AcpAgentConfig;
61
+ /** Same shape as `acp` — Hermes is an ACP wrapper. */
62
+ hermes(cfg: HermesAgentConfig, memory: string): HermesAgentConfig;
63
+ /** Same shape as `acp` — OpenClaw is an ACP wrapper. */
64
+ openClaw(cfg: OpenClawAgentConfig, memory: string): OpenClawAgentConfig;
65
+ /**
66
+ * Prepend memory to codex CLI's positional prompt. Same pattern as
67
+ * claudeCode: no system-prompt flag, memory becomes part of the user
68
+ * prompt.
69
+ */
70
+ codexCli(cfg: CodexCliAgentConfig, memory: string): CodexCliAgentConfig;
71
+ /**
72
+ * Prepend memory to pi's prompt. Pi's `prompt(text)` takes a string;
73
+ * pi handles its own system prompt internally via prompt templates
74
+ * and resource loader.
75
+ */
76
+ pi(cfg: PiAgentConfig, memory: string): PiAgentConfig;
77
+ };
78
+ /** @internal */
79
+ export declare const injectResume: {
80
+ /** inferenceAgent declares `resumption: 'none'`; passthrough. */
81
+ inference(cfg: InferenceAgentConfig, _token: ResumeToken): InferenceAgentConfig;
82
+ /** anthropicAgent declares `resumption: 'none'`; passthrough. */
83
+ anthropic(cfg: AnthropicAgentConfig, _token: ResumeToken): AnthropicAgentConfig;
84
+ /** Codex's Responses API takes `previous_response_id` natively. */
85
+ codex(cfg: CodexAgentConfig, token: ResumeToken): CodexAgentConfig;
86
+ /** Claude Code's CLI takes `--resume <session-id>`. */
87
+ claudeCode(cfg: ClaudeCodeAgentConfig, token: ResumeToken): ClaudeCodeAgentConfig;
88
+ /** ACP's `session/load` takes a session id. */
89
+ acp(cfg: AcpAgentConfig, token: ResumeToken): AcpAgentConfig;
90
+ /** Hermes inherits ACP's resume path. */
91
+ hermes(cfg: HermesAgentConfig, token: ResumeToken): HermesAgentConfig;
92
+ /** OpenClaw inherits ACP's resume path. */
93
+ openClaw(cfg: OpenClawAgentConfig, token: ResumeToken): OpenClawAgentConfig;
94
+ /** Codex CLI uses thread-id-based resumption. */
95
+ codexCli(cfg: CodexCliAgentConfig, token: ResumeToken): CodexCliAgentConfig;
96
+ /**
97
+ * Pi resumption uses on-disk session files. Accepts either
98
+ * `session-file` (preferred — the actual session path) or `opaque`
99
+ * (treated as a session id for SessionManager lookup; falls through
100
+ * unchanged so the caller can set continueSession themselves).
101
+ */
102
+ pi(cfg: PiAgentConfig, token: ResumeToken): PiAgentConfig;
103
+ };
104
+ //# sourceMappingURL=injectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectors.d.ts","sourceRoot":"","sources":["../src/injectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,WAAW,EACZ,MAAM,wCAAwC,CAAC;AAEhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAQnD,gBAAgB;AAChB,eAAO,MAAM,YAAY;IACvB;;;OAGG;mBACY,oBAAoB,UAAU,MAAM,GAAG,oBAAoB;IAW1E,kDAAkD;mBACnC,oBAAoB,UAAU,MAAM,GAAG,oBAAoB;IAQ1E,iFAAiF;eACtE,gBAAgB,UAAU,MAAM,GAAG,gBAAgB;IAQ9D;;;;OAIG;oBACa,qBAAqB,UAAU,MAAM,GAAG,qBAAqB;IAQ7E;;;;;OAKG;aACM,cAAc,UAAU,MAAM,GAAG,cAAc;IAcxD,sDAAsD;gBAC1C,iBAAiB,UAAU,MAAM,GAAG,iBAAiB;IAcjE,wDAAwD;kBAC1C,mBAAmB,UAAU,MAAM,GAAG,mBAAmB;IAcvE;;;;OAIG;kBACW,mBAAmB,UAAU,MAAM,GAAG,mBAAmB;IAQvE;;;;OAIG;YACK,aAAa,UAAU,MAAM,GAAG,aAAa;CAOtD,CAAC;AAMF,gBAAgB;AAChB,eAAO,MAAM,YAAY;IACvB,iEAAiE;mBAClD,oBAAoB,UAAU,WAAW,GAAG,oBAAoB;IAI/E,iEAAiE;mBAClD,oBAAoB,UAAU,WAAW,GAAG,oBAAoB;IAI/E,mEAAmE;eACxD,gBAAgB,SAAS,WAAW,GAAG,gBAAgB;IAKlE,uDAAuD;oBACvC,qBAAqB,SAAS,WAAW,GAAG,qBAAqB;IAKjF,+CAA+C;aACtC,cAAc,SAAS,WAAW,GAAG,cAAc;IAK5D,yCAAyC;gBAC7B,iBAAiB,SAAS,WAAW,GAAG,iBAAiB;IAKrE,2CAA2C;kBAC7B,mBAAmB,SAAS,WAAW,GAAG,mBAAmB;IAK3E,iDAAiD;kBACnC,mBAAmB,SAAS,WAAW,GAAG,mBAAmB;IAK3E;;;;;OAKG;YACK,aAAa,SAAS,WAAW,GAAG,aAAa;CAM1D,CAAC"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Pre-built `inject` callbacks for `withMemory` and `withThread`.
3
+ *
4
+ * Both wrappers in `thread-phase/agents` take a caller-supplied
5
+ * `inject` function because each adapter shapes its prompt field
6
+ * differently — `inferenceAgent` puts it on `config.config.systemPrompt`,
7
+ * Anthropic uses `systemPrompt`, Codex uses `instructions`, ACP-based
8
+ * adapters use `config.prompt`. Writing the right splicer at every
9
+ * call site is friction; these tables ship the canonical ones for the
10
+ * bundled adapter set.
11
+ *
12
+ * Composes with `withMemory` / `withThread`:
13
+ *
14
+ * const memoryAware = withMemory(claudeCodeAgent, {
15
+ * scope: { userId: 'alice' },
16
+ * inject: injectMemory.claudeCode,
17
+ * });
18
+ *
19
+ * const threadAware = withThread(hermesAgent, thread, {
20
+ * applyResume: injectResume.hermes,
21
+ * });
22
+ *
23
+ * The keys match each adapter's public id (`'claude-code'` → `claudeCode`
24
+ * etc., camelCased for TypeScript ergonomics).
25
+ *
26
+ * @internal
27
+ */
28
+ // ---------------------------------------------------------------------------
29
+ // Memory injectors
30
+ // ---------------------------------------------------------------------------
31
+ const MEMORY_HEADER = '\n\nContext from prior interactions:\n';
32
+ /** @internal */
33
+ export const injectMemory = {
34
+ /**
35
+ * Append memory to the agent runner's system prompt. Leaves config
36
+ * unchanged when memory is empty (first-run users with no recall).
37
+ */
38
+ inference(cfg, memory) {
39
+ if (!memory)
40
+ return cfg;
41
+ return {
42
+ ...cfg,
43
+ config: {
44
+ ...cfg.config,
45
+ systemPrompt: `${cfg.config.systemPrompt}${MEMORY_HEADER}${memory}`,
46
+ },
47
+ };
48
+ },
49
+ /** Append memory to Anthropic's system prompt. */
50
+ anthropic(cfg, memory) {
51
+ if (!memory)
52
+ return cfg;
53
+ return {
54
+ ...cfg,
55
+ systemPrompt: `${cfg.systemPrompt ?? ''}${MEMORY_HEADER}${memory}`,
56
+ };
57
+ },
58
+ /** Append memory to Codex's `instructions` (Responses API system equivalent). */
59
+ codex(cfg, memory) {
60
+ if (!memory)
61
+ return cfg;
62
+ return {
63
+ ...cfg,
64
+ instructions: `${cfg.instructions ?? ''}${MEMORY_HEADER}${memory}`,
65
+ };
66
+ },
67
+ /**
68
+ * Prepend memory to Claude Code's prompt. Claude Code's CLI has no
69
+ * separate system-prompt flag at this layer, so memory becomes part
70
+ * of the user prompt.
71
+ */
72
+ claudeCode(cfg, memory) {
73
+ if (!memory)
74
+ return cfg;
75
+ return {
76
+ ...cfg,
77
+ prompt: `Context from prior interactions:\n${memory}\n\nCurrent request: ${cfg.prompt}`,
78
+ };
79
+ },
80
+ /**
81
+ * Prepend memory to the ACP prompt. ACP's `session/prompt` has no
82
+ * system slot — memory becomes part of the user message content.
83
+ * Preserves a non-text prompt (ContentBlock[]) by injecting the
84
+ * memory as a leading text block.
85
+ */
86
+ acp(cfg, memory) {
87
+ if (!memory)
88
+ return cfg;
89
+ if (Array.isArray(cfg.prompt)) {
90
+ return {
91
+ ...cfg,
92
+ prompt: [{ type: 'text', text: `Context from prior interactions:\n${memory}\n\n` }, ...cfg.prompt],
93
+ };
94
+ }
95
+ return {
96
+ ...cfg,
97
+ prompt: `Context from prior interactions:\n${memory}\n\nCurrent request: ${cfg.prompt}`,
98
+ };
99
+ },
100
+ /** Same shape as `acp` — Hermes is an ACP wrapper. */
101
+ hermes(cfg, memory) {
102
+ if (!memory)
103
+ return cfg;
104
+ if (Array.isArray(cfg.prompt)) {
105
+ return {
106
+ ...cfg,
107
+ prompt: [{ type: 'text', text: `Context from prior interactions:\n${memory}\n\n` }, ...cfg.prompt],
108
+ };
109
+ }
110
+ return {
111
+ ...cfg,
112
+ prompt: `Context from prior interactions:\n${memory}\n\nCurrent request: ${cfg.prompt}`,
113
+ };
114
+ },
115
+ /** Same shape as `acp` — OpenClaw is an ACP wrapper. */
116
+ openClaw(cfg, memory) {
117
+ if (!memory)
118
+ return cfg;
119
+ if (Array.isArray(cfg.prompt)) {
120
+ return {
121
+ ...cfg,
122
+ prompt: [{ type: 'text', text: `Context from prior interactions:\n${memory}\n\n` }, ...cfg.prompt],
123
+ };
124
+ }
125
+ return {
126
+ ...cfg,
127
+ prompt: `Context from prior interactions:\n${memory}\n\nCurrent request: ${cfg.prompt}`,
128
+ };
129
+ },
130
+ /**
131
+ * Prepend memory to codex CLI's positional prompt. Same pattern as
132
+ * claudeCode: no system-prompt flag, memory becomes part of the user
133
+ * prompt.
134
+ */
135
+ codexCli(cfg, memory) {
136
+ if (!memory)
137
+ return cfg;
138
+ return {
139
+ ...cfg,
140
+ prompt: `Context from prior interactions:\n${memory}\n\nCurrent request: ${cfg.prompt}`,
141
+ };
142
+ },
143
+ /**
144
+ * Prepend memory to pi's prompt. Pi's `prompt(text)` takes a string;
145
+ * pi handles its own system prompt internally via prompt templates
146
+ * and resource loader.
147
+ */
148
+ pi(cfg, memory) {
149
+ if (!memory)
150
+ return cfg;
151
+ return {
152
+ ...cfg,
153
+ prompt: `Context from prior interactions:\n${memory}\n\nCurrent request: ${cfg.prompt}`,
154
+ };
155
+ },
156
+ };
157
+ // ---------------------------------------------------------------------------
158
+ // Resume injectors
159
+ // ---------------------------------------------------------------------------
160
+ /** @internal */
161
+ export const injectResume = {
162
+ /** inferenceAgent declares `resumption: 'none'`; passthrough. */
163
+ inference(cfg, _token) {
164
+ return cfg;
165
+ },
166
+ /** anthropicAgent declares `resumption: 'none'`; passthrough. */
167
+ anthropic(cfg, _token) {
168
+ return cfg;
169
+ },
170
+ /** Codex's Responses API takes `previous_response_id` natively. */
171
+ codex(cfg, token) {
172
+ if (token.kind !== 'response-id')
173
+ return cfg;
174
+ return { ...cfg, previousResponseId: token.id };
175
+ },
176
+ /** Claude Code's CLI takes `--resume <session-id>`. */
177
+ claudeCode(cfg, token) {
178
+ if (token.kind !== 'opaque')
179
+ return cfg;
180
+ return { ...cfg, resumeSessionId: token.data };
181
+ },
182
+ /** ACP's `session/load` takes a session id. */
183
+ acp(cfg, token) {
184
+ if (token.kind !== 'opaque')
185
+ return cfg;
186
+ return { ...cfg, resumeSessionId: token.data };
187
+ },
188
+ /** Hermes inherits ACP's resume path. */
189
+ hermes(cfg, token) {
190
+ if (token.kind !== 'opaque')
191
+ return cfg;
192
+ return { ...cfg, resumeSessionId: token.data };
193
+ },
194
+ /** OpenClaw inherits ACP's resume path. */
195
+ openClaw(cfg, token) {
196
+ if (token.kind !== 'opaque')
197
+ return cfg;
198
+ return { ...cfg, resumeSessionId: token.data };
199
+ },
200
+ /** Codex CLI uses thread-id-based resumption. */
201
+ codexCli(cfg, token) {
202
+ if (token.kind !== 'opaque')
203
+ return cfg;
204
+ return { ...cfg, resumeThreadId: token.data };
205
+ },
206
+ /**
207
+ * Pi resumption uses on-disk session files. Accepts either
208
+ * `session-file` (preferred — the actual session path) or `opaque`
209
+ * (treated as a session id for SessionManager lookup; falls through
210
+ * unchanged so the caller can set continueSession themselves).
211
+ */
212
+ pi(cfg, token) {
213
+ if (token.kind === 'session-file') {
214
+ return { ...cfg, resumeSessionFile: token.path };
215
+ }
216
+ return cfg;
217
+ },
218
+ };
219
+ //# sourceMappingURL=injectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectors.js","sourceRoot":"","sources":["../src/injectors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * OpenClaw adapter — wraps the ACP chassis to talk to OpenClaw via `acpx`.
3
+ *
4
+ * OpenClaw itself runs as a Gateway daemon (default :18789); `acpx` is the
5
+ * companion ACP client that bridges the Gateway. The adapter spawns `acpx`
6
+ * and lets the chassis handle the protocol.
7
+ *
8
+ * The Gateway must be running before the adapter is invoked. If it isn't,
9
+ * `acpx` exits early and the adapter surfaces the subprocess stderr as a
10
+ * `native { kind: 'acp:stderr' }` event followed by `finishReason: 'error'`.
11
+ *
12
+ * NemoClaw mode: NemoClaw is NVIDIA's sandboxing layer that runs OpenClaw
13
+ * inside an isolated environment. Setting `sandbox: 'nemoclaw'` invokes the
14
+ * chassis command via `nemoclaw connect`, which routes IO through the
15
+ * sandbox. Requires NemoClaw to be installed and onboarded.
16
+ *
17
+ * @internal
18
+ */
19
+ import { type AgentAdapterMeta } from '@autonome-research/thread-phase/agents';
20
+ import { type AcpAgentConfig, type ContentBlock, type McpServer } from '../acp/index.js';
21
+ /** @internal */
22
+ export interface OpenClawAgentConfig {
23
+ /** Working directory advertised to OpenClaw at session/new. */
24
+ cwd: string;
25
+ /** Prompt sent via session/prompt. */
26
+ prompt: string | ContentBlock[];
27
+ /** Resume a prior OpenClaw session by its id. */
28
+ resumeSessionId?: string;
29
+ /** Path to the `acpx` executable; default 'acpx'. */
30
+ openClawExecutable?: string;
31
+ /** Extra args passed to acpx; default []. */
32
+ openClawArgs?: string[];
33
+ /**
34
+ * Sandbox mode. 'local' (default) runs acpx directly. 'nemoclaw' invokes
35
+ * the acpx command through `nemoclaw connect` so the agent runs inside
36
+ * the NemoClaw OpenShell sandbox.
37
+ */
38
+ sandbox?: 'local' | 'nemoclaw';
39
+ /** Executable for the NemoClaw CLI; default 'nemoclaw'. */
40
+ nemoclawExecutable?: string;
41
+ /** Environment overrides merged with process.env. */
42
+ env?: Record<string, string>;
43
+ /** MCP servers exposed to OpenClaw; default []. */
44
+ mcpServers?: McpServer[];
45
+ /** Permission handling for tool calls OpenClaw asks the client to authorize. */
46
+ permissionMode?: AcpAgentConfig['permissionMode'];
47
+ /** Cancel-then-SIGTERM grace window in ms; default 2000. */
48
+ cancelGraceMs?: number;
49
+ /** SIGTERM-then-SIGKILL grace window in ms; default 3000. */
50
+ killGraceMs?: number;
51
+ }
52
+ /** @internal */
53
+ export declare const openClawAgent: AgentAdapterMeta<OpenClawAgentConfig>;
54
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/openclaw/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AACnG,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,iBAAiB,CAAC;AAEzB,gBAAgB;AAChB,MAAM,WAAW,mBAAmB;IAClC,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,sCAAsC;IACtC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;IAChC,iDAAiD;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC/B,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,mDAAmD;IACnD,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,gFAAgF;IAChF,cAAc,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAClD,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAwCD,gBAAgB;AAChB,eAAO,MAAM,aAAa,EAAE,gBAAgB,CAAC,mBAAmB,CAI9D,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * OpenClaw adapter — wraps the ACP chassis to talk to OpenClaw via `acpx`.
3
+ *
4
+ * OpenClaw itself runs as a Gateway daemon (default :18789); `acpx` is the
5
+ * companion ACP client that bridges the Gateway. The adapter spawns `acpx`
6
+ * and lets the chassis handle the protocol.
7
+ *
8
+ * The Gateway must be running before the adapter is invoked. If it isn't,
9
+ * `acpx` exits early and the adapter surfaces the subprocess stderr as a
10
+ * `native { kind: 'acp:stderr' }` event followed by `finishReason: 'error'`.
11
+ *
12
+ * NemoClaw mode: NemoClaw is NVIDIA's sandboxing layer that runs OpenClaw
13
+ * inside an isolated environment. Setting `sandbox: 'nemoclaw'` invokes the
14
+ * chassis command via `nemoclaw connect`, which routes IO through the
15
+ * sandbox. Requires NemoClaw to be installed and onboarded.
16
+ *
17
+ * @internal
18
+ */
19
+ import { defineAgentAdapter } from '@autonome-research/thread-phase/agents';
20
+ import { createAcpAdapter, } from '../acp/index.js';
21
+ const chassis = createAcpAdapter({ id: 'openclaw' });
22
+ function toAcpConfig(config) {
23
+ const acpx = config.openClawExecutable ?? 'acpx';
24
+ const userArgs = config.openClawArgs ?? [];
25
+ if (config.sandbox === 'nemoclaw') {
26
+ const nemoclaw = config.nemoclawExecutable ?? 'nemoclaw';
27
+ return {
28
+ command: nemoclaw,
29
+ args: ['connect', acpx, ...userArgs],
30
+ cwd: config.cwd,
31
+ prompt: config.prompt,
32
+ resumeSessionId: config.resumeSessionId,
33
+ env: config.env,
34
+ mcpServers: config.mcpServers,
35
+ permissionMode: config.permissionMode,
36
+ cancelGraceMs: config.cancelGraceMs,
37
+ killGraceMs: config.killGraceMs,
38
+ clientInfo: { name: 'thread-phase-agents', version: '0.0.1' },
39
+ };
40
+ }
41
+ return {
42
+ command: acpx,
43
+ args: userArgs,
44
+ cwd: config.cwd,
45
+ prompt: config.prompt,
46
+ resumeSessionId: config.resumeSessionId,
47
+ env: config.env,
48
+ mcpServers: config.mcpServers,
49
+ permissionMode: config.permissionMode,
50
+ cancelGraceMs: config.cancelGraceMs,
51
+ killGraceMs: config.killGraceMs,
52
+ clientInfo: { name: 'thread-phase-agents', version: '0.0.1' },
53
+ };
54
+ }
55
+ /** @internal */
56
+ export const openClawAgent = defineAgentAdapter({
57
+ id: chassis.id,
58
+ capabilities: chassis.capabilities,
59
+ adapter: (config, options) => chassis.adapter(toAcpConfig(config), options),
60
+ });
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/openclaw/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,kBAAkB,EAAyB,MAAM,wCAAwC,CAAC;AACnG,OAAO,EACL,gBAAgB,GAIjB,MAAM,iBAAiB,CAAC;AAkCzB,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;AAErD,SAAS,WAAW,CAAC,MAA2B;IAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;IAE3C,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,kBAAkB,IAAI,UAAU,CAAC;QACzD,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;YACpC,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,UAAU,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,OAAO,EAAE;SAC9D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,OAAO,EAAE;KAC9D,CAAC;AACJ,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,aAAa,GAA0C,kBAAkB,CAAC;IACrF,EAAE,EAAE,OAAO,CAAC,EAAE;IACd,YAAY,EAAE,OAAO,CAAC,YAAY;IAClC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC5E,CAAC,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Pi adapter — in-process via `@mariozechner/pi-coding-agent`.
3
+ *
4
+ * Pi is a fully-featured TypeScript coding agent SDK. Unlike the
5
+ * subprocess-based adapters (claude-code, codex-cli, ACP), pi runs in
6
+ * the same Node process: the adapter calls `createAgentSession`,
7
+ * subscribes to its event stream, and forwards each event into the
8
+ * canonical AgentEvent vocabulary.
9
+ *
10
+ * The headline difference from every other adapter: **pi supports
11
+ * native mid-stream steering and follow-up.** This is the first
12
+ * adapter where both `steer()` and `followUp()` on
13
+ * `SteerableAgentRun` actually work at runtime — pi accepts new
14
+ * messages while the model is still generating.
15
+ *
16
+ * Capabilities:
17
+ * streaming 'text'
18
+ * cancellation 'cooperative' (session.abort())
19
+ * resumption 'session-file' (pi's SessionManager persists to disk)
20
+ * structuredOutput 'prompted'
21
+ *
22
+ * Event translation:
23
+ * pi agent_start -> canonical agent_start
24
+ * pi message_update + text_delta -> canonical text
25
+ * pi message_update + thinking_* -> canonical thinking
26
+ * pi tool_execution_start -> canonical tool_call
27
+ * pi tool_execution_end -> canonical tool_result
28
+ * pi turn_end -> canonical turn_end (via endTurn)
29
+ * pi agent_end -> canonical agent_end
30
+ * everything else -> native events (kind: 'pi:*')
31
+ *
32
+ * @internal
33
+ */
34
+ import { type AgentAdapterMeta, type StructuredOutputConfig } from '@autonome-research/thread-phase/agents';
35
+ type AgentSession = unknown;
36
+ /** @internal */
37
+ export interface PiAgentConfig {
38
+ /** Working directory. Default: process.cwd(). */
39
+ cwd?: string;
40
+ /** Prompt text sent to `session.prompt`. */
41
+ prompt: string;
42
+ /**
43
+ * Resume a specific pi session file. Mutually exclusive with
44
+ * `continueSession`. The path is exposed as `ResumeToken{ kind:
45
+ * 'session-file' }` on agent_start and agent_end.
46
+ */
47
+ resumeSessionFile?: string;
48
+ /**
49
+ * Continue the most recent session in cwd. Equivalent to passing
50
+ * `continueSession: true` to `createAgentSession`.
51
+ */
52
+ continueSession?: boolean;
53
+ /**
54
+ * Pi model object — pass `getModel('provider', 'model')` from
55
+ * `@mariozechner/pi-ai`. When omitted, pi uses the default from
56
+ * settings.json.
57
+ */
58
+ model?: unknown;
59
+ /** Thinking level override. */
60
+ thinkingLevel?: 'low' | 'medium' | 'high';
61
+ /**
62
+ * Additional options forwarded to `createAgentSession`. Use this to
63
+ * pass tools, customTools, extensions, auth storage, etc.
64
+ */
65
+ sessionOptions?: Record<string, unknown>;
66
+ /**
67
+ * Pre-built pi session — bypasses `createAgentSession` entirely.
68
+ * Useful for tests and for callers managing the session lifecycle
69
+ * themselves. When provided, the adapter does NOT dispose the
70
+ * session at run end.
71
+ */
72
+ session?: AgentSession;
73
+ /** Optional structured-output spec (prompted path). */
74
+ outputSchema?: StructuredOutputConfig;
75
+ }
76
+ /** @internal */
77
+ export declare const piAgent: AgentAdapterMeta<PiAgentConfig>;
78
+ export {};
79
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/pi/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EASL,KAAK,gBAAgB,EAOrB,KAAK,sBAAsB,EAC5B,MAAM,wCAAwC,CAAC;AAOhD,KAAK,YAAY,GAAG,OAAO,CAAC;AAK5B,gBAAgB;AAChB,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+BAA+B;IAC/B,aAAa,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC1C;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,uDAAuD;IACvD,YAAY,CAAC,EAAE,sBAAsB,CAAC;CACvC;AAED,gBAAgB;AAChB,eAAO,MAAM,OAAO,EAAE,gBAAgB,CAAC,aAAa,CASlD,CAAC"}