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,273 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ /**
38
+ * teamshare-bridge - the TeamShare local bridge.
39
+ *
40
+ * Commands:
41
+ * daemon [--port N] auto-wake listener + localhost probe server (foreground)
42
+ * start [--port N] daemon in the background (pid file + log) - returns immediately
43
+ * stop stop the background daemon
44
+ * restart [--port N] stop + start
45
+ * autostart on|off|status run the daemon at login (Windows Task Scheduler / macOS
46
+ * LaunchAgent / Linux systemd user unit)
47
+ * register register the teamshare:// URI scheme
48
+ * serve "<teamshare://url>" called by the OS for deep links
49
+ * add-agent --agent <id> --key <ts_...>
50
+ * status [--port N] daemon pid/log/autostart + agent locks
51
+ * probe [--port N] probe server only (testing)
52
+ * --help
53
+ */
54
+ const config_1 = require("../lib/config");
55
+ const lock_1 = require("../lib/lock");
56
+ const daemon_1 = require("./daemon");
57
+ const protocol_1 = require("./protocol");
58
+ const local_server_1 = require("./local-server");
59
+ const service_1 = require("./service");
60
+ const VERSION = '0.1.0';
61
+ function usage() {
62
+ return [
63
+ 'teamshare-bridge - TeamShare local bridge',
64
+ '',
65
+ 'USAGE',
66
+ ' teamshare-bridge daemon [--port N]',
67
+ ' Listen for wake events over WebSocket and spawn agent sessions when',
68
+ ' a task is assigned or the agent is @mentioned (foreground - use start for background).',
69
+ ' Also serves the localhost probe (http://localhost:<port>/ping) the website detects.',
70
+ '',
71
+ ' teamshare-bridge start [--port N]',
72
+ ' Run the daemon in the background (pid file + ~/.teamshare/daemon.log) and return.',
73
+ ' teamshare-bridge stop',
74
+ ' Stop the background daemon.',
75
+ ' teamshare-bridge restart [--port N]',
76
+ ' Stop then start the daemon.',
77
+ ' teamshare-bridge autostart on|off|status',
78
+ ' Register/unregister the daemon to start automatically at login',
79
+ ' (Windows Task Scheduler onlogon / macOS LaunchAgent / Linux systemd user unit).',
80
+ '',
81
+ ' teamshare-bridge register',
82
+ ' Register the teamshare:// URI scheme so website "Run agent" buttons',
83
+ ' can hand off to this machine.',
84
+ '',
85
+ ' teamshare-bridge serve "<teamshare://agent/run?runToken=...&task=...>"',
86
+ ' (invoked by the OS) - redeem the run token and spawn the session.',
87
+ '',
88
+ ' teamshare-bridge add-agent --agent <id> --key <ts_...>',
89
+ ' teamshare-bridge status [--port N]',
90
+ ' teamshare-bridge clear-lock --agent <id>',
91
+ ' Remove a stale session lock (crashed sessions leave one behind;',
92
+ ' status shows "idle (stale lock ...)" when one is present).',
93
+ ' teamshare-bridge probe [--port N]',
94
+ '',
95
+ 'CONFIG: ' + (0, config_1.configPath)(),
96
+ 'ENV: TEAMSHARE_API_URL, TEAMSHARE_WS_URL',
97
+ ].join('\n');
98
+ }
99
+ function parseArgs(argv) {
100
+ const flags = new Map();
101
+ const positionals = [];
102
+ for (let i = 0; i < argv.length; i += 1) {
103
+ const arg = argv[i];
104
+ if (arg === '-h' || arg === '--help') {
105
+ flags.set('help', 'true');
106
+ }
107
+ else if (arg.startsWith('--')) {
108
+ const eq = arg.indexOf('=');
109
+ if (eq > 0)
110
+ flags.set(arg.slice(2, eq), arg.slice(eq + 1));
111
+ else {
112
+ const value = argv[i + 1];
113
+ if (value !== undefined && !value.startsWith('--')) {
114
+ flags.set(arg.slice(2), value);
115
+ i += 1;
116
+ }
117
+ else
118
+ flags.set(arg.slice(2), 'true');
119
+ }
120
+ }
121
+ else
122
+ positionals.push(arg);
123
+ }
124
+ return { flags, positionals };
125
+ }
126
+ function portOf(flags) {
127
+ const raw = flags.get('port');
128
+ const n = raw ? Number(raw) : NaN;
129
+ return Number.isInteger(n) ? n : undefined;
130
+ }
131
+ async function main() {
132
+ const { flags, positionals } = parseArgs(process.argv.slice(2));
133
+ if (flags.has('help') || positionals.length === 0) {
134
+ console.log(usage());
135
+ return;
136
+ }
137
+ const command = positionals[0];
138
+ try {
139
+ switch (command) {
140
+ case 'daemon': {
141
+ await (0, daemon_1.runDaemon)(portOf(flags));
142
+ break;
143
+ }
144
+ case 'start': {
145
+ const result = (0, service_1.startDaemon)(portOf(flags));
146
+ console.log(result.message);
147
+ if (!result.started)
148
+ process.exitCode = 1;
149
+ break;
150
+ }
151
+ case 'stop': {
152
+ console.log((0, service_1.stopDaemon)().message);
153
+ break;
154
+ }
155
+ case 'restart': {
156
+ console.log((0, service_1.restartDaemon)(portOf(flags)).message);
157
+ break;
158
+ }
159
+ case 'autostart': {
160
+ const mode = positionals[1] ?? 'status';
161
+ if (mode === 'on' || mode === 'off') {
162
+ const result = (0, service_1.setAutostart)(mode === 'on');
163
+ console.log(result.message);
164
+ if (!result.ok)
165
+ process.exitCode = 1;
166
+ }
167
+ else if (mode === 'status') {
168
+ console.log(`autostart: ${(0, service_1.autostartStatus)() ? 'enabled' : 'disabled'}`);
169
+ }
170
+ else {
171
+ console.error(`autostart expects on|off|status, got "${mode}"`);
172
+ process.exitCode = 2;
173
+ }
174
+ break;
175
+ }
176
+ case 'register': {
177
+ if ((0, protocol_1.schemeRegistered)())
178
+ console.log('teamshare:// already registered.');
179
+ else
180
+ (0, protocol_1.registerScheme)();
181
+ break;
182
+ }
183
+ case 'serve': {
184
+ const url = positionals[1];
185
+ if (!url) {
186
+ console.error('serve requires a teamshare:// URL argument');
187
+ process.exitCode = 2;
188
+ break;
189
+ }
190
+ const { serveUrl } = await Promise.resolve().then(() => __importStar(require('./protocol')));
191
+ await serveUrl(url);
192
+ break;
193
+ }
194
+ case 'add-agent': {
195
+ const agentId = flags.get('agent');
196
+ const apiKey = flags.get('key');
197
+ if (!agentId || !apiKey) {
198
+ console.error('add-agent requires --agent <id> --key <ts_...>');
199
+ process.exitCode = 2;
200
+ break;
201
+ }
202
+ (0, config_1.upsertAgent)(agentId, apiKey);
203
+ console.log(`Saved agent ${agentId} to config.`);
204
+ break;
205
+ }
206
+ case 'status': {
207
+ const config = (0, config_1.loadConfig)();
208
+ const pid = (0, service_1.runningPid)();
209
+ console.log(`version: ${VERSION}`);
210
+ console.log(`config: ${(0, config_1.configPath)()}`);
211
+ console.log(`port: ${portOf(flags) ?? config.port}`);
212
+ console.log(`daemon: ${pid !== null ? `running (pid ${pid})` : 'stopped'}`);
213
+ console.log(`logs: ${service_1.LOG_PATH}`);
214
+ console.log(`autostart: ${(0, service_1.autostartStatus)() ? 'enabled' : 'disabled'}`);
215
+ for (const agent of config.agents) {
216
+ const lock = (0, lock_1.readLock)(agent.agentId);
217
+ if ((0, lock_1.isLockBusy)(agent.agentId) && lock) {
218
+ console.log(`agent: ${agent.agentId} - BUSY (${lock.kind} since ${lock.startedAt}${lock.taskId ? `, task ${lock.taskId}` : ''})`);
219
+ }
220
+ else if (lock) {
221
+ console.log(`agent: ${agent.agentId} - idle (stale lock from pid ${lock.pid} - run 'teamshare-bridge clear-lock --agent ${agent.agentId}' to remove)`);
222
+ }
223
+ else {
224
+ console.log(`agent: ${agent.agentId} - idle`);
225
+ }
226
+ }
227
+ if (config.agents.length === 0)
228
+ console.log(`agents: (none)`);
229
+ console.log(`harness: ${config.harness}`);
230
+ console.log(`quiet hours: ${config.quietHours ? `${config.quietHours.start}-${config.quietHours.end}` : 'off'}`);
231
+ console.log(`scheme: ${(0, protocol_1.schemeRegistered)() ? 'registered' : 'not registered'}`);
232
+ break;
233
+ }
234
+ case 'clear-lock': {
235
+ const agentId = flags.get('agent');
236
+ if (!agentId) {
237
+ console.error('clear-lock requires --agent <id>');
238
+ process.exitCode = 2;
239
+ break;
240
+ }
241
+ (0, lock_1.clearLock)(agentId);
242
+ console.log(`Cleared lock for agent ${agentId}.`);
243
+ break;
244
+ }
245
+ case 'probe': {
246
+ const config = (0, config_1.loadConfig)();
247
+ const { server, port } = await (0, local_server_1.startProbeServer)(portOf(flags) ?? config.port, () => ({
248
+ configPath: (0, config_1.configPath)(),
249
+ agents: config.agents.map((a) => ({ agentId: a.agentId })),
250
+ registeredSchemes: (0, protocol_1.schemeRegistered)(),
251
+ }));
252
+ console.log(`probe server: http://localhost:${port}/ping`);
253
+ const shutdown = () => {
254
+ server.close();
255
+ process.exit(0);
256
+ };
257
+ process.on('SIGINT', shutdown);
258
+ process.on('SIGTERM', shutdown);
259
+ break;
260
+ }
261
+ default:
262
+ console.error(`Unknown command: ${command}`);
263
+ console.log(usage());
264
+ process.exitCode = 2;
265
+ }
266
+ }
267
+ catch (err) {
268
+ console.error(`[error] ${(0, config_1.msg)(err)}`);
269
+ process.exitCode = 1;
270
+ }
271
+ }
272
+ void main();
273
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Localhost probe server - the piece the TeamShare website detects.
3
+ * GET /ping answers { ok: true, version, agents } with permissive CORS so the
4
+ * browser can reach it from the web app (contract section 5).
5
+ */
6
+ import { type Server } from 'node:http';
7
+ export interface ProbeAgentStatus {
8
+ agentId: string;
9
+ lastWake?: string;
10
+ /** True while a session lock is held for this agent (busy). */
11
+ busy?: boolean;
12
+ since?: string;
13
+ kind?: 'task' | 'chat' | 'doc';
14
+ taskId?: string;
15
+ projectId?: string;
16
+ documentId?: string;
17
+ /** Wakes waiting for the agent to free up. */
18
+ queued?: number;
19
+ }
20
+ export interface ProbeStatus {
21
+ configPath: string;
22
+ agents: ProbeAgentStatus[];
23
+ registeredSchemes: boolean;
24
+ }
25
+ export declare function startProbeServer(preferredPort: number | undefined, getStatus: () => ProbeStatus): Promise<{
26
+ server: Server;
27
+ port: number;
28
+ }>;
29
+ export declare function probeErrorMessage(err: unknown): string;
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startProbeServer = startProbeServer;
4
+ exports.probeErrorMessage = probeErrorMessage;
5
+ /**
6
+ * Localhost probe server - the piece the TeamShare website detects.
7
+ * GET /ping answers { ok: true, version, agents } with permissive CORS so the
8
+ * browser can reach it from the web app (contract section 5).
9
+ */
10
+ const node_http_1 = require("node:http");
11
+ const config_1 = require("../lib/config");
12
+ const VERSION = '0.1.0';
13
+ const CORS_HEADERS = {
14
+ 'Access-Control-Allow-Origin': '*',
15
+ 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
16
+ 'Access-Control-Allow-Headers': '*',
17
+ 'Access-Control-Max-Age': '86400',
18
+ };
19
+ async function startProbeServer(preferredPort, getStatus) {
20
+ const candidates = preferredPort
21
+ ? [preferredPort]
22
+ : [...config_1.BRIDGE_CANDIDATE_PORTS];
23
+ for (const port of candidates) {
24
+ try {
25
+ const server = await listen(port, getStatus);
26
+ return { server, port };
27
+ }
28
+ catch (err) {
29
+ const code = err.code;
30
+ if (code !== 'EADDRINUSE')
31
+ throw err;
32
+ console.warn(`[probe] port ${port} in use, trying next candidate`);
33
+ }
34
+ }
35
+ throw new Error('no free probe port found');
36
+ }
37
+ function listen(port, getStatus) {
38
+ return new Promise((resolve, reject) => {
39
+ const server = (0, node_http_1.createServer)((req, res) => handle(req, res, getStatus));
40
+ server.once('error', reject);
41
+ server.listen(port, '127.0.0.1', () => resolve(server));
42
+ });
43
+ }
44
+ function handle(req, res, getStatus) {
45
+ for (const [k, v] of Object.entries(CORS_HEADERS))
46
+ res.setHeader(k, v);
47
+ const url = new URL(req.url ?? '/', 'http://localhost');
48
+ if (req.method === 'OPTIONS') {
49
+ res.writeHead(204);
50
+ res.end();
51
+ return;
52
+ }
53
+ if (req.method === 'GET' && url.pathname === '/ping') {
54
+ const status = getStatus();
55
+ res.writeHead(200, { 'Content-Type': 'application/json' });
56
+ res.end(JSON.stringify({
57
+ ok: true,
58
+ version: VERSION,
59
+ agents: status.agents.map((a) => ({
60
+ agentId: a.agentId,
61
+ busy: a.busy === true,
62
+ ...(a.busy
63
+ ? {
64
+ since: a.since,
65
+ kind: a.kind,
66
+ taskId: a.taskId,
67
+ projectId: a.projectId,
68
+ documentId: a.documentId,
69
+ }
70
+ : {}),
71
+ queued: a.queued ?? 0,
72
+ })),
73
+ }));
74
+ return;
75
+ }
76
+ if (req.method === 'GET' && url.pathname === '/status') {
77
+ res.writeHead(200, { 'Content-Type': 'application/json' });
78
+ res.end(JSON.stringify({ ok: true, port: Number(url.port || 0), ...getStatus() }));
79
+ return;
80
+ }
81
+ res.writeHead(404, { 'Content-Type': 'application/json' });
82
+ res.end(JSON.stringify({ ok: false, error: 'not found' }));
83
+ }
84
+ function probeErrorMessage(err) {
85
+ return (0, config_1.msg)(err);
86
+ }
87
+ //# sourceMappingURL=local-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-server.js","sourceRoot":"","sources":["../../src/bridge/local-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function registerScheme(): void;
2
+ export declare function serveUrl(rawUrl: string): Promise<void>;
3
+ export declare function schemeRegistered(): boolean;
4
+ export declare function protocolError(err: unknown): string;
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerScheme = registerScheme;
4
+ exports.serveUrl = serveUrl;
5
+ exports.schemeRegistered = schemeRegistered;
6
+ exports.protocolError = protocolError;
7
+ /**
8
+ * `teamshare://` protocol handler - `register` (OS registration) and
9
+ * `serve` (URL dispatch) (contract section 5, method 3).
10
+ */
11
+ const node_child_process_1 = require("node:child_process");
12
+ const node_fs_1 = require("node:fs");
13
+ const node_os_1 = require("node:os");
14
+ const node_path_1 = require("node:path");
15
+ const api_1 = require("../lib/api");
16
+ const config_1 = require("../lib/config");
17
+ const spawn_1 = require("./spawn");
18
+ function registerScheme() {
19
+ const nodeBin = process.execPath;
20
+ const serveScript = (0, node_path_1.join)(__dirname, 'index.js');
21
+ if (process.platform === 'win32') {
22
+ const classes = 'HKCU\\Software\\Classes\\teamshare';
23
+ (0, node_child_process_1.execFileSync)('reg.exe', ['add', classes, '/v', 'URL Protocol', '/t', 'REG_SZ', '/d', '', '/f'], { stdio: 'inherit' });
24
+ (0, node_child_process_1.execFileSync)('reg.exe', ['add', `${classes}\\shell\\open\\command`, '/ve', '/t', 'REG_SZ', '/d', `"${nodeBin}" "${serveScript}" serve "%1"`, '/f'], { stdio: 'inherit' });
25
+ console.log('Registered teamshare:// (HKCU, per-user).');
26
+ }
27
+ else if (process.platform === 'darwin') {
28
+ const bundle = (0, node_path_1.join)((0, node_os_1.homedir)(), 'Applications', 'TeamShareBridge.app');
29
+ const contents = (0, node_path_1.join)(bundle, 'Contents');
30
+ (0, node_fs_1.mkdirSync)((0, node_path_1.join)(contents, 'MacOS'), { recursive: true });
31
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(contents, 'Info.plist'), `<?xml version="1.0" encoding="UTF-8"?>
32
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
33
+ <plist version="1.0">
34
+ <dict>
35
+ <key>CFBundleIdentifier</key><string>com.teamshare.bridge</string>
36
+ <key>CFBundleName</key><string>TeamShareBridge</string>
37
+ <key>CFBundleExecutable</key><string>run.sh</string>
38
+ <key>CFBundlePackageType</key><string>APPL</string>
39
+ <key>CFBundleURLTypes</key>
40
+ <array><dict>
41
+ <key>CFBundleURLName</key><string>teamshare</string>
42
+ <key>CFBundleURLSchemes</key><array><string>teamshare</string></array>
43
+ </dict></array>
44
+ </dict>
45
+ </plist>
46
+ `, 'utf8');
47
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(contents, 'MacOS', 'run.sh'), `#!/bin/bash\nexec "${nodeBin}" "${serveScript}" serve "$1"\n`, 'utf8');
48
+ console.log('Registered teamshare:// bundle at ' + bundle);
49
+ console.log('Run: open "' + bundle + '" once to finish registration.');
50
+ }
51
+ else {
52
+ const desktop = (0, node_path_1.join)((0, node_os_1.homedir)(), '.local', 'share', 'applications');
53
+ (0, node_fs_1.mkdirSync)(desktop, { recursive: true });
54
+ const file = (0, node_path_1.join)(desktop, 'teamshare-bridge.desktop');
55
+ (0, node_fs_1.writeFileSync)(file, `[Desktop Entry]
56
+ Type=Application
57
+ Name=TeamShare Bridge
58
+ Exec=${nodeBin} ${serveScript} serve %u
59
+ MimeType=x-scheme-handler/teamshare
60
+ NoDisplay=true
61
+ `, 'utf8');
62
+ console.log('Registered teamshare:// via ' + file);
63
+ try {
64
+ (0, node_child_process_1.execFileSync)('update-desktop-database', [desktop], { stdio: 'ignore' });
65
+ }
66
+ catch {
67
+ /* best-effort */
68
+ }
69
+ }
70
+ console.log('Deep link format: teamshare://agent/run?runToken=<token>&task=<taskId>');
71
+ }
72
+ /**
73
+ * Pauses so the deep-link console window stays readable on failure instead
74
+ * of flashing shut. The OS launches `serve` in its own console window;
75
+ * without this the error text vanishes instantly. Best-effort: a 30s
76
+ * timeout guarantees it can never hang the process.
77
+ */
78
+ async function pauseOnError() {
79
+ try {
80
+ await new Promise((resolve) => {
81
+ const timer = setTimeout(resolve, 30_000);
82
+ process.stdin.resume();
83
+ process.stdin.once('data', () => {
84
+ clearTimeout(timer);
85
+ resolve();
86
+ });
87
+ });
88
+ }
89
+ catch {
90
+ /* best-effort - never block on stdin issues */
91
+ }
92
+ }
93
+ async function serveUrl(rawUrl) {
94
+ let url;
95
+ try {
96
+ url = new URL(rawUrl);
97
+ }
98
+ catch {
99
+ console.error(`Invalid deep link: ${rawUrl}`);
100
+ process.exitCode = 1;
101
+ await pauseOnError();
102
+ return;
103
+ }
104
+ const path = url.pathname.replace(/^\//, '');
105
+ const runToken = url.searchParams.get('runToken');
106
+ const taskId = url.searchParams.get('task') ?? '';
107
+ if (path !== 'agent/run' || !runToken) {
108
+ console.error(`Unsupported deep link path: ${path}`);
109
+ process.exitCode = 1;
110
+ await pauseOnError();
111
+ return;
112
+ }
113
+ const config = (0, config_1.loadConfig)();
114
+ const api = new api_1.TeamshareApi(process.env.TEAMSHARE_API_URL ?? api_1.DEFAULT_API_URL);
115
+ const redeemed = await api.redeemRunToken(runToken, taskId || undefined);
116
+ const agent = config.agents.find((a) => a.agentId === redeemed.agentId);
117
+ if (!agent?.apiKey) {
118
+ console.error(`Agent ${redeemed.agentId} is not configured locally. Save its key first:\n` +
119
+ ` teamshare-agent connect --agent ${redeemed.agentId} --key ts_...\n` +
120
+ `(If you lost the key it cannot be recovered - delete the agent in the app and create a new one.)`);
121
+ process.exitCode = 1;
122
+ await pauseOnError();
123
+ return;
124
+ }
125
+ console.log(`[serve] agent ${redeemed.agentId}${taskId ? ` task ${taskId}` : ''} - launching session`);
126
+ (0, spawn_1.spawnAgentSession)(redeemed.agentId, agent.apiKey, taskId, {
127
+ model: redeemed.settings?.model,
128
+ temperature: redeemed.settings?.temperature,
129
+ maxTokens: redeemed.settings?.maxTokens,
130
+ systemPrompt: redeemed.settings?.systemPrompt,
131
+ });
132
+ }
133
+ function schemeRegistered() {
134
+ if (process.platform === 'win32') {
135
+ try {
136
+ (0, node_child_process_1.execFileSync)('reg.exe', ['query', 'HKCU\\Software\\Classes\\teamshare'], { stdio: 'ignore' });
137
+ return true;
138
+ }
139
+ catch {
140
+ return false;
141
+ }
142
+ }
143
+ if (process.platform === 'darwin') {
144
+ return (0, node_fs_1.existsSync)((0, node_path_1.join)((0, node_os_1.homedir)(), 'Applications', 'TeamShareBridge.app'));
145
+ }
146
+ return (0, node_fs_1.existsSync)((0, node_path_1.join)((0, node_os_1.homedir)(), '.local', 'share', 'applications', 'teamshare-bridge.desktop'));
147
+ }
148
+ function protocolError(err) {
149
+ return (0, config_1.msg)(err);
150
+ }
151
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/bridge/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { runDaemon } from './daemon';
2
+ export declare const LOG_PATH: string;
3
+ export declare const AUTOSTART_TASK_NAME = "TeamShareBridge";
4
+ /** Reads the pid file and returns the live daemon pid, or null. */
5
+ export declare function runningPid(): number | null;
6
+ /**
7
+ * `start`: spawns the daemon detached (stdio -> ~/.teamshare/daemon.log) and
8
+ * records the pid. `daemon` stays the foreground alias for debugging.
9
+ */
10
+ export declare function startDaemon(port?: number): {
11
+ started: boolean;
12
+ pid?: number;
13
+ message: string;
14
+ };
15
+ /** `stop`: terminates the live daemon and clears the pid file. */
16
+ export declare function stopDaemon(): {
17
+ stopped: boolean;
18
+ message: string;
19
+ };
20
+ /** `restart`: stop + start. */
21
+ export declare function restartDaemon(port?: number): {
22
+ message: string;
23
+ };
24
+ /** Registers (on) or removes (off) the login autostart for this platform. */
25
+ export declare function setAutostart(enabled: boolean): {
26
+ ok: boolean;
27
+ message: string;
28
+ };
29
+ /** Whether autostart is registered for this platform. */
30
+ export declare function autostartStatus(): boolean;
31
+ /** Keep the daemon entry import for callers that run in-process. */
32
+ export { runDaemon };