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,191 @@
1
+ /**
2
+ * Typed REST client for the TeamShare API (contract: docs/agent-tasks/
3
+ * agent-hub-connection.md). Envelope-aware, retrying, timeout-bound.
4
+ */
5
+ import { AgentConfig } from './config';
6
+ export declare const DEFAULT_API_URL = "http://localhost:4000/api";
7
+ export declare class ApiError extends Error {
8
+ readonly code: string;
9
+ readonly status: number;
10
+ readonly details: unknown;
11
+ constructor(code: string, message: string, status: number, details?: unknown);
12
+ }
13
+ export declare class TeamshareApi {
14
+ readonly baseUrl: string;
15
+ readonly apiKey?: string | undefined;
16
+ constructor(baseUrl?: string, apiKey?: string | undefined);
17
+ /** Reuses a config agent's credentials. */
18
+ static forAgent(baseUrl: string, agent: AgentConfig): TeamshareApi;
19
+ private request;
20
+ heartbeat(agentId: string, status: 'online' | 'working' | 'offline', taskId?: string, sessionId?: string): Promise<unknown>;
21
+ inbox(agentId: string): Promise<{
22
+ tasks: Array<Record<string, unknown>>;
23
+ comments: Array<Record<string, unknown>>;
24
+ mentions: Array<Record<string, unknown>>;
25
+ chat: Array<Record<string, unknown>>;
26
+ }>;
27
+ mintRunToken(agentId: string, taskId?: string): Promise<{
28
+ token: string;
29
+ expiresAt: string;
30
+ }>;
31
+ redeemRunToken(runToken: string, taskId?: string): Promise<{
32
+ wsToken: string;
33
+ agentId: string;
34
+ scopes: string[];
35
+ settings?: {
36
+ model?: string | null;
37
+ temperature?: number | null;
38
+ maxTokens?: number | null;
39
+ systemPrompt?: string | null;
40
+ };
41
+ }>;
42
+ getTask(taskId: string): Promise<Task>;
43
+ listTasks(params: {
44
+ projectId?: string;
45
+ status?: string;
46
+ assigneeId?: string;
47
+ page?: number;
48
+ pageSize?: number;
49
+ }): Promise<Task[]>;
50
+ createTask(dto: {
51
+ projectId: string;
52
+ title: string;
53
+ description?: string;
54
+ status?: string;
55
+ priority?: string;
56
+ assigneeId?: string;
57
+ dueDate?: string;
58
+ tags?: string[];
59
+ }): Promise<Task>;
60
+ updateTask(taskId: string, dto: Record<string, unknown>): Promise<Task>;
61
+ listComments(taskId: string): Promise<Comment[]>;
62
+ /** Subtask tree of a task (nested, each node with checklist items). */
63
+ listSubtasks(taskId: string): Promise<SubtaskNode[]>;
64
+ createSubtask(dto: {
65
+ taskId: string;
66
+ title: string;
67
+ parentId?: string | null;
68
+ assigneeId?: string | null;
69
+ dueDate?: string | null;
70
+ }): Promise<SubtaskNode>;
71
+ /** Mark done / reopen, rename, reassign, move or re-due a subtask. */
72
+ updateSubtask(subtaskId: string, dto: Record<string, unknown>): Promise<SubtaskNode>; /** Document comment thread (Phase F document assistant). */
73
+ listDocumentComments(documentId: string): Promise<Comment[]>;
74
+ addComment(dto: {
75
+ taskId?: string;
76
+ documentId?: string;
77
+ body: string;
78
+ }): Promise<Comment>;
79
+ getProject(projectId: string): Promise<{
80
+ id: string;
81
+ name: string;
82
+ status: string;
83
+ }>;
84
+ listDocuments(projectId: string): Promise<Document[]>;
85
+ getDocument(documentId: string): Promise<{
86
+ id: string;
87
+ type: 'link' | 'file';
88
+ name: string;
89
+ urlOrKey?: string | null;
90
+ projectId: string;
91
+ mime?: string | null;
92
+ createdAt: string;
93
+ }>;
94
+ /** Phase F: extracted text for office/PDF documents. */
95
+ getDocumentExtract(documentId: string): Promise<{
96
+ text: string;
97
+ truncated: boolean;
98
+ format: string;
99
+ cached: boolean;
100
+ }>;
101
+ /**
102
+ * Downloads a document. Link docs return { url }; local files return plain
103
+ * text; Cloudinary-hosted files return { url } (fetchable by the caller).
104
+ */
105
+ getDocumentContent(doc: Document): Promise<string>;
106
+ search(q: string, type?: string): Promise<Array<Record<string, unknown>>>;
107
+ listChatMessages(projectId: string, page?: number, pageSize?: number): Promise<Array<{
108
+ id: string;
109
+ projectId: string;
110
+ authorId: string;
111
+ body: string;
112
+ createdAt: string;
113
+ author?: {
114
+ id: string;
115
+ name: string;
116
+ kind?: string;
117
+ } | null;
118
+ }>>;
119
+ postChatMessage(projectId: string, body: string): Promise<Record<string, unknown>>;
120
+ }
121
+ export interface Task {
122
+ id: string;
123
+ title: string;
124
+ description?: string | null;
125
+ status: string;
126
+ priority: string;
127
+ projectId: string;
128
+ assigneeId?: string | null;
129
+ dueDate?: string | null;
130
+ tags?: string[];
131
+ createdAt: string;
132
+ updatedAt?: string;
133
+ project?: {
134
+ id: string;
135
+ name: string;
136
+ } | null;
137
+ comments?: Comment[];
138
+ }
139
+ export interface Comment {
140
+ id: string;
141
+ taskId?: string | null;
142
+ documentId?: string | null;
143
+ body: string;
144
+ author?: {
145
+ id: string;
146
+ name: string;
147
+ kind?: string;
148
+ } | null;
149
+ authorId?: string;
150
+ createdAt: string;
151
+ }
152
+ export interface ChecklistItemRow {
153
+ id: string;
154
+ title: string;
155
+ done: boolean;
156
+ sortOrder?: number;
157
+ }
158
+ export interface SubtaskNode {
159
+ id: string;
160
+ taskId: string;
161
+ parentId?: string | null;
162
+ title: string;
163
+ done: boolean;
164
+ assigneeId?: string | null;
165
+ dueDate?: string | null;
166
+ sortOrder: number;
167
+ createdBy: string;
168
+ createdAt: string;
169
+ updatedAt: string;
170
+ assignee?: {
171
+ id: string;
172
+ name: string;
173
+ kind?: string;
174
+ } | null;
175
+ creator?: {
176
+ id: string;
177
+ name: string;
178
+ kind?: string;
179
+ } | null;
180
+ children?: SubtaskNode[];
181
+ checklistItems?: ChecklistItemRow[];
182
+ }
183
+ export interface Document {
184
+ id: string;
185
+ projectId: string;
186
+ type: 'link' | 'file';
187
+ urlOrKey: string;
188
+ name: string;
189
+ mime?: string | null;
190
+ createdAt: string;
191
+ }
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TeamshareApi = exports.ApiError = exports.DEFAULT_API_URL = void 0;
4
+ exports.DEFAULT_API_URL = 'http://localhost:4000/api';
5
+ class ApiError extends Error {
6
+ code;
7
+ status;
8
+ details;
9
+ constructor(code, message, status, details) {
10
+ super(message);
11
+ this.name = 'ApiError';
12
+ this.code = code;
13
+ this.status = status;
14
+ this.details = details;
15
+ }
16
+ }
17
+ exports.ApiError = ApiError;
18
+ const TIMEOUT_MS = 15_000;
19
+ const MAX_RETRIES = 2;
20
+ class TeamshareApi {
21
+ baseUrl;
22
+ apiKey;
23
+ constructor(baseUrl = process.env.TEAMSHARE_API_URL ?? exports.DEFAULT_API_URL, apiKey) {
24
+ this.baseUrl = baseUrl;
25
+ this.apiKey = apiKey;
26
+ }
27
+ /** Reuses a config agent's credentials. */
28
+ static forAgent(baseUrl, agent) {
29
+ return new TeamshareApi(baseUrl, agent.apiKey);
30
+ }
31
+ async request(path, init = {}, retries = MAX_RETRIES) {
32
+ const url = path.startsWith('http') ? path : `${this.baseUrl}${path}`;
33
+ const headers = {
34
+ 'Content-Type': 'application/json',
35
+ 'User-Agent': 'teamshare-bridge/0.1',
36
+ ...init.headers,
37
+ };
38
+ if (this.apiKey)
39
+ headers['X-Api-Key'] = this.apiKey;
40
+ const controller = new AbortController();
41
+ const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
42
+ try {
43
+ const res = await fetch(url, {
44
+ ...init,
45
+ headers,
46
+ signal: controller.signal,
47
+ });
48
+ const raw = (await res.json().catch(() => null));
49
+ if (!raw) {
50
+ throw new ApiError('INVALID_RESPONSE', `non-JSON response (${res.status})`, res.status);
51
+ }
52
+ if (!res.ok || raw.success === false) {
53
+ const err = raw.error ?? { code: 'HTTP_' + res.status, message: `HTTP ${res.status}` };
54
+ throw new ApiError(err.code, err.message, res.status, err.details);
55
+ }
56
+ return raw.data;
57
+ }
58
+ catch (err) {
59
+ if (retries > 0 && isRetryable(err)) {
60
+ await sleep(500 * (MAX_RETRIES - retries + 1));
61
+ return this.request(path, init, retries - 1);
62
+ }
63
+ throw err;
64
+ }
65
+ finally {
66
+ clearTimeout(timer);
67
+ }
68
+ }
69
+ // -- agent identity -------------------------------------------------------
70
+ heartbeat(agentId, status, taskId, sessionId) {
71
+ const body = { status };
72
+ if (taskId)
73
+ body.taskId = taskId;
74
+ if (sessionId)
75
+ body.sessionId = sessionId;
76
+ return this.request(`/agents/${agentId}/heartbeat`, {
77
+ method: 'POST',
78
+ body: JSON.stringify(body),
79
+ });
80
+ }
81
+ inbox(agentId) {
82
+ return this.request(`/agents/${agentId}/inbox`);
83
+ }
84
+ mintRunToken(agentId, taskId) {
85
+ return this.request(`/agents/${agentId}/run-tokens`, {
86
+ method: 'POST',
87
+ body: JSON.stringify(taskId ? { taskId } : {}),
88
+ });
89
+ }
90
+ redeemRunToken(runToken, taskId) {
91
+ return this.request('/agent-bridge/redeem-run-token', {
92
+ method: 'POST',
93
+ body: JSON.stringify(taskId ? { runToken, taskId } : { runToken }),
94
+ });
95
+ }
96
+ // -- tasks ----------------------------------------------------------------
97
+ getTask(taskId) {
98
+ return this.request(`/tasks/${taskId}`);
99
+ }
100
+ listTasks(params) {
101
+ const qs = new URLSearchParams();
102
+ for (const [k, v] of Object.entries(params))
103
+ if (v !== undefined)
104
+ qs.set(k, String(v));
105
+ return this.request(`/tasks?${qs.toString()}`);
106
+ }
107
+ createTask(dto) {
108
+ return this.request('/tasks', { method: 'POST', body: JSON.stringify(dto) });
109
+ }
110
+ updateTask(taskId, dto) {
111
+ return this.request(`/tasks/${taskId}`, { method: 'PATCH', body: JSON.stringify(dto) });
112
+ }
113
+ listComments(taskId) {
114
+ return this.request(`/comments?taskId=${taskId}`);
115
+ }
116
+ // -- subtasks (agent breakdown + check-off) --------------------------------
117
+ /** Subtask tree of a task (nested, each node with checklist items). */
118
+ listSubtasks(taskId) {
119
+ return this.request(`/tasks/${taskId}/subtasks`);
120
+ }
121
+ createSubtask(dto) {
122
+ return this.request(`/tasks/${dto.taskId}/subtasks`, {
123
+ method: 'POST',
124
+ body: JSON.stringify(dto),
125
+ });
126
+ }
127
+ /** Mark done / reopen, rename, reassign, move or re-due a subtask. */
128
+ updateSubtask(subtaskId, dto) {
129
+ return this.request(`/subtasks/${subtaskId}`, {
130
+ method: 'PATCH',
131
+ body: JSON.stringify(dto),
132
+ });
133
+ } /** Document comment thread (Phase F document assistant). */
134
+ listDocumentComments(documentId) {
135
+ return this.request(`/comments?documentId=${documentId}`);
136
+ }
137
+ addComment(dto) {
138
+ return this.request('/comments', {
139
+ method: 'POST',
140
+ body: JSON.stringify(dto),
141
+ });
142
+ }
143
+ // -- projects / documents / search ---------------------------------------
144
+ getProject(projectId) {
145
+ return this.request(`/projects/${projectId}`);
146
+ }
147
+ listDocuments(projectId) {
148
+ return this.request(`/documents?projectId=${projectId}`);
149
+ }
150
+ getDocument(documentId) {
151
+ return this.request(`/documents/${documentId}`);
152
+ }
153
+ /** Phase F: extracted text for office/PDF documents. */
154
+ getDocumentExtract(documentId) {
155
+ return this.request(`/documents/${documentId}/extract`);
156
+ }
157
+ /**
158
+ * Downloads a document. Link docs return { url }; local files return plain
159
+ * text; Cloudinary-hosted files return { url } (fetchable by the caller).
160
+ */
161
+ async getDocumentContent(doc) {
162
+ if (doc.type === 'link')
163
+ return JSON.stringify({ type: 'link', url: doc.urlOrKey });
164
+ try {
165
+ const res = await fetch(`${this.baseUrl}/documents/${doc.id}/download`, {
166
+ headers: this.apiKey ? { 'X-Api-Key': this.apiKey } : undefined,
167
+ signal: AbortSignal.timeout(TIMEOUT_MS),
168
+ });
169
+ if (!res.ok)
170
+ return `[download failed: HTTP ${res.status}]`;
171
+ const ct = res.headers.get('content-type') ?? '';
172
+ if (ct.includes('application/json')) {
173
+ const json = (await res.json());
174
+ return JSON.stringify({ type: 'file', name: doc.name, url: json.url ?? null });
175
+ }
176
+ return await res.text();
177
+ }
178
+ catch {
179
+ return '[download failed: network error]';
180
+ }
181
+ }
182
+ search(q, type) {
183
+ const qs = new URLSearchParams({ q });
184
+ if (type)
185
+ qs.set('type', type);
186
+ return this.request(`/search?${qs.toString()}`);
187
+ }
188
+ // -- chat (agent chat replies, dual-auth surface) -----------------------
189
+ listChatMessages(projectId, page = 1, pageSize = 50) {
190
+ const qs = new URLSearchParams({ projectId, page: String(page), pageSize: String(pageSize) });
191
+ return this.request(`/chat/messages?${qs.toString()}`);
192
+ }
193
+ postChatMessage(projectId, body) {
194
+ return this.request('/chat/messages', {
195
+ method: 'POST',
196
+ body: JSON.stringify({ projectId, body }),
197
+ });
198
+ }
199
+ }
200
+ exports.TeamshareApi = TeamshareApi;
201
+ function isRetryable(err) {
202
+ if (err instanceof ApiError)
203
+ return err.status >= 500;
204
+ return err instanceof TypeError; // network / aborted
205
+ }
206
+ function sleep(ms) {
207
+ return new Promise((r) => setTimeout(r, ms));
208
+ }
209
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Task-brief fetching + session reporting helpers shared by the CLI, daemon
3
+ * and protocol handler (contract section 5, "CLI session").
4
+ */
5
+ import { TeamshareApi, Task } from './api';
6
+ export interface BriefOptions {
7
+ maxDocChars?: number;
8
+ }
9
+ /** Builds the Markdown brief the working session sees. */
10
+ export declare function fetchTaskBrief(api: TeamshareApi, taskId: string, opts?: BriefOptions): Promise<string>;
11
+ /** Best-effort heartbeat wrapper - never throws. */
12
+ export declare function reportStatus(api: TeamshareApi, agentId: string, status: 'online' | 'working' | 'offline', taskId?: string, sessionId?: string): Promise<void>;
13
+ /** Posts the closing summary comment - best-effort, never throws. */
14
+ export declare function postClosingComment(api: TeamshareApi, taskId: string, summary: string): Promise<void>;
15
+ /** Waits for the task to leave open/in_progress, or times out. */
16
+ export declare function waitForTaskCompletion(api: TeamshareApi, taskId: string, pollMs?: number, maxWaitMs?: number, onProgress?: (status: string) => void): Promise<Task>;
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchTaskBrief = fetchTaskBrief;
4
+ exports.reportStatus = reportStatus;
5
+ exports.postClosingComment = postClosingComment;
6
+ exports.waitForTaskCompletion = waitForTaskCompletion;
7
+ const MAX_DOC_CHARS = 20_000;
8
+ /** Builds the Markdown brief the working session sees. */
9
+ async function fetchTaskBrief(api, taskId, opts = {}) {
10
+ const maxDocChars = opts.maxDocChars ?? MAX_DOC_CHARS;
11
+ const task = await api.getTask(taskId);
12
+ const lines = [];
13
+ lines.push(`# Task: ${task.title}`);
14
+ lines.push('');
15
+ lines.push(`- **Status:** ${task.status} ` +
16
+ `**Priority:** ${task.priority}` +
17
+ (task.dueDate ? ` **Due:** ${task.dueDate}` : '') +
18
+ (task.assigneeId ? ` **Assignee:** ${task.assigneeId}` : ''));
19
+ if (task.project)
20
+ lines.push(`- **Project:** ${task.project.name} (${task.projectId})`);
21
+ lines.push('');
22
+ if (task.description) {
23
+ lines.push('## Description');
24
+ lines.push('');
25
+ lines.push(task.description);
26
+ lines.push('');
27
+ }
28
+ const comments = await api.listComments(taskId);
29
+ if (comments.length > 0) {
30
+ lines.push('## Comments');
31
+ lines.push('');
32
+ for (const c of comments.slice(-25)) {
33
+ const author = c.author?.name ?? c.authorId ?? 'unknown';
34
+ lines.push(`- **${author}** (${c.createdAt}): ${c.body.replace(/\s+/g, ' ')}`);
35
+ }
36
+ lines.push('');
37
+ }
38
+ // Subtask breakdown (existing or to-be-created) - the agent's progress plan.
39
+ const subtasks = await api.listSubtasks(taskId).catch(() => []);
40
+ if (subtasks.length > 0) {
41
+ lines.push('## Subtasks');
42
+ lines.push('');
43
+ const render = (nodes, depth) => {
44
+ for (const node of nodes) {
45
+ lines.push(`${' '.repeat(depth)}- [${node.done ? 'x' : ' '}] ${node.title}` +
46
+ (node.assignee?.name ? ` (assignee: ${node.assignee.name})` : ''));
47
+ if (node.children?.length)
48
+ render(node.children, depth + 1);
49
+ }
50
+ };
51
+ render(subtasks, 0);
52
+ lines.push('');
53
+ }
54
+ if (task.projectId) {
55
+ const docs = await api.listDocuments(task.projectId);
56
+ if (docs.length > 0) {
57
+ lines.push('## Project files');
58
+ lines.push('');
59
+ let used = 0;
60
+ for (const doc of docs.slice(0, 20)) {
61
+ const content = await api.getDocumentContent(doc);
62
+ const remain = maxDocChars - used;
63
+ if (remain <= 0) {
64
+ lines.push(`- ${doc.name}: (omitted - budget reached)`);
65
+ continue;
66
+ }
67
+ const body = content.length > remain ? `${content.slice(0, remain)}…` : content;
68
+ used += body.length;
69
+ lines.push(`### ${doc.name}${doc.mime ? ` (${doc.mime})` : ''}`);
70
+ lines.push('');
71
+ lines.push(body);
72
+ lines.push('');
73
+ }
74
+ }
75
+ }
76
+ return lines.join('\n');
77
+ }
78
+ /** Best-effort heartbeat wrapper - never throws. */
79
+ async function reportStatus(api, agentId, status, taskId, sessionId) {
80
+ try {
81
+ await api.heartbeat(agentId, status, taskId, sessionId);
82
+ }
83
+ catch (err) {
84
+ console.warn(`[heartbeat ${status}] ${err instanceof Error ? err.message : String(err)}`);
85
+ }
86
+ }
87
+ /** Posts the closing summary comment - best-effort, never throws. */
88
+ async function postClosingComment(api, taskId, summary) {
89
+ if (!summary.trim())
90
+ return;
91
+ try {
92
+ await api.addComment({ taskId, body: summary });
93
+ }
94
+ catch (err) {
95
+ console.warn(`[report] ${err instanceof Error ? err.message : String(err)}`);
96
+ }
97
+ }
98
+ /** Waits for the task to leave open/in_progress, or times out. */
99
+ async function waitForTaskCompletion(api, taskId, pollMs = 15_000, maxWaitMs = 20 * 60_000, onProgress) {
100
+ const deadline = Date.now() + maxWaitMs;
101
+ let last = '';
102
+ for (;;) {
103
+ const task = await api.getTask(taskId);
104
+ if (task.status !== last) {
105
+ last = task.status;
106
+ onProgress?.(task.status);
107
+ }
108
+ if (['resolved', 'closed', 'in_review'].includes(task.status))
109
+ return task;
110
+ if (Date.now() >= deadline)
111
+ return task;
112
+ await new Promise((r) => setTimeout(r, pollMs));
113
+ }
114
+ }
115
+ //# sourceMappingURL=brief.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief.js","sourceRoot":"","sources":["../../src/lib/brief.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { TeamshareApi } from './api';
2
+ export interface ChatReplyOptions {
3
+ harness: 'auto' | 'opencode' | 'claude' | 'none';
4
+ selfMode: boolean;
5
+ llm?: {
6
+ baseUrl: string;
7
+ apiKey: string;
8
+ model: string;
9
+ temperature?: number;
10
+ maxTokens?: number;
11
+ };
12
+ /** Debug/testing switch (TS_CHAT_ECHO=1): post canned acknowledgments. */
13
+ echo?: boolean;
14
+ /** Phase C: stream the generated reply as message:partial frames. */
15
+ stream?: {
16
+ wsBase: string;
17
+ apiKey: string;
18
+ projectId: string;
19
+ channelId?: string;
20
+ };
21
+ }
22
+ /**
23
+ * Runs the chat reply loop. Heartbeats working/online around the work and
24
+ * posts one reply per mentioning message (in chronological order).
25
+ */
26
+ export declare function runChatReply(api: TeamshareApi, agentId: string, projectId: string, mentionToken: string, opts: ChatReplyOptions): Promise<{
27
+ replied: number;
28
+ skipped: number;
29
+ }>;