acp-chat 0.2.6 → 0.2.7
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/dist/acp-client.d.ts +0 -1
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +5 -91
- package/dist/errors.d.ts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +3 -22
- package/dist/ndjson-client.d.ts +0 -1
- package/dist/ndjson.d.ts +0 -1
- package/dist/request-tracker.d.ts +0 -1
- package/dist/types.d.ts +0 -1
- package/package.json +13 -5
- package/dist/acp-client.d.ts.map +0 -1
- package/dist/acp-client.js +0 -114
- package/dist/acp-client.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -51
- package/dist/errors.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/ndjson-client.d.ts.map +0 -1
- package/dist/ndjson-client.js +0 -184
- package/dist/ndjson-client.js.map +0 -1
- package/dist/ndjson.d.ts.map +0 -1
- package/dist/ndjson.js +0 -28
- package/dist/ndjson.js.map +0 -1
- package/dist/request-tracker.d.ts.map +0 -1
- package/dist/request-tracker.js +0 -64
- package/dist/request-tracker.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -16
- package/dist/types.js.map +0 -1
package/dist/acp-client.d.ts
CHANGED
package/dist/cli.d.ts
CHANGED
package/dist/cli.js
CHANGED
|
@@ -1,92 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
// You may obtain a copy of the License at
|
|
8
|
-
//
|
|
9
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
-
//
|
|
11
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
12
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
-
// See the License for the specific language governing permissions and
|
|
15
|
-
// limitations under the License.
|
|
16
|
-
// ============================================================================
|
|
17
|
-
// ACP Chat CLI — single-turn tool for agent-to-agent dialogue
|
|
18
|
-
// ============================================================================
|
|
19
|
-
// Usage:
|
|
20
|
-
// acp-chat new "Hello" — create session + send
|
|
21
|
-
// acp-chat <clientSessionId> <sessionId> "Hello" — continue session
|
|
22
|
-
import { NDJSONClient } from './ndjson-client.js';
|
|
23
|
-
import { createACPClient } from './acp-client.js';
|
|
24
|
-
const BUS_ADDRESS = process.env['ACP_BUS_ADDRESS'] ?? '127.0.0.1:9800';
|
|
25
|
-
const AGENT_ID = process.env['ACP_AGENT_ID'] ?? 'codex-acp';
|
|
26
|
-
async function main() {
|
|
27
|
-
const args = process.argv.slice(2);
|
|
28
|
-
let clientSessionId;
|
|
29
|
-
let sessionId;
|
|
30
|
-
let message;
|
|
31
|
-
if (args[0] === 'new') {
|
|
32
|
-
// acp-chat new "message"
|
|
33
|
-
if (args.length < 2) {
|
|
34
|
-
console.error('Usage: acp-chat new "<message>"');
|
|
35
|
-
process.exit(1);
|
|
36
|
-
}
|
|
37
|
-
message = args[1];
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
// acp-chat <clientSessionId> <sessionId> "message"
|
|
41
|
-
if (args.length < 3) {
|
|
42
|
-
console.error('Usage: acp-chat <clientSessionId> <sessionId> "<message>"');
|
|
43
|
-
process.exit(1);
|
|
44
|
-
}
|
|
45
|
-
clientSessionId = args[0];
|
|
46
|
-
sessionId = args[1];
|
|
47
|
-
message = args[2];
|
|
48
|
-
}
|
|
49
|
-
const ndjsonClient = new NDJSONClient({
|
|
50
|
-
address: BUS_ADDRESS,
|
|
51
|
-
connectionType: 'tcp',
|
|
52
|
-
maxReconnectAttempts: 3,
|
|
53
|
-
baseReconnectDelayMs: 500,
|
|
54
|
-
maxReconnectDelayMs: 5000,
|
|
55
|
-
});
|
|
56
|
-
try {
|
|
57
|
-
await ndjsonClient.connect();
|
|
58
|
-
const client = createACPClient(ndjsonClient, {
|
|
59
|
-
agentId: AGENT_ID,
|
|
60
|
-
requestTimeoutMs: 5 * 60 * 1000,
|
|
61
|
-
clientInfo: { name: 'acp-chat-cli', version: '1.0.0' },
|
|
62
|
-
clientSessionId,
|
|
63
|
-
});
|
|
64
|
-
client.on('update', (_sid, update) => {
|
|
65
|
-
if (update.sessionUpdate === 'agent_message_chunk') {
|
|
66
|
-
process.stdout.write(update.content.text);
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
await client.initialize();
|
|
70
|
-
if (!sessionId) {
|
|
71
|
-
const session = await client.sessionNew();
|
|
72
|
-
sessionId = session.sessionId;
|
|
73
|
-
console.error(`CLIENT_SESSION_ID=${session.clientSessionId}`);
|
|
74
|
-
console.error(`SESSION_ID=${sessionId}`);
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
console.error(`CLIENT_SESSION_ID=${clientSessionId}`);
|
|
78
|
-
console.error(`SESSION_ID=${sessionId} (continued)`);
|
|
79
|
-
}
|
|
80
|
-
const result = await client.sessionPrompt(sessionId, message);
|
|
81
|
-
process.stdout.write('\n');
|
|
82
|
-
console.error(`STOP=${result.stopReason} UPDATES=${result.updates.length}`);
|
|
83
|
-
}
|
|
84
|
-
finally {
|
|
85
|
-
await ndjsonClient.close();
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
main().catch((err) => {
|
|
89
|
-
console.error('ERROR:', err.message);
|
|
90
|
-
process.exit(1);
|
|
91
|
-
});
|
|
92
|
-
//# sourceMappingURL=cli.js.map
|
|
2
|
+
#!/usr/bin/env node
|
|
3
|
+
import{EventEmitter as J}from"node:events";import*as P from"node:net";function O(n){let e=JSON.stringify(n);if(e===void 0)throw new TypeError("Value is not JSON-serializable");return e+`
|
|
4
|
+
`}function N(n){return JSON.parse(n)}var y={CAPACITY_EXCEEDED:-32e3,REQUEST_TIMEOUT:-32001,DISCONNECTED:-32004},C=class extends Error{code;data;constructor(e,t,s){super(t),this.name="ACPError",this.code=e,this.data=s}},S=class extends C{constructor(e="Capacity exceeded",t){super(y.CAPACITY_EXCEEDED,e,t),this.name="CapacityExceededError"}},x=class extends C{constructor(e="Request timeout",t){super(y.REQUEST_TIMEOUT,e,t),this.name="RequestTimeoutError"}},T=class extends C{constructor(e="Disconnected",t){super(y.DISCONNECTED,e,t),this.name="DisconnectedError"}};var v=class extends J{opts;socket=null;state="disconnected";reconnectAttempt=0;reconnectTimer=null;lineBuffer="";closedByUser=!1;constructor(e){super(),this.opts=e}connect(){return this.state==="connected"||this.state==="connecting"?Promise.resolve():this.state==="closed"?Promise.reject(new Error("Client has been closed")):(this.closedByUser=!1,this.reconnectAttempt=0,this.createConnection())}send(e){if(this.state!=="connected"||!this.socket)throw new T("Cannot send: not connected to stdio Bus");this.socket.write(O(e))}close(){this.closedByUser=!0,this.clearReconnectTimer();let e=this.state;return this.state="closed",e==="closed"||e==="disconnected"?Promise.resolve():new Promise(t=>{if(this.socket){let s=this.socket;if(this.socket=null,s.destroyed){t();return}s.once("close",()=>t()),s.destroy()}else t()})}isConnected(){return this.state==="connected"}getState(){return this.state}createConnection(){return new Promise((e,t)=>{this.state=this.reconnectAttempt===0?"connecting":"reconnecting",this.lineBuffer="";let s=this.buildConnectOptions(),c=P.createConnection(s);this.socket=c;let l=()=>{a(),this.state="connected",this.reconnectAttempt=0,this.wireSocketEvents(c),e()},o=d=>{a(),this.reconnectAttempt===0&&this.state==="connecting"&&(this.state="disconnected",t(d))},a=()=>{c.removeListener("connect",l),c.removeListener("error",o)};c.once("connect",l),c.once("error",o)})}buildConnectOptions(){if(this.opts.connectionType==="unix")return{path:this.opts.address};let e=this.opts.address.lastIndexOf(":");if(e===-1)throw new Error(`Invalid TCP address: expected "host:port", got "${this.opts.address}"`);let t=this.opts.address.slice(0,e),s=parseInt(this.opts.address.slice(e+1),10);if(isNaN(s))throw new Error(`Invalid TCP port in address "${this.opts.address}"`);return{host:t,port:s}}wireSocketEvents(e){e.on("data",t=>this.handleData(t.toString("utf-8"))),e.on("error",t=>this.emit("error",t)),e.on("close",()=>{this.closedByUser||this.state==="closed"||(this.state="disconnected",this.emit("disconnect"),this.scheduleReconnect())})}handleData(e){this.lineBuffer+=e;let t;for(;(t=this.lineBuffer.indexOf(`
|
|
5
|
+
`))!==-1;){let s=this.lineBuffer.slice(0,t);if(this.lineBuffer=this.lineBuffer.slice(t+1),s.length!==0)try{this.emit("message",N(s))}catch(c){this.emit("framingError",s,c instanceof Error?c:new Error(String(c)))}}}scheduleReconnect(){if(this.closedByUser||this.state==="closed")return;if(this.reconnectAttempt>=this.opts.maxReconnectAttempts){this.state="disconnected",this.emit("disconnect");return}this.state="reconnecting";let e=this.reconnectAttempt++,t=Math.random()*this.opts.baseReconnectDelayMs,s=Math.min(this.opts.baseReconnectDelayMs*Math.pow(2,e)+t,this.opts.maxReconnectDelayMs);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.emit("reconnect",this.reconnectAttempt),this.attemptReconnect()},s)}attemptReconnect(){if(this.closedByUser||this.state==="closed")return;this.lineBuffer="";let e=P.createConnection(this.buildConnectOptions());this.socket=e,e.once("connect",()=>{e.removeAllListeners("error"),this.state="connected",this.reconnectAttempt=0,this.wireSocketEvents(e)}),e.once("error",()=>{e.destroy(),this.scheduleReconnect()})}clearReconnectTimer(){this.reconnectTimer!==null&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}};var $={maxPending:4096,defaultTimeoutMs:3e4},I=1e3;function A(n){let e={...$,...n};e.defaultTimeoutMs<I&&(e.defaultTimeoutMs=I);let t=new Map;function s(o,a){if(t.size>=e.maxPending)return Promise.reject(new S(`Maximum pending requests (${e.maxPending}) exceeded`));let d=a??e.defaultTimeoutMs;return d<I&&(d=I),new Promise((h,f)=>{let R=setTimeout(()=>{t.delete(o),f(new x(`Request ${String(o)} timed out after ${d}ms`,{id:o,timeoutMs:d}))},d);R.unref&&R.unref(),t.set(o,{id:o,registeredAt:Date.now(),timeoutMs:d,timeoutHandle:R,resolve:h,reject:f})})}function c(o){let a=t.get(o.id);return a?(clearTimeout(a.timeoutHandle),t.delete(o.id),a.resolve(o),!0):!1}function l(o){for(let[,a]of t)clearTimeout(a.timeoutHandle),a.reject(o);t.clear()}return{register:s,resolve:c,cancelAll:l,pendingCount:()=>t.size,hasPending:o=>t.has(o)}}import{EventEmitter as q}from"node:events";function D(n,e){let{agentId:t,requestTimeoutMs:s=12e4,clientInfo:c}=e,l=new q,o=A({defaultTimeoutMs:s}),a=1,d=e.clientSessionId??`client-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,h=new Map;n.on("message",r=>{let i=r;if(!(!i||i.jsonrpc!=="2.0")){if("id"in i&&("result"in i||"error"in i)){o.resolve(i);return}if("method"in i&&!("id"in i)){let p=i.method,u=i.params;if(p==="session/update"&&u){let g=u.sessionId,E=u.update,w=h.get(g);w&&w.push(E),l.emit("update",g,E)}l.emit("notification",p,u)}}});function f(r,i){let p=a++,u={jsonrpc:"2.0",id:p,method:r,agentId:t,sessionId:d,params:i},g=o.register(p);return n.send(u),g}async function R(){let r=await f("initialize",{protocolVersion:1,clientCapabilities:{},clientInfo:c??{name:"acp-chat",version:"1.0.0"}});if(r.error)throw new Error(`initialize: [${r.error.code}] ${r.error.message}`);return r.result}async function U(r){let i={cwd:process.cwd(),mcpServers:[]};r?.length&&(i.configOptions=r);let p=await f("session/new",i);if(p.error)throw new Error(`session/new: [${p.error.code}] ${p.error.message}`);return{...p.result,clientSessionId:d}}async function M(r,i,p="user"){h.set(r,[]);let u=await f("session/prompt",{sessionId:r,prompt:[{type:"text",role:p,text:i}]});await new Promise(m=>setTimeout(m,200));let g=h.get(r)??[];if(h.delete(r),u.error)throw new Error(`session/prompt: [${u.error.code}] ${u.error.message}`);let E=u.result,w=[];for(let m of g)if(m.sessionUpdate==="agent_message_chunk"&&m.content?.text&&w.push(m.content.text),m.sessionUpdate==="tool_call_update"&&m.content)for(let k of m.content)k.content?.text&&w.push(k.content.text);return{stopReason:E.stopReason,updates:g,text:w.join("")}}async function _(r,i){let p=await f("session/configure",{sessionId:r,options:i});if(p.error)throw new Error(`session/configure: [${p.error.code}] ${p.error.message}`)}function b(r){n.send({jsonrpc:"2.0",method:"session/cancel",params:{sessionId:r},agentId:t,sessionId:d})}return Object.assign(l,{initialize:R,sessionNew:U,sessionPrompt:M,sessionConfigure:_,sessionCancel:b,requestTracker:o})}var B=process.env.ACP_BUS_ADDRESS??"127.0.0.1:9800",j=process.env.ACP_AGENT_ID??"codex-acp";async function z(){let n=process.argv.slice(2),e,t,s;n[0]==="new"?(n.length<2&&(console.error('Usage: acp-chat new "<message>"'),process.exit(1)),s=n[1]):(n.length<3&&(console.error('Usage: acp-chat <clientSessionId> <sessionId> "<message>"'),process.exit(1)),e=n[0],t=n[1],s=n[2]);let c=new v({address:B,connectionType:"tcp",maxReconnectAttempts:3,baseReconnectDelayMs:500,maxReconnectDelayMs:5e3});try{await c.connect();let l=D(c,{agentId:j,requestTimeoutMs:300*1e3,clientInfo:{name:"acp-chat-cli",version:"1.0.0"},clientSessionId:e});if(l.on("update",(a,d)=>{d.sessionUpdate==="agent_message_chunk"&&process.stdout.write(d.content.text)}),await l.initialize(),t)console.error(`CLIENT_SESSION_ID=${e}`),console.error(`SESSION_ID=${t} (continued)`);else{let a=await l.sessionNew();t=a.sessionId,console.error(`CLIENT_SESSION_ID=${a.clientSessionId}`),console.error(`SESSION_ID=${t}`)}let o=await l.sessionPrompt(t,s);process.stdout.write(`
|
|
6
|
+
`),console.error(`STOP=${o.stopReason} UPDATES=${o.updates.length}`)}finally{await c.close()}}z().catch(n=>{console.error("ERROR:",n.message),process.exit(1)});
|
package/dist/errors.d.ts
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -3,4 +3,3 @@ export { createACPClient, type ACPClient, type ACPClientOptions, type SessionUpd
|
|
|
3
3
|
export { createRequestTracker, type RequestTracker, type RequestTrackerOptions } from './request-tracker.js';
|
|
4
4
|
export { DisconnectedError, CapacityExceededError, RequestTimeoutError, ACPError, ErrorCodes } from './errors.js';
|
|
5
5
|
export type { JsonRpcId, JsonRpcResponse, JsonRpcError, ConnectionState } from './types.js';
|
|
6
|
-
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,22 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
// you may not use this file except in compliance with the License.
|
|
6
|
-
// You may obtain a copy of the License at
|
|
7
|
-
//
|
|
8
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
//
|
|
10
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
// See the License for the specific language governing permissions and
|
|
14
|
-
// limitations under the License.
|
|
15
|
-
// ============================================================================
|
|
16
|
-
// ACP Chat — Public API
|
|
17
|
-
// ============================================================================
|
|
18
|
-
export { NDJSONClient } from './ndjson-client.js';
|
|
19
|
-
export { createACPClient } from './acp-client.js';
|
|
20
|
-
export { createRequestTracker } from './request-tracker.js';
|
|
21
|
-
export { DisconnectedError, CapacityExceededError, RequestTimeoutError, ACPError, ErrorCodes } from './errors.js';
|
|
22
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
import{EventEmitter as J}from"node:events";import*as P from"node:net";function N(c){let e=JSON.stringify(c);if(e===void 0)throw new TypeError("Value is not JSON-serializable");return e+`
|
|
2
|
+
`}function A(c){return JSON.parse(c)}var v={CAPACITY_EXCEEDED:-32e3,REQUEST_TIMEOUT:-32001,DISCONNECTED:-32004},R=class extends Error{code;data;constructor(e,t,n){super(t),this.name="ACPError",this.code=e,this.data=n}},y=class extends R{constructor(e="Capacity exceeded",t){super(v.CAPACITY_EXCEEDED,e,t),this.name="CapacityExceededError"}},E=class extends R{constructor(e="Request timeout",t){super(v.REQUEST_TIMEOUT,e,t),this.name="RequestTimeoutError"}},x=class extends R{constructor(e="Disconnected",t){super(v.DISCONNECTED,e,t),this.name="DisconnectedError"}};var S=class extends J{opts;socket=null;state="disconnected";reconnectAttempt=0;reconnectTimer=null;lineBuffer="";closedByUser=!1;constructor(e){super(),this.opts=e}connect(){return this.state==="connected"||this.state==="connecting"?Promise.resolve():this.state==="closed"?Promise.reject(new Error("Client has been closed")):(this.closedByUser=!1,this.reconnectAttempt=0,this.createConnection())}send(e){if(this.state!=="connected"||!this.socket)throw new x("Cannot send: not connected to stdio Bus");this.socket.write(N(e))}close(){this.closedByUser=!0,this.clearReconnectTimer();let e=this.state;return this.state="closed",e==="closed"||e==="disconnected"?Promise.resolve():new Promise(t=>{if(this.socket){let n=this.socket;if(this.socket=null,n.destroyed){t();return}n.once("close",()=>t()),n.destroy()}else t()})}isConnected(){return this.state==="connected"}getState(){return this.state}createConnection(){return new Promise((e,t)=>{this.state=this.reconnectAttempt===0?"connecting":"reconnecting",this.lineBuffer="";let n=this.buildConnectOptions(),a=P.createConnection(n);this.socket=a;let u=()=>{p(),this.state="connected",this.reconnectAttempt=0,this.wireSocketEvents(a),e()},s=d=>{p(),this.reconnectAttempt===0&&this.state==="connecting"&&(this.state="disconnected",t(d))},p=()=>{a.removeListener("connect",u),a.removeListener("error",s)};a.once("connect",u),a.once("error",s)})}buildConnectOptions(){if(this.opts.connectionType==="unix")return{path:this.opts.address};let e=this.opts.address.lastIndexOf(":");if(e===-1)throw new Error(`Invalid TCP address: expected "host:port", got "${this.opts.address}"`);let t=this.opts.address.slice(0,e),n=parseInt(this.opts.address.slice(e+1),10);if(isNaN(n))throw new Error(`Invalid TCP port in address "${this.opts.address}"`);return{host:t,port:n}}wireSocketEvents(e){e.on("data",t=>this.handleData(t.toString("utf-8"))),e.on("error",t=>this.emit("error",t)),e.on("close",()=>{this.closedByUser||this.state==="closed"||(this.state="disconnected",this.emit("disconnect"),this.scheduleReconnect())})}handleData(e){this.lineBuffer+=e;let t;for(;(t=this.lineBuffer.indexOf(`
|
|
3
|
+
`))!==-1;){let n=this.lineBuffer.slice(0,t);if(this.lineBuffer=this.lineBuffer.slice(t+1),n.length!==0)try{this.emit("message",A(n))}catch(a){this.emit("framingError",n,a instanceof Error?a:new Error(String(a)))}}}scheduleReconnect(){if(this.closedByUser||this.state==="closed")return;if(this.reconnectAttempt>=this.opts.maxReconnectAttempts){this.state="disconnected",this.emit("disconnect");return}this.state="reconnecting";let e=this.reconnectAttempt++,t=Math.random()*this.opts.baseReconnectDelayMs,n=Math.min(this.opts.baseReconnectDelayMs*Math.pow(2,e)+t,this.opts.maxReconnectDelayMs);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.emit("reconnect",this.reconnectAttempt),this.attemptReconnect()},n)}attemptReconnect(){if(this.closedByUser||this.state==="closed")return;this.lineBuffer="";let e=P.createConnection(this.buildConnectOptions());this.socket=e,e.once("connect",()=>{e.removeAllListeners("error"),this.state="connected",this.reconnectAttempt=0,this.wireSocketEvents(e)}),e.once("error",()=>{e.destroy(),this.scheduleReconnect()})}clearReconnectTimer(){this.reconnectTimer!==null&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}};var q={maxPending:4096,defaultTimeoutMs:3e4},k=1e3;function O(c){let e={...q,...c};e.defaultTimeoutMs<k&&(e.defaultTimeoutMs=k);let t=new Map;function n(s,p){if(t.size>=e.maxPending)return Promise.reject(new y(`Maximum pending requests (${e.maxPending}) exceeded`));let d=p??e.defaultTimeoutMs;return d<k&&(d=k),new Promise((g,f)=>{let w=setTimeout(()=>{t.delete(s),f(new E(`Request ${String(s)} timed out after ${d}ms`,{id:s,timeoutMs:d}))},d);w.unref&&w.unref(),t.set(s,{id:s,registeredAt:Date.now(),timeoutMs:d,timeoutHandle:w,resolve:g,reject:f})})}function a(s){let p=t.get(s.id);return p?(clearTimeout(p.timeoutHandle),t.delete(s.id),p.resolve(s),!0):!1}function u(s){for(let[,p]of t)clearTimeout(p.timeoutHandle),p.reject(s);t.clear()}return{register:n,resolve:a,cancelAll:u,pendingCount:()=>t.size,hasPending:s=>t.has(s)}}import{EventEmitter as _}from"node:events";function j(c,e){let{agentId:t,requestTimeoutMs:n=12e4,clientInfo:a}=e,u=new _,s=O({defaultTimeoutMs:n}),p=1,d=e.clientSessionId??`client-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,g=new Map;c.on("message",o=>{let r=o;if(!(!r||r.jsonrpc!=="2.0")){if("id"in r&&("result"in r||"error"in r)){s.resolve(r);return}if("method"in r&&!("id"in r)){let i=r.method,l=r.params;if(i==="session/update"&&l){let h=l.sessionId,T=l.update,C=g.get(h);C&&C.push(T),u.emit("update",h,T)}u.emit("notification",i,l)}}});function f(o,r){let i=p++,l={jsonrpc:"2.0",id:i,method:o,agentId:t,sessionId:d,params:r},h=s.register(i);return c.send(l),h}async function w(){let o=await f("initialize",{protocolVersion:1,clientCapabilities:{},clientInfo:a??{name:"acp-chat",version:"1.0.0"}});if(o.error)throw new Error(`initialize: [${o.error.code}] ${o.error.message}`);return o.result}async function U(o){let r={cwd:process.cwd(),mcpServers:[]};o?.length&&(r.configOptions=o);let i=await f("session/new",r);if(i.error)throw new Error(`session/new: [${i.error.code}] ${i.error.message}`);return{...i.result,clientSessionId:d}}async function M(o,r,i="user"){g.set(o,[]);let l=await f("session/prompt",{sessionId:o,prompt:[{type:"text",role:i,text:r}]});await new Promise(m=>setTimeout(m,200));let h=g.get(o)??[];if(g.delete(o),l.error)throw new Error(`session/prompt: [${l.error.code}] ${l.error.message}`);let T=l.result,C=[];for(let m of h)if(m.sessionUpdate==="agent_message_chunk"&&m.content?.text&&C.push(m.content.text),m.sessionUpdate==="tool_call_update"&&m.content)for(let I of m.content)I.content?.text&&C.push(I.content.text);return{stopReason:T.stopReason,updates:h,text:C.join("")}}async function b(o,r){let i=await f("session/configure",{sessionId:o,options:r});if(i.error)throw new Error(`session/configure: [${i.error.code}] ${i.error.message}`)}function D(o){c.send({jsonrpc:"2.0",method:"session/cancel",params:{sessionId:o},agentId:t,sessionId:d})}return Object.assign(u,{initialize:w,sessionNew:U,sessionPrompt:M,sessionConfigure:b,sessionCancel:D,requestTracker:s})}export{R as ACPError,y as CapacityExceededError,x as DisconnectedError,v as ErrorCodes,S as NDJSONClient,E as RequestTimeoutError,j as createACPClient,O as createRequestTracker};
|
package/dist/ndjson-client.d.ts
CHANGED
package/dist/ndjson.d.ts
CHANGED
package/dist/types.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "acp-chat",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"description": "ACP Chat — agent-to-agent dialogue over TCP/Unix socket using the ACP protocol.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
8
14
|
"repository": {
|
|
9
15
|
"url": "https://github.com/morozow/acp-chat",
|
|
10
16
|
"type": "git"
|
|
@@ -13,9 +19,10 @@
|
|
|
13
19
|
"acp-chat": "dist/cli.js"
|
|
14
20
|
},
|
|
15
21
|
"scripts": {
|
|
16
|
-
"build": "
|
|
22
|
+
"build": "node scripts/build.js",
|
|
23
|
+
"build:dev": "tsc",
|
|
17
24
|
"clean": "rm -rf dist",
|
|
18
|
-
"prepublishOnly": "npm run build"
|
|
25
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
19
26
|
},
|
|
20
27
|
"files": [
|
|
21
28
|
"dist",
|
|
@@ -34,7 +41,8 @@
|
|
|
34
41
|
"node": ">=18"
|
|
35
42
|
},
|
|
36
43
|
"devDependencies": {
|
|
37
|
-
"
|
|
38
|
-
"
|
|
44
|
+
"@types/node": "^20.0.0",
|
|
45
|
+
"esbuild": "^0.27.4",
|
|
46
|
+
"typescript": "^5.0.0"
|
|
39
47
|
}
|
|
40
48
|
}
|
package/dist/acp-client.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"acp-client.d.ts","sourceRoot":"","sources":["../src/acp-client.ts"],"names":[],"mappings":"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"}
|
package/dist/acp-client.js
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
// Copyright 2026 Raman Marozau <raman@worktif.com>
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
//
|
|
4
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
// you may not use this file except in compliance with the License.
|
|
6
|
-
// You may obtain a copy of the License at
|
|
7
|
-
//
|
|
8
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
//
|
|
10
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
// See the License for the specific language governing permissions and
|
|
14
|
-
// limitations under the License.
|
|
15
|
-
import { createRequestTracker } from './request-tracker.js';
|
|
16
|
-
import { EventEmitter } from 'node:events';
|
|
17
|
-
// ---------------------------------------------------------------------------
|
|
18
|
-
// Factory
|
|
19
|
-
// ---------------------------------------------------------------------------
|
|
20
|
-
export function createACPClient(ndjsonClient, opts) {
|
|
21
|
-
const { agentId, requestTimeoutMs = 120_000, clientInfo } = opts;
|
|
22
|
-
const emitter = new EventEmitter();
|
|
23
|
-
const requestTracker = createRequestTracker({ defaultTimeoutMs: requestTimeoutMs });
|
|
24
|
-
let nextId = 1;
|
|
25
|
-
const clientSessionId = opts.clientSessionId ?? `client-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
26
|
-
const pendingUpdates = new Map();
|
|
27
|
-
ndjsonClient.on('message', (msg) => {
|
|
28
|
-
const obj = msg;
|
|
29
|
-
if (!obj || obj['jsonrpc'] !== '2.0')
|
|
30
|
-
return;
|
|
31
|
-
if ('id' in obj && ('result' in obj || 'error' in obj)) {
|
|
32
|
-
requestTracker.resolve(obj);
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
if ('method' in obj && !('id' in obj)) {
|
|
36
|
-
const method = obj['method'];
|
|
37
|
-
const params = obj['params'];
|
|
38
|
-
if (method === 'session/update' && params) {
|
|
39
|
-
const sessionId = params['sessionId'];
|
|
40
|
-
const update = params['update'];
|
|
41
|
-
const updates = pendingUpdates.get(sessionId);
|
|
42
|
-
if (updates)
|
|
43
|
-
updates.push(update);
|
|
44
|
-
emitter.emit('update', sessionId, update);
|
|
45
|
-
}
|
|
46
|
-
emitter.emit('notification', method, params);
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
function send(method, params) {
|
|
50
|
-
const id = nextId++;
|
|
51
|
-
const request = { jsonrpc: '2.0', id, method, agentId, sessionId: clientSessionId, params };
|
|
52
|
-
const promise = requestTracker.register(id);
|
|
53
|
-
ndjsonClient.send(request);
|
|
54
|
-
return promise;
|
|
55
|
-
}
|
|
56
|
-
async function initialize() {
|
|
57
|
-
const resp = await send('initialize', {
|
|
58
|
-
protocolVersion: 1,
|
|
59
|
-
clientCapabilities: {},
|
|
60
|
-
clientInfo: clientInfo ?? { name: 'acp-chat', version: '1.0.0' },
|
|
61
|
-
});
|
|
62
|
-
if (resp.error)
|
|
63
|
-
throw new Error(`initialize: [${resp.error.code}] ${resp.error.message}`);
|
|
64
|
-
return resp.result;
|
|
65
|
-
}
|
|
66
|
-
async function sessionNew(configOptions) {
|
|
67
|
-
const params = { cwd: process.cwd(), mcpServers: [] };
|
|
68
|
-
if (configOptions?.length)
|
|
69
|
-
params['configOptions'] = configOptions;
|
|
70
|
-
const resp = await send('session/new', params);
|
|
71
|
-
if (resp.error)
|
|
72
|
-
throw new Error(`session/new: [${resp.error.code}] ${resp.error.message}`);
|
|
73
|
-
return { ...resp.result, clientSessionId };
|
|
74
|
-
}
|
|
75
|
-
async function sessionPrompt(sessionId, text, role = 'user') {
|
|
76
|
-
pendingUpdates.set(sessionId, []);
|
|
77
|
-
const resp = await send('session/prompt', { sessionId, prompt: [{ type: 'text', role, text }] });
|
|
78
|
-
await new Promise(resolve => setTimeout(resolve, 200));
|
|
79
|
-
const updates = pendingUpdates.get(sessionId) ?? [];
|
|
80
|
-
pendingUpdates.delete(sessionId);
|
|
81
|
-
if (resp.error)
|
|
82
|
-
throw new Error(`session/prompt: [${resp.error.code}] ${resp.error.message}`);
|
|
83
|
-
const result = resp.result;
|
|
84
|
-
const textParts = [];
|
|
85
|
-
for (const u of updates) {
|
|
86
|
-
if (u.sessionUpdate === 'agent_message_chunk' && u.content?.text) {
|
|
87
|
-
textParts.push(u.content.text);
|
|
88
|
-
}
|
|
89
|
-
if (u.sessionUpdate === 'tool_call_update' && u.content) {
|
|
90
|
-
for (const c of u.content) {
|
|
91
|
-
if (c.content?.text)
|
|
92
|
-
textParts.push(c.content.text);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return { stopReason: result.stopReason, updates, text: textParts.join('') };
|
|
97
|
-
}
|
|
98
|
-
async function sessionConfigure(sessionId, options) {
|
|
99
|
-
const resp = await send('session/configure', { sessionId, options });
|
|
100
|
-
if (resp.error)
|
|
101
|
-
throw new Error(`session/configure: [${resp.error.code}] ${resp.error.message}`);
|
|
102
|
-
}
|
|
103
|
-
function sessionCancel(sessionId) {
|
|
104
|
-
ndjsonClient.send({
|
|
105
|
-
jsonrpc: '2.0',
|
|
106
|
-
method: 'session/cancel',
|
|
107
|
-
params: { sessionId },
|
|
108
|
-
agentId,
|
|
109
|
-
sessionId: clientSessionId,
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
return Object.assign(emitter, { initialize, sessionNew, sessionPrompt, sessionConfigure, sessionCancel, requestTracker });
|
|
113
|
-
}
|
|
114
|
-
//# sourceMappingURL=acp-client.js.map
|
package/dist/acp-client.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"acp-client.js","sourceRoot":"","sources":["../src/acp-client.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,UAAU;;;;CAIb,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAErE,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,IAAI,CAAC,EAAE,OAAO,CAAC;gBAEnB,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;CAM7D;AAED,qBAAa,qBAAsB,SAAQ,QAAQ;gBACrC,OAAO,SAAsB,EAAE,IAAI,CAAC,EAAE,OAAO;CAI1D;AAED,qBAAa,mBAAoB,SAAQ,QAAQ;gBACnC,OAAO,SAAoB,EAAE,IAAI,CAAC,EAAE,OAAO;CAIxD;AAED,qBAAa,iBAAkB,SAAQ,QAAQ;gBACjC,OAAO,SAAiB,EAAE,IAAI,CAAC,EAAE,OAAO;CAIrD"}
|
package/dist/errors.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
// Copyright 2026 Raman Marozau <raman@worktif.com>
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
//
|
|
4
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
// you may not use this file except in compliance with the License.
|
|
6
|
-
// You may obtain a copy of the License at
|
|
7
|
-
//
|
|
8
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
//
|
|
10
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
// See the License for the specific language governing permissions and
|
|
14
|
-
// limitations under the License.
|
|
15
|
-
// ============================================================================
|
|
16
|
-
// ACP Chat — Error Classes
|
|
17
|
-
// ============================================================================
|
|
18
|
-
export const ErrorCodes = {
|
|
19
|
-
CAPACITY_EXCEEDED: -32000,
|
|
20
|
-
REQUEST_TIMEOUT: -32001,
|
|
21
|
-
DISCONNECTED: -32004,
|
|
22
|
-
};
|
|
23
|
-
export class ACPError extends Error {
|
|
24
|
-
code;
|
|
25
|
-
data;
|
|
26
|
-
constructor(code, message, data) {
|
|
27
|
-
super(message);
|
|
28
|
-
this.name = 'ACPError';
|
|
29
|
-
this.code = code;
|
|
30
|
-
this.data = data;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
export class CapacityExceededError extends ACPError {
|
|
34
|
-
constructor(message = 'Capacity exceeded', data) {
|
|
35
|
-
super(ErrorCodes.CAPACITY_EXCEEDED, message, data);
|
|
36
|
-
this.name = 'CapacityExceededError';
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
export class RequestTimeoutError extends ACPError {
|
|
40
|
-
constructor(message = 'Request timeout', data) {
|
|
41
|
-
super(ErrorCodes.REQUEST_TIMEOUT, message, data);
|
|
42
|
-
this.name = 'RequestTimeoutError';
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
export class DisconnectedError extends ACPError {
|
|
46
|
-
constructor(message = 'Disconnected', data) {
|
|
47
|
-
super(ErrorCodes.DISCONNECTED, message, data);
|
|
48
|
-
this.name = 'DisconnectedError';
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,sCAAsC;AACtC,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAE/E,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,iBAAiB,EAAE,CAAC,KAAK;IACzB,eAAe,EAAE,CAAC,KAAK;IACvB,YAAY,EAAE,CAAC,KAAK;CACZ,CAAC;AAIX,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjB,IAAI,CAAY;IAChB,IAAI,CAAW;IAE/B,YAAY,IAAe,EAAE,OAAe,EAAE,IAAc;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,QAAQ;IACjD,YAAY,OAAO,GAAG,mBAAmB,EAAE,IAAc;QACvD,KAAK,CAAC,UAAU,CAAC,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;IAC/C,YAAY,OAAO,GAAG,iBAAiB,EAAE,IAAc;QACrD,KAAK,CAAC,UAAU,CAAC,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,QAAQ;IAC7C,YAAY,OAAO,GAAG,cAAc,EAAE,IAAc;QAClD,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC1R,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAClH,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,sCAAsC;AACtC,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,OAAO,EAAE,YAAY,EAAqD,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,eAAe,EAA0O,MAAM,iBAAiB,CAAC;AAC1R,OAAO,EAAE,oBAAoB,EAAmD,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ndjson-client.d.ts","sourceRoot":"","sources":["../src/ndjson-client.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAElC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;;;OAMG;IACH,cAAc,EAAE,KAAK,GAAG,MAAM,CAAC;IAE/B;;;;OAIG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAE7B;;;;OAIG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAE7B;;;;;;OAMG;IACH,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAChC,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAClD;AAED,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsB;IAC3C,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,YAAY,CAAS;gBAEjB,IAAI,EAAE,mBAAmB;IAKrC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASxB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAO5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBtB,WAAW,IAAI,OAAO;IACtB,QAAQ,IAAI,eAAe;IAE3B,OAAO,CAAC,gBAAgB;IAmCxB,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,mBAAmB;CAM5B"}
|
package/dist/ndjson-client.js
DELETED
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
// Copyright 2026 Raman Marozau <raman@worktif.com>
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
//
|
|
4
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
// you may not use this file except in compliance with the License.
|
|
6
|
-
// You may obtain a copy of the License at
|
|
7
|
-
//
|
|
8
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
//
|
|
10
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
// See the License for the specific language governing permissions and
|
|
14
|
-
// limitations under the License.
|
|
15
|
-
// ============================================================================
|
|
16
|
-
// ACP Chat — NDJSON Client (TCP/Unix Socket Transport)
|
|
17
|
-
// ============================================================================
|
|
18
|
-
import { EventEmitter } from 'node:events';
|
|
19
|
-
import * as net from 'node:net';
|
|
20
|
-
import { serializeNdjson, deserializeNdjsonLine } from './ndjson.js';
|
|
21
|
-
import { DisconnectedError } from './errors.js';
|
|
22
|
-
export class NDJSONClient extends EventEmitter {
|
|
23
|
-
opts;
|
|
24
|
-
socket = null;
|
|
25
|
-
state = 'disconnected';
|
|
26
|
-
reconnectAttempt = 0;
|
|
27
|
-
reconnectTimer = null;
|
|
28
|
-
lineBuffer = '';
|
|
29
|
-
closedByUser = false;
|
|
30
|
-
constructor(opts) {
|
|
31
|
-
super();
|
|
32
|
-
this.opts = opts;
|
|
33
|
-
}
|
|
34
|
-
connect() {
|
|
35
|
-
if (this.state === 'connected' || this.state === 'connecting')
|
|
36
|
-
return Promise.resolve();
|
|
37
|
-
if (this.state === 'closed')
|
|
38
|
-
return Promise.reject(new Error('Client has been closed'));
|
|
39
|
-
this.closedByUser = false;
|
|
40
|
-
this.reconnectAttempt = 0;
|
|
41
|
-
return this.createConnection();
|
|
42
|
-
}
|
|
43
|
-
send(message) {
|
|
44
|
-
if (this.state !== 'connected' || !this.socket) {
|
|
45
|
-
throw new DisconnectedError('Cannot send: not connected to stdio Bus');
|
|
46
|
-
}
|
|
47
|
-
this.socket.write(serializeNdjson(message));
|
|
48
|
-
}
|
|
49
|
-
close() {
|
|
50
|
-
this.closedByUser = true;
|
|
51
|
-
this.clearReconnectTimer();
|
|
52
|
-
const prevState = this.state;
|
|
53
|
-
this.state = 'closed';
|
|
54
|
-
if (prevState === 'closed' || prevState === 'disconnected')
|
|
55
|
-
return Promise.resolve();
|
|
56
|
-
return new Promise((resolve) => {
|
|
57
|
-
if (this.socket) {
|
|
58
|
-
const sock = this.socket;
|
|
59
|
-
this.socket = null;
|
|
60
|
-
if (sock.destroyed) {
|
|
61
|
-
resolve();
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
sock.once('close', () => resolve());
|
|
65
|
-
sock.destroy();
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
resolve();
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
isConnected() { return this.state === 'connected'; }
|
|
73
|
-
getState() { return this.state; }
|
|
74
|
-
createConnection() {
|
|
75
|
-
return new Promise((resolve, reject) => {
|
|
76
|
-
this.state = this.reconnectAttempt === 0 ? 'connecting' : 'reconnecting';
|
|
77
|
-
this.lineBuffer = '';
|
|
78
|
-
const connectOpts = this.buildConnectOptions();
|
|
79
|
-
const socket = net.createConnection(connectOpts);
|
|
80
|
-
this.socket = socket;
|
|
81
|
-
const onConnect = () => {
|
|
82
|
-
cleanup();
|
|
83
|
-
this.state = 'connected';
|
|
84
|
-
this.reconnectAttempt = 0;
|
|
85
|
-
this.wireSocketEvents(socket);
|
|
86
|
-
resolve();
|
|
87
|
-
};
|
|
88
|
-
const onError = (err) => {
|
|
89
|
-
cleanup();
|
|
90
|
-
if (this.reconnectAttempt === 0 && this.state === 'connecting') {
|
|
91
|
-
this.state = 'disconnected';
|
|
92
|
-
reject(err);
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
|
-
const cleanup = () => {
|
|
96
|
-
socket.removeListener('connect', onConnect);
|
|
97
|
-
socket.removeListener('error', onError);
|
|
98
|
-
};
|
|
99
|
-
socket.once('connect', onConnect);
|
|
100
|
-
socket.once('error', onError);
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
buildConnectOptions() {
|
|
104
|
-
if (this.opts.connectionType === 'unix')
|
|
105
|
-
return { path: this.opts.address };
|
|
106
|
-
const lastColon = this.opts.address.lastIndexOf(':');
|
|
107
|
-
if (lastColon === -1)
|
|
108
|
-
throw new Error(`Invalid TCP address: expected "host:port", got "${this.opts.address}"`);
|
|
109
|
-
const host = this.opts.address.slice(0, lastColon);
|
|
110
|
-
const port = parseInt(this.opts.address.slice(lastColon + 1), 10);
|
|
111
|
-
if (isNaN(port))
|
|
112
|
-
throw new Error(`Invalid TCP port in address "${this.opts.address}"`);
|
|
113
|
-
return { host, port };
|
|
114
|
-
}
|
|
115
|
-
wireSocketEvents(socket) {
|
|
116
|
-
socket.on('data', (chunk) => this.handleData(chunk.toString('utf-8')));
|
|
117
|
-
socket.on('error', (err) => this.emit('error', err));
|
|
118
|
-
socket.on('close', () => {
|
|
119
|
-
if (this.closedByUser || this.state === 'closed')
|
|
120
|
-
return;
|
|
121
|
-
this.state = 'disconnected';
|
|
122
|
-
this.emit('disconnect');
|
|
123
|
-
this.scheduleReconnect();
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
handleData(data) {
|
|
127
|
-
this.lineBuffer += data;
|
|
128
|
-
let newlineIdx;
|
|
129
|
-
while ((newlineIdx = this.lineBuffer.indexOf('\n')) !== -1) {
|
|
130
|
-
const line = this.lineBuffer.slice(0, newlineIdx);
|
|
131
|
-
this.lineBuffer = this.lineBuffer.slice(newlineIdx + 1);
|
|
132
|
-
if (line.length === 0)
|
|
133
|
-
continue;
|
|
134
|
-
try {
|
|
135
|
-
this.emit('message', deserializeNdjsonLine(line));
|
|
136
|
-
}
|
|
137
|
-
catch (err) {
|
|
138
|
-
this.emit('framingError', line, err instanceof Error ? err : new Error(String(err)));
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
scheduleReconnect() {
|
|
143
|
-
if (this.closedByUser || this.state === 'closed')
|
|
144
|
-
return;
|
|
145
|
-
if (this.reconnectAttempt >= this.opts.maxReconnectAttempts) {
|
|
146
|
-
this.state = 'disconnected';
|
|
147
|
-
this.emit('disconnect');
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
this.state = 'reconnecting';
|
|
151
|
-
const attempt = this.reconnectAttempt++;
|
|
152
|
-
const jitter = Math.random() * this.opts.baseReconnectDelayMs;
|
|
153
|
-
const delay = Math.min(this.opts.baseReconnectDelayMs * Math.pow(2, attempt) + jitter, this.opts.maxReconnectDelayMs);
|
|
154
|
-
this.reconnectTimer = setTimeout(() => {
|
|
155
|
-
this.reconnectTimer = null;
|
|
156
|
-
this.emit('reconnect', this.reconnectAttempt);
|
|
157
|
-
this.attemptReconnect();
|
|
158
|
-
}, delay);
|
|
159
|
-
}
|
|
160
|
-
attemptReconnect() {
|
|
161
|
-
if (this.closedByUser || this.state === 'closed')
|
|
162
|
-
return;
|
|
163
|
-
this.lineBuffer = '';
|
|
164
|
-
const socket = net.createConnection(this.buildConnectOptions());
|
|
165
|
-
this.socket = socket;
|
|
166
|
-
socket.once('connect', () => {
|
|
167
|
-
socket.removeAllListeners('error');
|
|
168
|
-
this.state = 'connected';
|
|
169
|
-
this.reconnectAttempt = 0;
|
|
170
|
-
this.wireSocketEvents(socket);
|
|
171
|
-
});
|
|
172
|
-
socket.once('error', () => {
|
|
173
|
-
socket.destroy();
|
|
174
|
-
this.scheduleReconnect();
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
clearReconnectTimer() {
|
|
178
|
-
if (this.reconnectTimer !== null) {
|
|
179
|
-
clearTimeout(this.reconnectTimer);
|
|
180
|
-
this.reconnectTimer = null;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
//# sourceMappingURL=ndjson-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ndjson-client.js","sourceRoot":"","sources":["../src/ndjson-client.ts"],"names":[],"mappings":"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"}
|
package/dist/ndjson.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ndjson.d.ts","sourceRoot":"","sources":["../src/ndjson.ts"],"names":[],"mappings":"AAmBA,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAMpD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D"}
|
package/dist/ndjson.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
// Copyright 2026 Raman Marozau <raman@worktif.com>
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
//
|
|
4
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
// you may not use this file except in compliance with the License.
|
|
6
|
-
// You may obtain a copy of the License at
|
|
7
|
-
//
|
|
8
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
//
|
|
10
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
// See the License for the specific language governing permissions and
|
|
14
|
-
// limitations under the License.
|
|
15
|
-
// ============================================================================
|
|
16
|
-
// ACP Chat — NDJSON Framing
|
|
17
|
-
// ============================================================================
|
|
18
|
-
export function serializeNdjson(obj) {
|
|
19
|
-
const json = JSON.stringify(obj);
|
|
20
|
-
if (json === undefined) {
|
|
21
|
-
throw new TypeError('Value is not JSON-serializable');
|
|
22
|
-
}
|
|
23
|
-
return json + '\n';
|
|
24
|
-
}
|
|
25
|
-
export function deserializeNdjsonLine(line) {
|
|
26
|
-
return JSON.parse(line);
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=ndjson.js.map
|
package/dist/ndjson.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ndjson.js","sourceRoot":"","sources":["../src/ndjson.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,sCAAsC;AACtC,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,+EAA+E;AAC/E,4BAA4B;AAC5B,+EAA+E;AAE/E,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,SAAS,CAAC,gCAAgC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-tracker.d.ts","sourceRoot":"","sources":["../src/request-tracker.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAgB,MAAM,YAAY,CAAC;AAG3E,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AASD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACtE,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC;IAC5C,SAAS,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC;IAC/B,YAAY,IAAI,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC;CACpC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,cAAc,CAqD1F"}
|
package/dist/request-tracker.js
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
// Copyright 2026 Raman Marozau <raman@worktif.com>
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
//
|
|
4
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
// you may not use this file except in compliance with the License.
|
|
6
|
-
// You may obtain a copy of the License at
|
|
7
|
-
//
|
|
8
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
//
|
|
10
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
// See the License for the specific language governing permissions and
|
|
14
|
-
// limitations under the License.
|
|
15
|
-
import { CapacityExceededError, RequestTimeoutError } from './errors.js';
|
|
16
|
-
const DEFAULT_OPTIONS = {
|
|
17
|
-
maxPending: 4096,
|
|
18
|
-
defaultTimeoutMs: 30_000,
|
|
19
|
-
};
|
|
20
|
-
const MIN_TIMEOUT_MS = 1000;
|
|
21
|
-
export function createRequestTracker(opts) {
|
|
22
|
-
const options = { ...DEFAULT_OPTIONS, ...opts };
|
|
23
|
-
if (options.defaultTimeoutMs < MIN_TIMEOUT_MS) {
|
|
24
|
-
options.defaultTimeoutMs = MIN_TIMEOUT_MS;
|
|
25
|
-
}
|
|
26
|
-
const pending = new Map();
|
|
27
|
-
function register(id, timeoutMs) {
|
|
28
|
-
if (pending.size >= options.maxPending) {
|
|
29
|
-
return Promise.reject(new CapacityExceededError(`Maximum pending requests (${options.maxPending}) exceeded`));
|
|
30
|
-
}
|
|
31
|
-
let effectiveTimeout = timeoutMs ?? options.defaultTimeoutMs;
|
|
32
|
-
if (effectiveTimeout < MIN_TIMEOUT_MS) {
|
|
33
|
-
effectiveTimeout = MIN_TIMEOUT_MS;
|
|
34
|
-
}
|
|
35
|
-
return new Promise((resolve, reject) => {
|
|
36
|
-
const timeoutHandle = setTimeout(() => {
|
|
37
|
-
pending.delete(id);
|
|
38
|
-
reject(new RequestTimeoutError(`Request ${String(id)} timed out after ${effectiveTimeout}ms`, { id, timeoutMs: effectiveTimeout }));
|
|
39
|
-
}, effectiveTimeout);
|
|
40
|
-
if (timeoutHandle.unref) {
|
|
41
|
-
timeoutHandle.unref();
|
|
42
|
-
}
|
|
43
|
-
pending.set(id, { id, registeredAt: Date.now(), timeoutMs: effectiveTimeout, timeoutHandle, resolve, reject });
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
function resolve(response) {
|
|
47
|
-
const entry = pending.get(response.id);
|
|
48
|
-
if (!entry)
|
|
49
|
-
return false;
|
|
50
|
-
clearTimeout(entry.timeoutHandle);
|
|
51
|
-
pending.delete(response.id);
|
|
52
|
-
entry.resolve(response);
|
|
53
|
-
return true;
|
|
54
|
-
}
|
|
55
|
-
function cancelAll(reason) {
|
|
56
|
-
for (const [, entry] of pending) {
|
|
57
|
-
clearTimeout(entry.timeoutHandle);
|
|
58
|
-
entry.reject(reason);
|
|
59
|
-
}
|
|
60
|
-
pending.clear();
|
|
61
|
-
}
|
|
62
|
-
return { register, resolve, cancelAll, pendingCount: () => pending.size, hasPending: (id) => pending.has(id) };
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=request-tracker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-tracker.js","sourceRoot":"","sources":["../src/request-tracker.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAExC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,SAAS,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC;IAC9B,OAAO,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;IAC7C,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,QAAQ,CAAC"}
|
package/dist/types.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// Copyright 2026 Raman Marozau <raman@worktif.com>
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
//
|
|
4
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
// you may not use this file except in compliance with the License.
|
|
6
|
-
// You may obtain a copy of the License at
|
|
7
|
-
//
|
|
8
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
//
|
|
10
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
// See the License for the specific language governing permissions and
|
|
14
|
-
// limitations under the License.
|
|
15
|
-
export {};
|
|
16
|
-
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,sCAAsC;AACtC,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC"}
|