teamshare-bridge 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +343 -0
  2. package/dist/bridge/daemon.d.ts +1 -0
  3. package/dist/bridge/daemon.js +230 -0
  4. package/dist/bridge/daemon.js.map +1 -0
  5. package/dist/bridge/index.d.ts +2 -0
  6. package/dist/bridge/index.js +273 -0
  7. package/dist/bridge/index.js.map +1 -0
  8. package/dist/bridge/local-server.d.ts +29 -0
  9. package/dist/bridge/local-server.js +87 -0
  10. package/dist/bridge/local-server.js.map +1 -0
  11. package/dist/bridge/protocol.d.ts +4 -0
  12. package/dist/bridge/protocol.js +151 -0
  13. package/dist/bridge/protocol.js.map +1 -0
  14. package/dist/bridge/service.d.ts +32 -0
  15. package/dist/bridge/service.js +248 -0
  16. package/dist/bridge/service.js.map +1 -0
  17. package/dist/bridge/spawn.d.ts +15 -0
  18. package/dist/bridge/spawn.js +271 -0
  19. package/dist/bridge/spawn.js.map +1 -0
  20. package/dist/cli/index.d.ts +2 -0
  21. package/dist/cli/index.js +543 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/lib/api.d.ts +191 -0
  24. package/dist/lib/api.js +209 -0
  25. package/dist/lib/api.js.map +1 -0
  26. package/dist/lib/brief.d.ts +16 -0
  27. package/dist/lib/brief.js +115 -0
  28. package/dist/lib/brief.js.map +1 -0
  29. package/dist/lib/chat-reply.d.ts +29 -0
  30. package/dist/lib/chat-reply.js +126 -0
  31. package/dist/lib/chat-reply.js.map +1 -0
  32. package/dist/lib/config.d.ts +25 -0
  33. package/dist/lib/config.js +81 -0
  34. package/dist/lib/config.js.map +1 -0
  35. package/dist/lib/doc-reply.d.ts +22 -0
  36. package/dist/lib/doc-reply.js +108 -0
  37. package/dist/lib/doc-reply.js.map +1 -0
  38. package/dist/lib/llm.d.ts +50 -0
  39. package/dist/lib/llm.js +444 -0
  40. package/dist/lib/llm.js.map +1 -0
  41. package/dist/lib/lock.d.ts +41 -0
  42. package/dist/lib/lock.js +148 -0
  43. package/dist/lib/lock.js.map +1 -0
  44. package/dist/lib/models.d.ts +30 -0
  45. package/dist/lib/models.js +51 -0
  46. package/dist/lib/models.js.map +1 -0
  47. package/dist/lib/partial-stream.d.ts +25 -0
  48. package/dist/lib/partial-stream.js +99 -0
  49. package/dist/lib/partial-stream.js.map +1 -0
  50. package/dist/lib/session-stream.d.ts +38 -0
  51. package/dist/lib/session-stream.js +191 -0
  52. package/dist/lib/session-stream.js.map +1 -0
  53. package/package.json +44 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/lib/lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Curated model catalog (Phase D+): provider -> OpenAI-compatible base URL
