@ash-ai/bridge 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/__tests__/sdk.test.d.ts +2 -0
- package/dist/__tests__/sdk.test.d.ts.map +1 -0
- package/dist/__tests__/sdk.test.js +141 -0
- package/dist/__tests__/sdk.test.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +119 -0
- package/dist/index.js.map +1 -0
- package/dist/sdk.d.ts +14 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +149 -0
- package/dist/sdk.js.map +1 -0
- package/package.json +39 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Ash Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sdk.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { runQuery } from '../sdk.js';
|
|
3
|
+
describe('mock SDK wrapper', () => {
|
|
4
|
+
it('yields assistant message then result for a query', async () => {
|
|
5
|
+
const events = [];
|
|
6
|
+
const abort = new AbortController();
|
|
7
|
+
for await (const msg of runQuery({
|
|
8
|
+
prompt: 'hello',
|
|
9
|
+
sessionId: 'test-session',
|
|
10
|
+
workspaceDir: '/tmp',
|
|
11
|
+
claudeMd: '',
|
|
12
|
+
resume: false,
|
|
13
|
+
signal: abort.signal,
|
|
14
|
+
})) {
|
|
15
|
+
events.push(msg);
|
|
16
|
+
}
|
|
17
|
+
expect(events.length).toBeGreaterThanOrEqual(2);
|
|
18
|
+
// First event should be an assistant message
|
|
19
|
+
const first = events[0];
|
|
20
|
+
expect(first.type).toBe('assistant');
|
|
21
|
+
expect(first.message.role).toBe('assistant');
|
|
22
|
+
expect(first.message.content[0].text).toContain('hello');
|
|
23
|
+
// Last event should be a result
|
|
24
|
+
const last = events[events.length - 1];
|
|
25
|
+
expect(last.type).toBe('result');
|
|
26
|
+
expect(last.subtype).toBe('success');
|
|
27
|
+
expect(last.session_id).toBe('test-session');
|
|
28
|
+
});
|
|
29
|
+
it('yields resumed session message for resume', async () => {
|
|
30
|
+
const events = [];
|
|
31
|
+
const abort = new AbortController();
|
|
32
|
+
for await (const msg of runQuery({
|
|
33
|
+
prompt: '',
|
|
34
|
+
sessionId: 'resume-session',
|
|
35
|
+
workspaceDir: '/tmp',
|
|
36
|
+
claudeMd: '',
|
|
37
|
+
resume: true,
|
|
38
|
+
signal: abort.signal,
|
|
39
|
+
})) {
|
|
40
|
+
events.push(msg);
|
|
41
|
+
}
|
|
42
|
+
expect(events.length).toBe(1);
|
|
43
|
+
const msg = events[0];
|
|
44
|
+
expect(msg.type).toBe('assistant');
|
|
45
|
+
expect(msg.message.content[0].text).toContain('Resumed');
|
|
46
|
+
});
|
|
47
|
+
it('respects abort signal', async () => {
|
|
48
|
+
const events = [];
|
|
49
|
+
const abort = new AbortController();
|
|
50
|
+
abort.abort(); // abort immediately
|
|
51
|
+
for await (const msg of runQuery({
|
|
52
|
+
prompt: 'will not run',
|
|
53
|
+
sessionId: 's1',
|
|
54
|
+
workspaceDir: '/tmp',
|
|
55
|
+
claudeMd: '',
|
|
56
|
+
resume: false,
|
|
57
|
+
signal: abort.signal,
|
|
58
|
+
})) {
|
|
59
|
+
events.push(msg);
|
|
60
|
+
}
|
|
61
|
+
expect(events).toHaveLength(0);
|
|
62
|
+
});
|
|
63
|
+
it('yields stream events before complete message when includePartialMessages is true', async () => {
|
|
64
|
+
const events = [];
|
|
65
|
+
const abort = new AbortController();
|
|
66
|
+
for await (const msg of runQuery({
|
|
67
|
+
prompt: 'hello',
|
|
68
|
+
sessionId: 'stream-session',
|
|
69
|
+
workspaceDir: '/tmp',
|
|
70
|
+
claudeMd: '',
|
|
71
|
+
resume: false,
|
|
72
|
+
signal: abort.signal,
|
|
73
|
+
includePartialMessages: true,
|
|
74
|
+
})) {
|
|
75
|
+
events.push(msg);
|
|
76
|
+
}
|
|
77
|
+
// Should have stream events before the assistant message
|
|
78
|
+
const streamEvents = events.filter((e) => e.type === 'stream_event');
|
|
79
|
+
expect(streamEvents.length).toBeGreaterThan(0);
|
|
80
|
+
// First stream event should be message_start
|
|
81
|
+
expect(streamEvents[0].event.type).toBe('message_start');
|
|
82
|
+
// Should have text_delta events
|
|
83
|
+
const deltas = streamEvents.filter((e) => e.event.type === 'content_block_delta' && e.event.delta.type === 'text_delta');
|
|
84
|
+
expect(deltas.length).toBeGreaterThan(0);
|
|
85
|
+
// Concatenated deltas should equal the full response text
|
|
86
|
+
const deltaText = deltas.map((e) => e.event.delta.text).join('');
|
|
87
|
+
expect(deltaText).toContain('hello');
|
|
88
|
+
// Last stream event should be message_stop
|
|
89
|
+
expect(streamEvents[streamEvents.length - 1].event.type).toBe('message_stop');
|
|
90
|
+
// Complete assistant and result messages should still follow
|
|
91
|
+
const assistant = events.find((e) => e.type === 'assistant');
|
|
92
|
+
expect(assistant).toBeDefined();
|
|
93
|
+
expect(assistant.message.content[0].text).toContain('hello');
|
|
94
|
+
const result = events.find((e) => e.type === 'result');
|
|
95
|
+
expect(result).toBeDefined();
|
|
96
|
+
});
|
|
97
|
+
it('does not yield stream events when includePartialMessages is false', async () => {
|
|
98
|
+
const events = [];
|
|
99
|
+
const abort = new AbortController();
|
|
100
|
+
for await (const msg of runQuery({
|
|
101
|
+
prompt: 'hello',
|
|
102
|
+
sessionId: 'no-stream',
|
|
103
|
+
workspaceDir: '/tmp',
|
|
104
|
+
claudeMd: '',
|
|
105
|
+
resume: false,
|
|
106
|
+
signal: abort.signal,
|
|
107
|
+
includePartialMessages: false,
|
|
108
|
+
})) {
|
|
109
|
+
events.push(msg);
|
|
110
|
+
}
|
|
111
|
+
const streamEvents = events.filter((e) => e.type === 'stream_event');
|
|
112
|
+
expect(streamEvents).toHaveLength(0);
|
|
113
|
+
// Should still have assistant + result
|
|
114
|
+
expect(events.length).toBe(2);
|
|
115
|
+
expect(events[0].type).toBe('assistant');
|
|
116
|
+
expect(events[1].type).toBe('result');
|
|
117
|
+
});
|
|
118
|
+
it('produces messages shaped like real SDK output', async () => {
|
|
119
|
+
const events = [];
|
|
120
|
+
const abort = new AbortController();
|
|
121
|
+
for await (const msg of runQuery({
|
|
122
|
+
prompt: 'test',
|
|
123
|
+
sessionId: 's1',
|
|
124
|
+
workspaceDir: '/tmp',
|
|
125
|
+
claudeMd: '',
|
|
126
|
+
resume: false,
|
|
127
|
+
signal: abort.signal,
|
|
128
|
+
})) {
|
|
129
|
+
events.push(msg);
|
|
130
|
+
}
|
|
131
|
+
// Verify the result message has the fields the real SDK would return
|
|
132
|
+
const result = events.find((e) => e.type === 'result');
|
|
133
|
+
expect(result).toBeDefined();
|
|
134
|
+
expect(result).toHaveProperty('session_id');
|
|
135
|
+
expect(result).toHaveProperty('cost_usd');
|
|
136
|
+
expect(result).toHaveProperty('duration_ms');
|
|
137
|
+
expect(result).toHaveProperty('is_error');
|
|
138
|
+
expect(result).toHaveProperty('num_turns');
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
//# sourceMappingURL=sdk.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.test.js","sourceRoot":"","sources":["../../src/__tests__/sdk.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import net from 'node:net';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { encode, decode, timingEnabled, startTimer, logTiming } from '@ash-ai/shared';
|
|
5
|
+
import { runQuery } from './sdk.js';
|
|
6
|
+
const socketPath = process.env.ASH_BRIDGE_SOCKET;
|
|
7
|
+
const agentDir = process.env.ASH_AGENT_DIR;
|
|
8
|
+
const workspaceDir = process.env.ASH_WORKSPACE_DIR;
|
|
9
|
+
if (!socketPath || !agentDir || !workspaceDir) {
|
|
10
|
+
console.error('Missing required env: ASH_BRIDGE_SOCKET, ASH_AGENT_DIR, ASH_WORKSPACE_DIR');
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
// Load agent instructions
|
|
14
|
+
let claudeMd = '';
|
|
15
|
+
try {
|
|
16
|
+
claudeMd = await readFile(join(agentDir, 'CLAUDE.md'), 'utf-8');
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// No CLAUDE.md — that's fine, validator should have caught this earlier
|
|
20
|
+
}
|
|
21
|
+
let currentAbort = null;
|
|
22
|
+
async function send(conn, event) {
|
|
23
|
+
const canWrite = conn.write(encode(event));
|
|
24
|
+
if (!canWrite) {
|
|
25
|
+
await new Promise((resolve) => conn.once('drain', resolve));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function runAndStream(conn, prompt, sessionId, resume, includePartialMessages) {
|
|
29
|
+
currentAbort = new AbortController();
|
|
30
|
+
const timing = timingEnabled();
|
|
31
|
+
const elapsed = timing ? startTimer() : null;
|
|
32
|
+
let eventCount = 0;
|
|
33
|
+
let sdkFirstTokenMs = 0;
|
|
34
|
+
const cmdParseMs = elapsed?.() ?? 0;
|
|
35
|
+
try {
|
|
36
|
+
for await (const message of runQuery({
|
|
37
|
+
prompt,
|
|
38
|
+
sessionId,
|
|
39
|
+
workspaceDir,
|
|
40
|
+
claudeMd,
|
|
41
|
+
resume,
|
|
42
|
+
signal: currentAbort.signal,
|
|
43
|
+
includePartialMessages,
|
|
44
|
+
})) {
|
|
45
|
+
eventCount++;
|
|
46
|
+
if (eventCount === 1 && elapsed) {
|
|
47
|
+
sdkFirstTokenMs = elapsed();
|
|
48
|
+
}
|
|
49
|
+
await send(conn, { ev: 'message', data: message });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
54
|
+
await send(conn, { ev: 'error', error: msg });
|
|
55
|
+
}
|
|
56
|
+
if (elapsed) {
|
|
57
|
+
logTiming({
|
|
58
|
+
type: 'timing',
|
|
59
|
+
source: 'bridge',
|
|
60
|
+
sessionId,
|
|
61
|
+
cmdParseMs: Math.round(cmdParseMs * 100) / 100,
|
|
62
|
+
sdkFirstTokenMs: Math.round(sdkFirstTokenMs * 100) / 100,
|
|
63
|
+
totalMs: Math.round(elapsed() * 100) / 100,
|
|
64
|
+
eventCount,
|
|
65
|
+
timestamp: new Date().toISOString(),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
await send(conn, { ev: 'done', sessionId });
|
|
69
|
+
currentAbort = null;
|
|
70
|
+
}
|
|
71
|
+
async function handleCommand(conn, cmd) {
|
|
72
|
+
switch (cmd.cmd) {
|
|
73
|
+
case 'query':
|
|
74
|
+
return runAndStream(conn, cmd.prompt, cmd.sessionId, false, cmd.includePartialMessages);
|
|
75
|
+
case 'resume':
|
|
76
|
+
return runAndStream(conn, '', cmd.sessionId, true);
|
|
77
|
+
case 'interrupt':
|
|
78
|
+
currentAbort?.abort();
|
|
79
|
+
currentAbort = null;
|
|
80
|
+
break;
|
|
81
|
+
case 'shutdown':
|
|
82
|
+
currentAbort?.abort();
|
|
83
|
+
server.close();
|
|
84
|
+
process.exit(0);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Unix socket server
|
|
88
|
+
const server = net.createServer((conn) => {
|
|
89
|
+
// Fire-and-forget for ready — connection just opened, buffer is empty
|
|
90
|
+
conn.write(encode({ ev: 'ready' }));
|
|
91
|
+
let buffer = '';
|
|
92
|
+
conn.on('data', (chunk) => {
|
|
93
|
+
buffer += chunk.toString();
|
|
94
|
+
let newline;
|
|
95
|
+
while ((newline = buffer.indexOf('\n')) !== -1) {
|
|
96
|
+
const line = buffer.slice(0, newline);
|
|
97
|
+
buffer = buffer.slice(newline + 1);
|
|
98
|
+
if (line.trim()) {
|
|
99
|
+
const cmd = decode(line);
|
|
100
|
+
handleCommand(conn, cmd).catch(async (err) => {
|
|
101
|
+
await send(conn, { ev: 'error', error: String(err) });
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
conn.on('error', () => {
|
|
107
|
+
currentAbort?.abort();
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
server.listen(socketPath, () => {
|
|
111
|
+
// Bridge is ready — server will detect via 'ready' event on connect
|
|
112
|
+
});
|
|
113
|
+
// Graceful shutdown
|
|
114
|
+
process.on('SIGTERM', () => {
|
|
115
|
+
currentAbort?.abort();
|
|
116
|
+
server.close();
|
|
117
|
+
process.exit(0);
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface QueryOptions {
|
|
2
|
+
prompt: string;
|
|
3
|
+
sessionId: string;
|
|
4
|
+
workspaceDir: string;
|
|
5
|
+
claudeMd: string;
|
|
6
|
+
resume: boolean;
|
|
7
|
+
signal: AbortSignal;
|
|
8
|
+
includePartialMessages?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Route to real or mock implementation based on ASH_REAL_SDK env var.
|
|
12
|
+
*/
|
|
13
|
+
export declare function runQuery(opts: QueryOptions): AsyncGenerator<unknown>;
|
|
14
|
+
//# sourceMappingURL=sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED;;GAEG;AACH,wBAAuB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,CAM3E"}
|
package/dist/sdk.js
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// SDK wrapper. Calls @anthropic-ai/claude-agent-sdk and yields raw SDK messages.
|
|
3
|
+
//
|
|
4
|
+
// Set ASH_REAL_SDK=1 to use the real Claude Agent SDK. Otherwise uses the mock.
|
|
5
|
+
// The bridge protocol carries these messages as-is (principle 8: no type translation).
|
|
6
|
+
// =============================================================================
|
|
7
|
+
/**
|
|
8
|
+
* Route to real or mock implementation based on ASH_REAL_SDK env var.
|
|
9
|
+
*/
|
|
10
|
+
export async function* runQuery(opts) {
|
|
11
|
+
if (process.env.ASH_REAL_SDK === '1') {
|
|
12
|
+
yield* runRealQuery(opts);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
yield* runMockQuery(opts);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Real implementation — calls @anthropic-ai/claude-agent-sdk.
|
|
20
|
+
* Yields SDK Message objects directly (no translation).
|
|
21
|
+
*/
|
|
22
|
+
async function* runRealQuery(opts) {
|
|
23
|
+
const { query } = await import('@anthropic-ai/claude-agent-sdk');
|
|
24
|
+
// The SDK reads .mcp.json from cwd automatically for MCP servers.
|
|
25
|
+
// settingSources: ['project'] tells it to load .claude/settings.json and skills.
|
|
26
|
+
const q = query({
|
|
27
|
+
prompt: opts.prompt,
|
|
28
|
+
options: {
|
|
29
|
+
cwd: opts.workspaceDir,
|
|
30
|
+
systemPrompt: opts.claudeMd || undefined,
|
|
31
|
+
resume: opts.resume ? opts.sessionId : undefined,
|
|
32
|
+
permissionMode: 'bypassPermissions',
|
|
33
|
+
allowDangerouslySkipPermissions: true,
|
|
34
|
+
abortController: abortControllerFromSignal(opts.signal),
|
|
35
|
+
settingSources: ['project'],
|
|
36
|
+
...(opts.includePartialMessages && { includePartialMessages: true }),
|
|
37
|
+
...(process.env.CLAUDE_CODE_EXECUTABLE && { pathToClaudeCodeExecutable: process.env.CLAUDE_CODE_EXECUTABLE }),
|
|
38
|
+
stderr: (data) => process.stderr.write(`[claude-code] ${data}`),
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
for await (const message of q) {
|
|
42
|
+
if (opts.signal.aborted)
|
|
43
|
+
return;
|
|
44
|
+
yield message; // passthrough — no translation
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Mock implementation — yields objects shaped like SDK Messages.
|
|
49
|
+
* When includePartialMessages is true, emits stream events before complete messages.
|
|
50
|
+
*/
|
|
51
|
+
async function* runMockQuery(opts) {
|
|
52
|
+
if (opts.signal.aborted)
|
|
53
|
+
return;
|
|
54
|
+
await delay(50, opts.signal);
|
|
55
|
+
if (opts.signal.aborted)
|
|
56
|
+
return;
|
|
57
|
+
const responseText = opts.resume
|
|
58
|
+
? '[Resumed session]'
|
|
59
|
+
: `[Mock] Received: ${opts.prompt}`;
|
|
60
|
+
// When streaming enabled, emit incremental stream events first
|
|
61
|
+
if (opts.includePartialMessages) {
|
|
62
|
+
yield {
|
|
63
|
+
type: 'stream_event',
|
|
64
|
+
event: { type: 'message_start', message: { id: 'msg_mock', type: 'message', role: 'assistant', content: [] } },
|
|
65
|
+
session_id: opts.sessionId,
|
|
66
|
+
};
|
|
67
|
+
yield {
|
|
68
|
+
type: 'stream_event',
|
|
69
|
+
event: { type: 'content_block_start', index: 0, content_block: { type: 'text', text: '' } },
|
|
70
|
+
session_id: opts.sessionId,
|
|
71
|
+
};
|
|
72
|
+
// Split into chunks to simulate incremental delivery
|
|
73
|
+
const chunkSize = Math.max(1, Math.ceil(responseText.length / 3));
|
|
74
|
+
for (let i = 0; i < responseText.length; i += chunkSize) {
|
|
75
|
+
if (opts.signal.aborted)
|
|
76
|
+
return;
|
|
77
|
+
const chunk = responseText.slice(i, i + chunkSize);
|
|
78
|
+
yield {
|
|
79
|
+
type: 'stream_event',
|
|
80
|
+
event: { type: 'content_block_delta', index: 0, delta: { type: 'text_delta', text: chunk } },
|
|
81
|
+
session_id: opts.sessionId,
|
|
82
|
+
};
|
|
83
|
+
await delay(10, opts.signal);
|
|
84
|
+
}
|
|
85
|
+
yield {
|
|
86
|
+
type: 'stream_event',
|
|
87
|
+
event: { type: 'content_block_stop', index: 0 },
|
|
88
|
+
session_id: opts.sessionId,
|
|
89
|
+
};
|
|
90
|
+
yield {
|
|
91
|
+
type: 'stream_event',
|
|
92
|
+
event: { type: 'message_delta', delta: { stop_reason: 'end_turn' }, usage: { output_tokens: 10 } },
|
|
93
|
+
session_id: opts.sessionId,
|
|
94
|
+
};
|
|
95
|
+
yield {
|
|
96
|
+
type: 'stream_event',
|
|
97
|
+
event: { type: 'message_stop' },
|
|
98
|
+
session_id: opts.sessionId,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// Complete assistant message (always emitted)
|
|
102
|
+
yield {
|
|
103
|
+
type: 'assistant',
|
|
104
|
+
message: {
|
|
105
|
+
role: 'assistant',
|
|
106
|
+
content: [{ type: 'text', text: responseText }],
|
|
107
|
+
},
|
|
108
|
+
session_id: opts.sessionId,
|
|
109
|
+
};
|
|
110
|
+
if (opts.resume)
|
|
111
|
+
return;
|
|
112
|
+
await delay(50, opts.signal);
|
|
113
|
+
if (opts.signal.aborted)
|
|
114
|
+
return;
|
|
115
|
+
// Final result message
|
|
116
|
+
yield {
|
|
117
|
+
type: 'result',
|
|
118
|
+
subtype: 'success',
|
|
119
|
+
session_id: opts.sessionId,
|
|
120
|
+
cost_usd: 0,
|
|
121
|
+
duration_ms: 100,
|
|
122
|
+
duration_api_ms: 50,
|
|
123
|
+
is_error: false,
|
|
124
|
+
num_turns: 1,
|
|
125
|
+
result: `Mock response to: ${opts.prompt}`,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function delay(ms, signal) {
|
|
129
|
+
return new Promise((resolve) => {
|
|
130
|
+
if (signal.aborted) {
|
|
131
|
+
resolve();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const timer = setTimeout(resolve, ms);
|
|
135
|
+
signal.addEventListener('abort', () => { clearTimeout(timer); resolve(); }, { once: true });
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/** Create an AbortController that aborts when the given signal fires. */
|
|
139
|
+
function abortControllerFromSignal(signal) {
|
|
140
|
+
const controller = new AbortController();
|
|
141
|
+
if (signal.aborted) {
|
|
142
|
+
controller.abort();
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
signal.addEventListener('abort', () => controller.abort(), { once: true });
|
|
146
|
+
}
|
|
147
|
+
return controller;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=sdk.js.map
|
package/dist/sdk.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ash-ai/bridge",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"publishConfig": {
|
|
11
|
+
"access": "public"
|
|
12
|
+
},
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "https://github.com/ash-ai/ash.git",
|
|
16
|
+
"directory": "packages/bridge"
|
|
17
|
+
},
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"description": "Ash sandbox bridge process (runs inside sandbox, talks to Claude Agent SDK)",
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@ash-ai/shared": "0.0.1"
|
|
22
|
+
},
|
|
23
|
+
"peerDependencies": {
|
|
24
|
+
"@anthropic-ai/claude-agent-sdk": ">=0.2.0"
|
|
25
|
+
},
|
|
26
|
+
"peerDependenciesMeta": {
|
|
27
|
+
"@anthropic-ai/claude-agent-sdk": {
|
|
28
|
+
"optional": true
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsc",
|
|
33
|
+
"clean": "rm -rf dist *.tsbuildinfo",
|
|
34
|
+
"typecheck": "tsc --noEmit",
|
|
35
|
+
"start": "node dist/index.js",
|
|
36
|
+
"dev": "tsx src/index.ts",
|
|
37
|
+
"test": "vitest run"
|
|
38
|
+
}
|
|
39
|
+
}
|