3
+ * resolution for `provider:model` specs stored in Agent.model.
4
+ *
5
+ * The authoritative copy + update process live in `docs/agent-models.md`.
6
+ * This file mirrors the frontend catalog
7
+ * (`frontend/src/lib/constants/models.ts`) and the docs table — keep all
8
+ * three in sync (see the docs for the 3-step update process).
9
+ */
10
+ export declare const MODEL_BASE_URLS: Record<string, string>;
11
+ /** Provider keys accepted by the catalog (for validation/docs). */
12
+ export declare const MODEL_PROVIDERS: string[];
13
+ /** Default OpenAI-compatible base when nothing else is configured. */
14
+ export declare const DEFAULT_LLM_BASE_URL = "https://api.openai.com/v1";
15
+ export interface ResolvedModel {
16
+ /** Base URL for chat/completions (env LLM_BASE_URL always wins). */
17
+ baseUrl: string;
18
+ /** Model id sent to the API. */
19
+ model: string;
20
+ /** True when the spec was resolved via the catalog (vs raw env default). */
21
+ catalogued: boolean;
22
+ }
23
+ /**
24
+ * Resolves a model spec to (baseUrl, model):
25
+ * - `provider:model` (e.g. "gemini:gemini-2.5-flash") -> catalog base URL.
26
+ * - Anything else (legacy "deepseek-chat") -> env LLM_BASE_URL default,
27
+ * preserving the pre-catalog behavior.
28
+ * Precedence for the base URL: LLM_BASE_URL env > catalog provider URL.
29
+ */
30
+ export declare function resolveModel(spec: string, envBaseUrl?: string): ResolvedModel;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * Curated model catalog (Phase D+): provider -> OpenAI-compatible base URL
4
+ * resolution for `provider:model` specs stored in Agent.model.
5
+ *
6
+ * The authoritative copy + update process live in `docs/agent-models.md`.
7
+ * This file mirrors the frontend catalog
8
+ * (`frontend/src/lib/constants/models.ts`) and the docs table — keep all
9
+ * three in sync (see the docs for the 3-step update process).
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.DEFAULT_LLM_BASE_URL = exports.MODEL_PROVIDERS = exports.MODEL_BASE_URLS = void 0;
13
+ exports.resolveModel = resolveModel;
14
+ exports.MODEL_BASE_URLS = {
15
+ gemini: 'https://generativelanguage.googleapis.com/v1beta/openai',
16
+ deepseek: 'https://api.deepseek.com',
17
+ openai: 'https://api.openai.com/v1',
18
+ groq: 'https://api.groq.com/openai/v1',
19
+ openrouter: 'https://openrouter.ai/api/v1',
20
+ mistral: 'https://api.mistral.ai/v1',
21
+ };
22
+ /** Provider keys accepted by the catalog (for validation/docs). */
23
+ exports.MODEL_PROVIDERS = Object.keys(exports.MODEL_BASE_URLS);
24
+ /** Default OpenAI-compatible base when nothing else is configured. */
25
+ exports.DEFAULT_LLM_BASE_URL = 'https://api.openai.com/v1';
26
+ /**
27
+ * Resolves a model spec to (baseUrl, model):
28
+ * - `provider:model` (e.g. "gemini:gemini-2.5-flash") -> catalog base URL.
29
+ * - Anything else (legacy "deepseek-chat") -> env LLM_BASE_URL default,
30
+ * preserving the pre-catalog behavior.
31
+ * Precedence for the base URL: LLM_BASE_URL env > catalog provider URL.
32
+ */
33
+ function resolveModel(spec, envBaseUrl) {
34
+ const colon = spec.indexOf(':');
35
+ const provider = colon > 0 ? spec.slice(0, colon) : '';
36
+ const modelId = colon > 0 ? spec.slice(colon + 1) : spec;
37
+ const catalogUrl = exports.MODEL_BASE_URLS[provider];
38
+ if (catalogUrl) {
39
+ return {
40
+ baseUrl: envBaseUrl ?? catalogUrl,
41
+ model: modelId,
42
+ catalogued: true,
43
+ };
44
+ }
45
+ return {
46
+ baseUrl: envBaseUrl ?? exports.DEFAULT_LLM_BASE_URL,
47
+ model: spec,
48
+ catalogued: false,
49
+ };
50
+ }
51
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/lib/models.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAiCH,oCAiBC;AAhDY,QAAA,eAAe,GAA2B;IACrD,MAAM,EAAE,yDAAyD;IACjE,QAAQ,EAAE,0BAA0B;IACpC,MAAM,EAAE,2BAA2B;IACnC,IAAI,EAAE,gCAAgC;IACtC,UAAU,EAAE,8BAA8B;IAC1C,OAAO,EAAE,2BAA2B;CACrC,CAAC;AAEF,mEAAmE;AACtD,QAAA,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,uBAAe,CAAC,CAAC;AAE5D,sEAAsE;AACzD,QAAA,oBAAoB,GAAG,2BAA2B,CAAC;AAWhE;;;;;;GAMG;AACH,SAAgB,YAAY,CAAC,IAAY,EAAE,UAAmB;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,MAAM,UAAU,GAAG,uBAAe,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,UAAU,IAAI,UAAU;YACjC,KAAK,EAAE,OAAO;YACd,UAAU,EAAE,IAAI;SACjB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO,EAAE,UAAU,IAAI,4BAAoB;QAC3C,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,KAAK;KAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface PartialStreamOptions {
2
+ wsBase: string;
3
+ apiKey: string;
4
+ projectId: string;
5
+ channelId?: string;
6
+ }
7
+ export declare class PartialStream {
8
+ private readonly opts;
9
+ private socket;
10
+ private readonly draftId;
11
+ private readonly projectId;
12
+ private channelId?;
13
+ private seq;
14
+ private buffer;
15
+ private timer;
16
+ private closed;
17
+ constructor(opts: PartialStreamOptions, draftId: string);
18
+ /** Best-effort connect - failures degrade to non-streaming silently. */
19
+ connect(): void;
20
+ /** Buffer a token delta and flush it in coalesced frames. */
21
+ token(delta: string): void;
22
+ private flush;
23
+ /** Flush remaining tokens + announce the persisted message. */
24
+ end(messageId?: string): void;
25
+ }
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PartialStream = void 0;
4
+ /**
5
+ * Phase C chat streaming (IMP-530): forwards generated reply tokens to the
6
+ * project channel as `message:partial` frames over the /chat socket
7
+ * (apiKey auth, like the REST dual-auth surface). The final message is still
8
+ * posted via POST /chat/messages — this client only relays the live draft;
9
+ * the backend never persists partials.
10
+ */
11
+ const socket_io_client_1 = require("socket.io-client");
12
+ const MAX_RATE_MS = 80; // coalesce frames to <= ~12 packets/sec
13
+ const MAX_FRAME = 240; // chars per frame (multi-byte safe splits below)
14
+ class PartialStream {
15
+ opts;
16
+ socket = null;
17
+ draftId;
18
+ projectId;
19
+ channelId;
20
+ seq = 0;
21
+ buffer = '';
22
+ timer = null;
23
+ closed = false;
24
+ constructor(opts, draftId) {
25
+ this.opts = opts;
26
+ this.draftId = draftId;
27
+ this.projectId = opts.projectId;
28
+ this.channelId = opts.channelId;
29
+ }
30
+ /** Best-effort connect - failures degrade to non-streaming silently. */
31
+ connect() {
32
+ try {
33
+ this.socket = (0, socket_io_client_1.io)(`${this.opts.wsBase}/chat`, {
34
+ transports: ['websocket'],
35
+ auth: { apiKey: this.opts.apiKey },
36
+ reconnection: true,
37
+ reconnectionDelay: 2_000,
38
+ reconnectionDelayMax: 15_000,
39
+ });
40
+ }
41
+ catch {
42
+ this.socket = null;
43
+ }
44
+ }
45
+ /** Buffer a token delta and flush it in coalesced frames. */
46
+ token(delta) {
47
+ if (this.closed)
48
+ return;
49
+ this.buffer += delta;
50
+ if (!this.timer) {
51
+ this.timer = setTimeout(() => this.flush(), MAX_RATE_MS);
52
+ }
53
+ }
54
+ flush() {
55
+ if (this.timer) {
56
+ clearTimeout(this.timer);
57
+ this.timer = null;
58
+ }
59
+ if (!this.buffer)
60
+ return;
61
+ const chunk = this.buffer;
62
+ this.buffer = '';
63
+ const safe = chunk.slice(0, MAX_FRAME);
64
+ if (chunk.length > MAX_FRAME)
65
+ this.buffer = chunk.slice(MAX_FRAME);
66
+ this.seq += 1;
67
+ this.socket?.emit('message:partial', {
68
+ projectId: this.projectId,
69
+ channelId: this.channelId,
70
+ draftId: this.draftId,
71
+ sessionId: null,
72
+ seq: this.seq,
73
+ text: safe,
74
+ });
75
+ }
76
+ /** Flush remaining tokens + announce the persisted message. */
77
+ end(messageId) {
78
+ if (this.closed)
79
+ return;
80
+ this.closed = true;
81
+ this.flush();
82
+ this.socket?.emit('message:partial:end', {
83
+ projectId: this.projectId,
84
+ channelId: this.channelId,
85
+ draftId: this.draftId,
86
+ sessionId: null,
87
+ messageId: messageId ?? null,
88
+ });
89
+ try {
90
+ this.socket?.disconnect();
91
+ }
92
+ catch {
93
+ /* best-effort */
94
+ }
95
+ this.socket = null;
96
+ }
97
+ }
98
+ exports.PartialStream = PartialStream;
99
+ //# sourceMappingURL=partial-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partial-stream.js","sourceRoot":"","sources":["../../src/lib/partial-stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export interface SessionFrame {
2
+ stream: 'stdout' | 'stderr';
3
+ text: string;
4
+ at: string;
5
+ }
6
+ export interface SessionMeta {
7
+ sessionId: string;
8
+ agentId: string;
9
+ projectId?: string;
10
+ taskId?: string;
11
+ mode: 'run' | 'chat';
12
+ model?: string | null;
13
+ }
14
+ export declare function sessionsDir(): string;
15
+ /** Generates a session id (`session_<uuid>`), shared by spawn/daemon. */
16
+ export declare function newSessionId(): string;
17
+ export declare class SessionStream {
18
+ readonly sessionId: string;
19
+ readonly meta: SessionMeta;
20
+ private readonly startedAtISO;
21
+ private socket;
22
+ private lines;
23
+ private pending;
24
+ private timer;
25
+ private ended;
26
+ private started;
27
+ constructor(meta: SessionMeta);
28
+ /** Best-effort connect + emit session:start. Never throws. */
29
+ connect(wsBase: string, apiKey: string): void;
30
+ /** Tees a console line into the stream buffer (batched upstream). */
31
+ line(text: string, stream?: 'stdout' | 'stderr'): void;
32
+ private emitFrame;
33
+ private flush;
34
+ /** Flushes and emits session:end (waits briefly for the ack). */
35
+ end(exitCode: number | null): Promise<void>;
36
+ /** Writes the transcript tail to ~/.teamshare/sessions/<id>.json. */
37
+ private persist;
38
+ }
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionStream = void 0;
4
+ exports.sessionsDir = sessionsDir;
5
+ exports.newSessionId = newSessionId;
6
+ /**
7
+ * Phase A live console (IMP-510): streams a CLI session's output to the
8
+ * TeamShare backend over the /agents WebSocket (`session:start` /
9
+ * `session:output` / `session:end`, batched ~200ms) and mirrors the
10
+ * transcript tail to ~/.teamshare/sessions/<sessionId>.json so a
11
+ * reconnected browser can replay the last lines.
12
+ *
13
+ * Best-effort by design: any failure (backend down, socket drop) degrades
14
+ * to local console output only - it must never break the session itself.
15
+ */
16
+ const node_crypto_1 = require("node:crypto");
17
+ const node_fs_1 = require("node:fs");
18
+ const node_os_1 = require("node:os");
19
+ const node_path_1 = require("node:path");
20
+ const socket_io_client_1 = require("socket.io-client");
21
+ const BATCH_MS = 200;
22
+ const TRANSCRIPT_LIMIT = 500;
23
+ const SESSIONS_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), '.teamshare', 'sessions');
24
+ function sessionsDir() {
25
+ return SESSIONS_DIR;
26
+ }
27
+ /** Generates a session id (`session_<uuid>`), shared by spawn/daemon. */
28
+ function newSessionId() {
29
+ return `session_${(0, node_crypto_1.randomUUID)()}`;
30
+ }
31
+ function localPath(sessionId) {
32
+ return (0, node_path_1.join)(SESSIONS_DIR, `${sessionId}.json`);
33
+ }
34
+ class SessionStream {
35
+ sessionId;
36
+ meta;
37
+ startedAtISO;
38
+ socket = null;
39
+ lines = [];
40
+ pending = [];
41
+ timer = null;
42
+ ended = false;
43
+ started = false;
44
+ constructor(meta) {
45
+ this.sessionId = meta.sessionId;
46
+ this.meta = meta;
47
+ this.startedAtISO = new Date().toISOString();
48
+ }
49
+ /** Best-effort connect + emit session:start. Never throws. */
50
+ connect(wsBase, apiKey) {
51
+ try {
52
+ this.socket = (0, socket_io_client_1.io)(wsBase, {
53
+ transports: ['websocket'],
54
+ auth: { apiKey },
55
+ reconnection: true,
56
+ reconnectionDelay: 2_000,
57
+ reconnectionDelayMax: 30_000,
58
+ });
59
+ this.socket.on('connect', () => {
60
+ // The join ack confirms the gateway finished authenticating this
61
+ // socket (client.agentId is set). Only then is it safe to emit
62
+ // session:start - the gateway rejects it otherwise.
63
+ const joinAndStart = () => {
64
+ this.socket?.emit('join', { ack: true }, (res) => {
65
+ if (res?.success) {
66
+ this.socket?.emit('session:start', {
67
+ sessionId: this.meta.sessionId,
68
+ agentId: this.meta.agentId,
69
+ projectId: this.meta.projectId ?? undefined,
70
+ taskId: this.meta.taskId ?? undefined,
71
+ mode: this.meta.mode,
72
+ model: this.meta.model ?? null,
73
+ startedAt: this.startedAtISO,
74
+ });
75
+ this.started = true;
76
+ // Replay anything buffered while disconnected.
77
+ if (this.pending.length) {
78
+ for (const frame of this.pending)
79
+ this.emitFrame(frame);
80
+ this.pending = [];
81
+ }
82
+ }
83
+ else {
84
+ // Auth not ready yet - retry shortly (the gateway handler is
85
+ // async; the ack arrives once it completes).
86
+ setTimeout(joinAndStart, 1000);
87
+ }
88
+ });
89
+ };
90
+ joinAndStart();
91
+ });
92
+ this.socket.on('connect_error', () => {
93
+ /* retry automatically - output keeps buffering locally */
94
+ });
95
+ }
96
+ catch {
97
+ this.socket = null;
98
+ }
99
+ }
100
+ /** Tees a console line into the stream buffer (batched upstream). */
101
+ line(text, stream = 'stdout') {
102
+ const frame = {
103
+ stream,
104
+ text,
105
+ at: new Date().toISOString(),
106
+ };
107
+ this.lines.push(frame);
108
+ if (this.lines.length > TRANSCRIPT_LIMIT) {
109
+ this.lines.splice(0, this.lines.length - TRANSCRIPT_LIMIT);
110
+ }
111
+ if (!this.socket?.connected) {
112
+ if (this.pending.length < TRANSCRIPT_LIMIT)
113
+ this.pending.push(frame);
114
+ this.persist();
115
+ return;
116
+ }
117
+ this.pending.push(frame);
118
+ if (!this.timer) {
119
+ this.timer = setTimeout(() => this.flush(), BATCH_MS);
120
+ }
121
+ this.persist();
122
+ }
123
+ emitFrame(frame) {
124
+ this.socket?.emit('session:output', {
125
+ sessionId: this.sessionId,
126
+ stream: frame.stream,
127
+ text: frame.text,
128
+ at: frame.at,
129
+ });
130
+ }
131
+ flush() {
132
+ if (this.timer) {
133
+ clearTimeout(this.timer);
134
+ this.timer = null;
135
+ }
136
+ if (!this.pending.length)
137
+ return;
138
+ const batch = this.pending;
139
+ this.pending = [];
140
+ for (const frame of batch)
141
+ this.emitFrame(frame);
142
+ }
143
+ /** Flushes and emits session:end (waits briefly for the ack). */
144
+ async end(exitCode) {
145
+ if (this.ended)
146
+ return;
147
+ this.ended = true;
148
+ this.flush();
149
+ this.persist({ ended: true, exitCode });
150
+ const done = new Promise((resolve) => {
151
+ const t = setTimeout(resolve, 1500);
152
+ this.socket?.emit('session:end', { sessionId: this.sessionId, exitCode }, () => {
153
+ clearTimeout(t);
154
+ resolve();
155
+ });
156
+ if (!this.socket)
157
+ resolve();
158
+ });
159
+ await done;
160
+ try {
161
+ this.socket?.disconnect();
162
+ }
163
+ catch {
164
+ /* best-effort */
165
+ }
166
+ }
167
+ /** Writes the transcript tail to ~/.teamshare/sessions/<id>.json. */
168
+ persist(opts) {
169
+ try {
170
+ (0, node_fs_1.mkdirSync)(SESSIONS_DIR, { recursive: true });
171
+ const payload = {
172
+ sessionId: this.sessionId,
173
+ agentId: this.meta.agentId,
174
+ projectId: this.meta.projectId ?? null,
175
+ taskId: this.meta.taskId ?? null,
176
+ mode: this.meta.mode,
177
+ model: this.meta.model ?? null,
178
+ startedAt: this.startedAtISO,
179
+ endedAt: opts?.ended ? new Date().toISOString() : null,
180
+ exitCode: opts?.exitCode ?? null,
181
+ lines: this.lines,
182
+ };
183
+ (0, node_fs_1.writeFileSync)(localPath(this.sessionId), JSON.stringify(payload, null, 2));
184
+ }
185
+ catch {
186
+ /* best-effort */
187
+ }
188
+ }
189
+ }
190
+ exports.SessionStream = SessionStream;
191
+ //# sourceMappingURL=session-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-stream.js","sourceRoot":"","sources":["../../src/lib/session-stream.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "teamshare-bridge",
3
+ "version": "0.1.0",
4
+ "description": "Local bridge for TeamShare agents - CLI session runner, auto-wake WebSocket daemon, and teamshare:// protocol handler.",
5
+ "type": "commonjs",
6
+ "license": "MIT",
7
+ "keywords": [
8
+ "teamshare",
9
+ "agent",
10
+ "bridge",
11
+ "mcp",
12
+ "ai",
13
+ "automation"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/dominionbanjo/teamshare-bridge.git"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "README.md"
22
+ ],
23
+ "bin": {
24
+ "teamshare-agent": "dist/cli/index.js",
25
+ "teamshare-bridge": "dist/bridge/index.js"
26
+ },
27
+ "engines": {
28
+ "node": ">=18"
29
+ },
30
+ "scripts": {
31
+ "build": "tsc -p tsconfig.json",
32
+ "prepare": "npm run build",
33
+ "dev": "tsc -p tsconfig.json --watch",
34
+ "lint": "eslint src --ext .ts",
35
+ "typecheck": "tsc --noEmit -p tsconfig.json"
36
+ },
37
+ "dependencies": {
38
+ "socket.io-client": "^4.8.3"
39
+ },
40
+ "devDependencies": {
41
+ "@types/node": "^22.0.0",
42
+ "typescript": "^5.6.0"
43
+ }
44
+ }