@butterbase/sdk 2.11.0 → 2.12.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.
@@ -0,0 +1,123 @@
1
+ import { OfficeTransport, officeError } from './transport.js';
2
+ import { OfficeClientError, OfficeStreamError } from './types.js';
3
+ import { readOfficeEvents } from './stream.js';
4
+ /** Organization-scoped Office API. Uses platform credentials, with no app/session state. */
5
+ export class OfficeClient {
6
+ transport;
7
+ organizationId;
8
+ constructor(options) {
9
+ this.organizationId = options.organizationId;
10
+ this.transport = new OfficeTransport({ ...options });
11
+ }
12
+ call(action, fields = {}, options) {
13
+ return this.transport.request({ ...fields, action, org_id: this.organizationId }, options?.signal);
14
+ }
15
+ async write(action, fields, options) {
16
+ try {
17
+ const key = options?.idempotencyKey ?? globalThis.crypto.randomUUID();
18
+ const result = await this.call(action, { ...fields, idempotency_key: key }, options);
19
+ return result.error ? { ...result, error: new OfficeClientError(result.error.detail, result.error.status, key) } : result;
20
+ }
21
+ catch {
22
+ return { data: null, error: officeError('invalid_request', 'A unique idempotency key is required for this write.') };
23
+ }
24
+ }
25
+ getStatus(options) { return this.call('status', {}, options); }
26
+ enable(options) { return this.write('enable', {}, options); }
27
+ pause(options) { return this.write('pause', {}, options); }
28
+ resume(options) { return this.write('resume', {}, options); }
29
+ getConfirmation(id, options) { return this.call('status', { confirmation_id: id }, options); }
30
+ decisions = {
31
+ list: (options) => this.call('list_decisions', { cursor: options?.cursor, limit: options?.limit, status: options?.status }, options),
32
+ get: (ref, options) => this.call('get_decision', { decision_id: ref.id, decision_source: ref.source }, options),
33
+ getContext: (ref, options) => this.call('get_decision_context', { decision_id: ref.id, decision_source: ref.source, limit: options?.limit }, options),
34
+ approve: (ref, options) => this.write('approve', { decision_id: ref.id, decision_source: ref.source }, options),
35
+ deny: (ref, options) => this.call('deny', { decision_id: ref.id, decision_source: ref.source, reason: options.reason }, options),
36
+ };
37
+ conversations = {
38
+ create: (options) => this.write('create_conversation', { title: options?.title }, options),
39
+ list: (options) => this.call('list_conversations', { cursor: options?.cursor, limit: options?.limit }, options),
40
+ get: (id, options) => this.call('get_conversation', { conversation_id: id, turn_id: options?.turnId, after_sequence: options?.afterSequence, limit: options?.limit }, options),
41
+ };
42
+ ask(message, options) { return this.write('ask', { message, conversation_id: options?.conversationId, wait_ms: options?.waitMs }, options); }
43
+ memory = {
44
+ list: (options) => this.call('list_memory', { cursor: options?.cursor, limit: options?.limit, kind: options?.kind }, options),
45
+ search: (query, options) => this.call('search_memory', { query, limit: options?.limit }, options),
46
+ getSourceArtifact: (id, options) => this.call('get_source_artifact', { source_artifact_id: id }, options),
47
+ recordDecision: (payload, options) => this.write('record_decision', { payload }, options),
48
+ recordCommitment: (payload, options) => this.write('record_commitment', { payload }, options),
49
+ recordLearning: (payload, options) => this.write('record_learning', { payload }, options),
50
+ };
51
+ principles = {
52
+ list: (options) => this.call('list_principles', { cursor: options?.cursor, limit: options?.limit }, options),
53
+ get: (id, options) => this.call('get_principle', { principle_id: id }, options),
54
+ record: (payload, options) => this.write('record_principle', { payload }, options),
55
+ };
56
+ /** Timeout/abort ends only observation. On timeout data retains the last receipt. */
57
+ async waitForConfirmation(id, options = {}) {
58
+ const timeout = options.timeoutMs ?? 120000, interval = options.pollIntervalMs ?? 1000;
59
+ if (!Number.isFinite(timeout) || timeout < 0 || !Number.isFinite(interval) || interval <= 0)
60
+ return { data: null, error: officeError('invalid_request', 'Use a nonnegative timeout and a positive polling interval.') };
61
+ const observer = new AbortController();
62
+ let timedOut = false, last = null;
63
+ const abort = () => observer.abort();
64
+ options.signal?.addEventListener('abort', abort, { once: true });
65
+ if (options.signal?.aborted)
66
+ abort();
67
+ const timer = setTimeout(() => { timedOut = true; observer.abort(); }, timeout);
68
+ try {
69
+ while (!observer.signal.aborted) {
70
+ const result = await this.getConfirmation(id, { signal: observer.signal });
71
+ if (result.error) {
72
+ if (observer.signal.aborted)
73
+ break;
74
+ return { data: last, error: result.error };
75
+ }
76
+ last = result.data;
77
+ if (last && last.state !== 'awaiting_confirmation' && last.state !== 'executing')
78
+ return { data: last, error: null };
79
+ await new Promise(resolve => {
80
+ const done = () => { clearTimeout(poll); observer.signal.removeEventListener('abort', done); resolve(); };
81
+ const poll = setTimeout(done, interval);
82
+ observer.signal.addEventListener('abort', done, { once: true });
83
+ if (observer.signal.aborted)
84
+ done();
85
+ });
86
+ }
87
+ return { data: last, error: officeError(timedOut ? 'observation_timeout' : 'aborted', timedOut ? 'Stopped waiting. Inspect this confirmation before taking further action.' : 'Observation was cancelled.') };
88
+ }
89
+ finally {
90
+ clearTimeout(timer);
91
+ options.signal?.removeEventListener('abort', abort);
92
+ }
93
+ }
94
+ /** Supply conversationId+turnId to observe an existing Ask without submitting. */
95
+ async *askStream(message, options = {}) {
96
+ let conversationId = options.conversationId, turnId = options.turnId;
97
+ const after = options.afterSequence ?? 0;
98
+ if (!Number.isSafeInteger(after) || after < 0 || (turnId && !conversationId) || (!turnId && after > 0))
99
+ throw officeError('invalid_request', 'Replay requires exact conversation and turn IDs and a nonnegative sequence.');
100
+ if (!turnId) {
101
+ const admitted = await this.ask(message, { ...options, waitMs: 0 });
102
+ if (admitted.error)
103
+ throw admitted.error;
104
+ if (!admitted.data)
105
+ throw officeError('protocol_error', 'Office did not return an admitted turn.');
106
+ conversationId = admitted.data.conversation_id;
107
+ turnId = admitted.data.turn_id;
108
+ }
109
+ if (!conversationId)
110
+ throw officeError('invalid_request', 'conversationId is required.');
111
+ try {
112
+ const response = await this.transport.open({ organizationId: this.organizationId, method: 'GET',
113
+ path: `/v1/me/office/conversations/${encodeURIComponent(conversationId)}/turns/${encodeURIComponent(turnId)}/events?after_sequence=${after}` }, options.signal, true);
114
+ yield* readOfficeEvents(response, conversationId, turnId, after, options.signal);
115
+ }
116
+ catch (error) {
117
+ if (error instanceof OfficeStreamError)
118
+ throw error;
119
+ throw new OfficeStreamError(error instanceof OfficeClientError ? error : officeError('connection_error', 'Office event observation ended.'), conversationId, turnId, after);
120
+ }
121
+ }
122
+ }
123
+ //# sourceMappingURL=office-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"office-client.js","sourceRoot":"","sources":["../../src/office/office-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type OfficePublicEvent } from '@butterbase/shared';
2
+ export declare function readOfficeEvents(response: Response, conversationId: string, turnId: string, afterSequence: number, signal?: AbortSignal): AsyncGenerator<OfficePublicEvent>;
3
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/office/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8C,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAIxG,wBAAuB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,iBAAiB,CAAC,CA8DlL"}
@@ -0,0 +1,102 @@
1
+ import { officeErrorSchema, officePublicEventSchema } from '@butterbase/shared';
2
+ import { OfficeClientError, OfficeStreamError } from './types.js';
3
+ import { officeError } from './transport.js';
4
+ export async function* readOfficeEvents(response, conversationId, turnId, afterSequence, signal) {
5
+ if (!response.headers.get('content-type')?.toLowerCase().startsWith('text/event-stream') || !response.body)
6
+ throw officeError('protocol_error', 'Expected an Office event stream.');
7
+ const reader = response.body.getReader();
8
+ const decoder = new TextDecoder('utf-8', { fatal: true });
9
+ let buffer = '', event = '', id = '', data = [], size = 0, lastSequence = afterSequence, suspended = false;
10
+ const abort = () => { void reader.cancel().catch(() => { }); };
11
+ signal?.addEventListener('abort', abort, { once: true });
12
+ try {
13
+ if (signal?.aborted)
14
+ throw officeError('aborted', 'Observation was cancelled.');
15
+ while (true) {
16
+ const chunk = await reader.read();
17
+ if (signal?.aborted)
18
+ throw officeError('aborted', 'Observation was cancelled.');
19
+ try {
20
+ buffer += chunk.done ? decoder.decode() : decoder.decode(chunk.value, { stream: true });
21
+ }
22
+ catch {
23
+ throw officeError('protocol_error', 'Invalid UTF-8 in the Office event stream.');
24
+ }
25
+ let boundary;
26
+ while ((boundary = buffer.search(/[\r\n]/)) >= 0) {
27
+ if (buffer[boundary] === '\r' && boundary === buffer.length - 1 && !chunk.done)
28
+ break;
29
+ const line = buffer.slice(0, boundary);
30
+ const separator = buffer[boundary] === '\r' && buffer[boundary + 1] === '\n' ? 2 : 1;
31
+ buffer = buffer.slice(boundary + separator);
32
+ if (line !== '') {
33
+ if (line.startsWith(':'))
34
+ continue;
35
+ size += line.length;
36
+ if (size > 131072)
37
+ throw officeError('protocol_error', 'Office event exceeds the public frame limit.');
38
+ const colon = line.indexOf(':');
39
+ const field = colon < 0 ? line : line.slice(0, colon);
40
+ const value = colon < 0 ? '' : line.slice(colon + 1).replace(/^ /, '');
41
+ if (field === 'event')
42
+ event = value;
43
+ else if (field === 'id')
44
+ id = value;
45
+ else if (field === 'data')
46
+ data.push(value);
47
+ continue;
48
+ }
49
+ const kind = event, sequence = id, text = data.join('\n');
50
+ event = '';
51
+ id = '';
52
+ data = [];
53
+ size = 0;
54
+ if (!text)
55
+ continue;
56
+ let value;
57
+ try {
58
+ value = JSON.parse(text);
59
+ }
60
+ catch {
61
+ throw officeError('protocol_error', 'Malformed Office event data.');
62
+ }
63
+ if (kind === 'error') {
64
+ const parsed = officeErrorSchema.safeParse(value?.error);
65
+ throw parsed.success ? new OfficeClientError(parsed.data) : officeError('protocol_error', 'Invalid Office stream error.');
66
+ }
67
+ const parsed = officePublicEventSchema.safeParse(value);
68
+ if (!parsed.success || (kind && kind !== parsed.data.type) || (sequence && (!/^\d+$/.test(sequence) || Number(sequence) !== parsed.data.sequence)))
69
+ throw officeError('protocol_error', 'Invalid Office public event.');
70
+ const publicEvent = parsed.data;
71
+ if ((publicEvent.type === 'started' || publicEvent.type === 'completed') &&
72
+ (publicEvent.conversation_id !== conversationId || publicEvent.turn_id !== turnId))
73
+ throw officeError('protocol_error', 'Office event belongs to a different turn.');
74
+ if (publicEvent.sequence <= lastSequence)
75
+ continue;
76
+ if (publicEvent.sequence !== lastSequence + 1)
77
+ throw officeError('protocol_error', 'Office event sequence has a gap.');
78
+ lastSequence = publicEvent.sequence;
79
+ suspended = publicEvent.type === 'approval_required';
80
+ yield publicEvent;
81
+ if (['completed', 'blocked', 'failed', 'interrupted', 'decision_resolved'].includes(publicEvent.type))
82
+ return;
83
+ }
84
+ if (buffer.length + size > 131072)
85
+ throw officeError('protocol_error', 'Office event exceeds the public frame limit.');
86
+ if (chunk.done) {
87
+ if (suspended && !buffer && !data.length)
88
+ return;
89
+ throw officeError('connection_error', 'Office stream ended before a terminal event. Resume using the exact turn and last sequence.');
90
+ }
91
+ }
92
+ }
93
+ catch (error) {
94
+ throw new OfficeStreamError(error instanceof OfficeClientError ? error : officeError(signal?.aborted ? 'aborted' : 'connection_error', 'Office event observation ended.'), conversationId, turnId, lastSequence);
95
+ }
96
+ finally {
97
+ signal?.removeEventListener('abort', abort);
98
+ await reader.cancel().catch(() => { });
99
+ reader.releaseLock();
100
+ }
101
+ }
102
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/office/stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { OfficeClientOptions } from '@butterbase/shared';
2
+ import { OfficeClientError, type OfficeResponse } from './types.js';
3
+ export interface OfficeHttpRequest {
4
+ organizationId: string;
5
+ method: 'GET' | 'POST';
6
+ path: string;
7
+ body?: Record<string, unknown>;
8
+ }
9
+ /** Public facade descriptor, kept in parity with the cloud MCP adapter. */
10
+ export declare function officeHttpRequest(input: unknown): OfficeHttpRequest;
11
+ export declare function officeError(code: ConstructorParameters<typeof OfficeClientError>[0]['code'], message: string): OfficeClientError;
12
+ export declare class OfficeTransport {
13
+ private readonly options;
14
+ private readonly fetch;
15
+ private readonly base;
16
+ constructor(options: OfficeClientOptions);
17
+ open(request: OfficeHttpRequest, signal?: AbortSignal, stream?: boolean): Promise<Response>;
18
+ request<T>(input: unknown, signal?: AbortSignal): Promise<OfficeResponse<T>>;
19
+ }
20
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/office/transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAAG,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAAE;AAEpI,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CA4BnE;AACD,wBAAgB,WAAW,CAAC,IAAI,EAAE,qBAAqB,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAEhI;AAYD,qBAAa,eAAe;IAGd,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBACD,OAAO,EAAE,mBAAmB;IAOnD,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IA2BzF,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;CAmBnF"}
@@ -0,0 +1,141 @@
1
+ import { officeActionSchema, officeErrorSchema, officeStatusSchema, officeTurnSchema, confirmationReceiptSchema } from '@butterbase/shared';
2
+ import { OfficeClientError } from './types.js';
3
+ const BASE = '/v1/me/office';
4
+ /** Public facade descriptor, kept in parity with the cloud MCP adapter. */
5
+ export function officeHttpRequest(input) {
6
+ const r = officeActionSchema.parse(input);
7
+ const result = { organizationId: r.org_id, method: 'GET', path: BASE };
8
+ function get(path, query = {}) {
9
+ const params = new URLSearchParams();
10
+ for (const [key, value] of Object.entries(query))
11
+ if (value !== undefined)
12
+ params.set(key, String(value));
13
+ result.path = `${BASE}${path}${params.size ? `?${params}` : ''}`;
14
+ return result;
15
+ }
16
+ function post(path, body) { return { ...result, method: 'POST', path: `${BASE}${path}`, body }; }
17
+ switch (r.action) {
18
+ case 'status': return get(r.confirmation_id ? `/confirmations/${encodeURIComponent(r.confirmation_id)}` : '');
19
+ case 'enable':
20
+ case 'pause':
21
+ case 'resume': return post('/confirmations', { action: r.action, idempotency_key: r.idempotency_key });
22
+ case 'approve': return post('/confirmations', { action: r.action, decision: { source: r.decision_source, id: r.decision_id }, idempotency_key: r.idempotency_key });
23
+ case 'list_decisions': return get('/decisions', { cursor: r.cursor, limit: r.limit, status: r.status });
24
+ case 'get_decision': return get(`/decisions/${r.decision_source}/${encodeURIComponent(r.decision_id)}`);
25
+ case 'get_decision_context': return get(`/decisions/${r.decision_source}/${encodeURIComponent(r.decision_id)}/context`, { limit: r.limit });
26
+ case 'deny': return post(`/decisions/${r.decision_source}/${encodeURIComponent(r.decision_id)}/deny`, { reason: r.reason });
27
+ case 'create_conversation': return post('/conversations', { ...(r.title ? { title: r.title } : {}), idempotency_key: r.idempotency_key });
28
+ case 'list_conversations': return get('/conversations', { cursor: r.cursor, limit: r.limit });
29
+ case 'get_conversation': return get(`/conversations/${encodeURIComponent(r.conversation_id)}`, { turn_id: r.turn_id, after_sequence: r.after_sequence, limit: r.limit });
30
+ case 'ask': return post('/ask', { message: r.message, ...(r.conversation_id ? { conversation_id: r.conversation_id } : {}), idempotency_key: r.idempotency_key, wait_ms: r.wait_ms });
31
+ case 'list_memory': return get('/memory', { cursor: r.cursor, limit: r.limit, kind: r.kind });
32
+ case 'search_memory': return get('/memory/search', { query: r.query, limit: r.limit });
33
+ case 'get_source_artifact': return get(`/memory/sources/${encodeURIComponent(r.source_artifact_id)}`);
34
+ case 'record_decision':
35
+ case 'record_commitment':
36
+ case 'record_learning':
37
+ case 'record_principle': return post(`/memory/${r.action}`, { payload: r.payload, idempotency_key: r.idempotency_key });
38
+ case 'list_principles': return get('/principles', { cursor: r.cursor, limit: r.limit });
39
+ case 'get_principle': return get(`/principles/${encodeURIComponent(r.principle_id)}`);
40
+ }
41
+ }
42
+ export function officeError(code, message) {
43
+ return new OfficeClientError({ code, message });
44
+ }
45
+ /** Bounds observation even if an injected transport/token refresh ignores abort. */
46
+ function observe(work, signal) {
47
+ if (!signal)
48
+ return work;
49
+ return new Promise((resolve, reject) => {
50
+ const cleanup = () => signal.removeEventListener('abort', abort);
51
+ const abort = () => { cleanup(); reject(officeError('aborted', 'Observation was cancelled.')); };
52
+ signal.addEventListener('abort', abort, { once: true });
53
+ work.then(value => { cleanup(); resolve(value); }, error => { cleanup(); reject(error); });
54
+ if (signal.aborted)
55
+ abort();
56
+ });
57
+ }
58
+ export class OfficeTransport {
59
+ options;
60
+ fetch;
61
+ base;
62
+ constructor(options) {
63
+ this.options = options;
64
+ let url;
65
+ try {
66
+ url = new URL(options.apiUrl);
67
+ }
68
+ catch {
69
+ throw officeError('invalid_request', 'apiUrl must be an HTTP or HTTPS API URL.');
70
+ }
71
+ if (!['https:', 'http:'].includes(url.protocol) || url.username || url.password || url.search || url.hash ||
72
+ !officeActionSchema.safeParse({ action: 'status', org_id: options.organizationId }).success)
73
+ throw officeError('invalid_request', 'Supply an API URL and an explicit organization UUID.');
74
+ this.base = options.apiUrl.replace(/\/$/, '');
75
+ this.fetch = options.fetch ?? globalThis.fetch.bind(globalThis);
76
+ }
77
+ async open(request, signal, stream = false) {
78
+ const body = request.body ? JSON.stringify(request.body) : undefined;
79
+ const retrySafe = request.method === 'GET' || typeof request.body?.idempotency_key === 'string';
80
+ for (let attempt = 0;; attempt++) {
81
+ if (signal?.aborted)
82
+ throw officeError('aborted', 'Observation was cancelled.');
83
+ let token;
84
+ try {
85
+ token = await observe(Promise.resolve().then(() => this.options.getToken()), signal);
86
+ }
87
+ catch {
88
+ throw officeError(signal?.aborted ? 'aborted' : 'unauthenticated', signal?.aborted ? 'Observation was cancelled.' : 'A platform credential is required.');
89
+ }
90
+ if (!token)
91
+ throw officeError('unauthenticated', 'A platform credential is required.');
92
+ let response;
93
+ try {
94
+ response = await observe(this.fetch(`${this.base}${request.path}`, { method: request.method, body, signal,
95
+ headers: { Authorization: `Bearer ${token}`, 'x-organization-id': request.organizationId,
96
+ ...(body ? { 'Content-Type': 'application/json' } : {}), ...(stream ? { Accept: 'text/event-stream' } : {}) } }), signal);
97
+ }
98
+ catch {
99
+ if (signal?.aborted)
100
+ throw officeError('aborted', 'Observation was cancelled.');
101
+ if (attempt === 0 && retrySafe)
102
+ continue;
103
+ throw officeError('connection_error', 'The connection ended. Inspect the exact request or retry with its original idempotency key.');
104
+ }
105
+ if (response.ok)
106
+ return response;
107
+ if (attempt === 0 && retrySafe && [502, 503, 504].includes(response.status)) {
108
+ await response.body?.cancel().catch(() => { });
109
+ continue;
110
+ }
111
+ const payload = await observe(response.json().catch(() => null), signal);
112
+ const parsed = officeErrorSchema.safeParse(payload?.error);
113
+ throw parsed.success ? new OfficeClientError(parsed.data, response.status)
114
+ : new OfficeClientError({ code: response.status === 401 ? 'unauthenticated' : response.status === 403 ? 'forbidden' : 'service_unavailable', message: 'Office request failed.' }, response.status);
115
+ }
116
+ }
117
+ async request(input, signal) {
118
+ const parsed = officeActionSchema.safeParse(input);
119
+ if (!parsed.success)
120
+ return { data: null, error: officeError('invalid_request', 'Invalid Office action or fields.') };
121
+ try {
122
+ const response = await this.open(officeHttpRequest(parsed.data), signal);
123
+ let data = await observe(response.json(), signal);
124
+ const action = parsed.data.action;
125
+ // Preserve the dashboard's existing REST envelope while exposing the
126
+ // standalone client's agreed OfficeStatus value.
127
+ if (action === 'status' && !parsed.data.confirmation_id)
128
+ data = data?.status ?? data;
129
+ const schema = action === 'ask' ? officeTurnSchema : ['enable', 'pause', 'resume', 'approve'].includes(action)
130
+ || (action === 'status' && parsed.data.confirmation_id) ? confirmationReceiptSchema : action === 'status' ? officeStatusSchema : undefined;
131
+ if (!data || typeof data !== 'object' || (schema && !schema.safeParse(data).success))
132
+ throw officeError('protocol_error', 'Office returned an invalid response.');
133
+ return { data: data, error: null };
134
+ }
135
+ catch (error) {
136
+ return { data: null, error: error instanceof OfficeClientError ? error
137
+ : officeError(signal?.aborted ? 'aborted' : error instanceof SyntaxError ? 'protocol_error' : 'connection_error', 'Office response could not be read.') };
138
+ }
139
+ }
140
+ }
141
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/office/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE5I,OAAO,EAAE,iBAAiB,EAAuB,MAAM,YAAY,CAAC;AAGpE,MAAM,IAAI,GAAG,eAAe,CAAC;AAC7B,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,MAAM,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAsB,EAAE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC1F,SAAS,GAAG,CAAC,IAAY,EAAE,QAAiC,EAAE;QAC5D,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1G,MAAM,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAAC,OAAO,MAAM,CAAC;IAClF,CAAC;IACD,SAAS,IAAI,CAAC,IAAY,EAAE,IAA6B,IAAI,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAe,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3I,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,kBAAkB,kBAAkB,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9G,KAAK,QAAQ,CAAC;QAAC,KAAK,OAAO,CAAC;QAAC,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACpI,KAAK,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACpK,KAAK,gBAAgB,CAAC,CAAC,OAAO,GAAG,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACxG,KAAK,cAAc,CAAC,CAAC,OAAO,GAAG,CAAC,cAAc,CAAC,CAAC,eAAe,IAAI,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACxG,KAAK,sBAAsB,CAAC,CAAC,OAAO,GAAG,CAAC,cAAc,CAAC,CAAC,eAAe,IAAI,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5I,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,eAAe,IAAI,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5H,KAAK,qBAAqB,CAAC,CAAC,OAAO,IAAI,CAAC,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC1I,KAAK,oBAAoB,CAAC,CAAC,OAAO,GAAG,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9F,KAAK,kBAAkB,CAAC,CAAC,OAAO,GAAG,CAAC,kBAAkB,kBAAkB,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACzK,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACtL,KAAK,aAAa,CAAC,CAAC,OAAO,GAAG,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9F,KAAK,eAAe,CAAC,CAAC,OAAO,GAAG,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACvF,KAAK,qBAAqB,CAAC,CAAC,OAAO,GAAG,CAAC,mBAAmB,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACtG,KAAK,iBAAiB,CAAC;QAAC,KAAK,mBAAmB,CAAC;QAAC,KAAK,iBAAiB,CAAC;QAAC,KAAK,kBAAkB,CAAC,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAClM,KAAK,iBAAiB,CAAC,CAAC,OAAO,GAAG,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACxF,KAAK,eAAe,CAAC,CAAC,OAAO,GAAG,CAAC,eAAe,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;AACH,CAAC;AACD,MAAM,UAAU,WAAW,CAAC,IAAgE,EAAE,OAAe;IAC3G,OAAO,IAAI,iBAAiB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAClD,CAAC;AACD,oFAAoF;AACpF,SAAS,OAAO,CAAI,IAAgB,EAAE,MAAoB;IACxD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjG,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,IAAI,MAAM,CAAC,OAAO;YAAE,KAAK,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AACD,MAAM,OAAO,eAAe;IAGG;IAFZ,KAAK,CAA0B;IAC/B,IAAI,CAAS;IAC9B,YAA6B,OAA4B;QAA5B,YAAO,GAAP,OAAO,CAAqB;QACvD,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YAAC,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,MAAM,WAAW,CAAC,iBAAiB,EAAE,0CAA0C,CAAC,CAAC;QAAC,CAAC;QAClI,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI;YACvG,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO;YAAE,MAAM,WAAW,CAAC,iBAAiB,EAAE,sDAAsD,CAAC,CAAC;QAC5L,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,OAA0B,EAAE,MAAoB,EAAE,MAAM,GAAG,KAAK;QACzE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,OAAO,CAAC,IAAI,EAAE,eAAe,KAAK,QAAQ,CAAC;QAChG,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;YAClC,IAAI,MAAM,EAAE,OAAO;gBAAE,MAAM,WAAW,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC;YAChF,IAAI,KAAa,CAAC;YAClB,IAAI,CAAC;gBAAC,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;YAAC,CAAC;YAC7F,MAAM,CAAC;gBAAC,MAAM,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC;YAAC,CAAC;YACpK,IAAI,CAAC,KAAK;gBAAE,MAAM,WAAW,CAAC,iBAAiB,EAAE,oCAAoC,CAAC,CAAC;YACvF,IAAI,QAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM;oBACvG,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,mBAAmB,EAAE,OAAO,CAAC,cAAc;wBACtF,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;YAChI,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,MAAM,EAAE,OAAO;oBAAE,MAAM,WAAW,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC;gBAChF,IAAI,OAAO,KAAK,CAAC,IAAI,SAAS;oBAAE,SAAS;gBACzC,MAAM,WAAW,CAAC,kBAAkB,EAAE,6FAA6F,CAAC,CAAC;YACvI,CAAC;YACD,IAAI,QAAQ,CAAC,EAAE;gBAAE,OAAO,QAAQ,CAAC;YACjC,IAAI,OAAO,KAAK,CAAC,IAAI,SAAS,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YACzI,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YACzE,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC;gBACxE,CAAC,CAAC,IAAI,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,qBAAqB,EAAE,OAAO,EAAE,wBAAwB,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACvM,CAAC;IACH,CAAC;IACD,KAAK,CAAC,OAAO,CAAI,KAAc,EAAE,MAAoB;QACnD,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,iBAAiB,EAAE,kCAAkC,CAAC,EAAE,CAAC;QACtH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YACzE,IAAI,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YAClC,qEAAqE;YACrE,iDAAiD;YACjD,IAAI,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe;gBAAE,IAAI,GAAG,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC;YACrF,MAAM,MAAM,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;mBACzG,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7I,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;gBAAE,MAAM,WAAW,CAAC,gBAAgB,EAAE,sCAAsC,CAAC,CAAC;YAClK,OAAO,EAAE,IAAI,EAAE,IAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,YAAY,iBAAiB,CAAC,CAAC,CAAC,KAAK;oBACpE,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,YAAY,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,EAAE,oCAAoC,CAAC,EAAE,CAAC;QAC9J,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,48 @@
1
+ import type { OfficeError, OfficeErrorCode, OfficeRequestOptions, OfficeWriteOptions, OfficePageOptions } from '@butterbase/shared';
2
+ export type { OfficeClientOptions, OfficeRequestOptions, OfficeWriteOptions, OfficePageOptions, OfficePage, OfficeStatus, ConfirmationReceipt, OfficeCommandReview, DecisionRef, OfficeDecision, OfficeDecisionContext, OfficeConversation, OfficeConversationDetail, OfficeTurn, OfficePublicEvent, OfficeError, OfficeErrorCode, OfficeMemoryResult, OfficeMemoryRecord, OfficeSourceArtifact, OfficePrinciple, OfficeRecordDecisionInput, OfficeRecordCommitmentInput, OfficeRecordLearningInput, OfficeRecordPrincipleInput, } from '@butterbase/shared';
3
+ export declare class OfficeClientError extends Error {
4
+ readonly detail: OfficeError;
5
+ readonly status?: number | undefined;
6
+ readonly idempotencyKey?: string | undefined;
7
+ readonly code: OfficeErrorCode;
8
+ readonly decision?: OfficeError['decision'];
9
+ readonly history?: OfficeError['history'];
10
+ constructor(detail: OfficeError, status?: number | undefined, idempotencyKey?: string | undefined);
11
+ }
12
+ export declare class OfficeStreamError extends OfficeClientError {
13
+ readonly conversationId: string;
14
+ readonly turnId: string;
15
+ readonly lastSequence: number;
16
+ constructor(error: OfficeClientError, conversationId: string, turnId: string, lastSequence: number);
17
+ }
18
+ export interface OfficeResponse<T> {
19
+ data: T | null;
20
+ error: OfficeClientError | null;
21
+ }
22
+ export interface OfficeAskOptions extends OfficeWriteOptions {
23
+ conversationId?: string;
24
+ waitMs?: number;
25
+ }
26
+ export interface OfficeAskStreamOptions extends OfficeAskOptions {
27
+ turnId?: string;
28
+ afterSequence?: number;
29
+ }
30
+ export interface OfficeConfirmationWaitOptions extends OfficeRequestOptions {
31
+ timeoutMs?: number;
32
+ pollIntervalMs?: number;
33
+ }
34
+ export interface OfficeDecisionListOptions extends OfficePageOptions {
35
+ status?: 'pending' | 'resolved' | 'all';
36
+ }
37
+ export interface OfficeConversationCreateOptions extends OfficeWriteOptions {
38
+ title?: string;
39
+ }
40
+ export interface OfficeConversationGetOptions extends OfficeRequestOptions {
41
+ turnId?: string;
42
+ afterSequence?: number;
43
+ limit?: number;
44
+ }
45
+ export interface OfficeMemoryListOptions extends OfficePageOptions {
46
+ kind?: 'decision' | 'commitment' | 'learning';
47
+ }
48
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/office/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACpI,YAAY,EACV,mBAAmB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,UAAU,EAC5F,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,EAAE,cAAc,EAAE,qBAAqB,EAC1G,kBAAkB,EAAE,wBAAwB,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EACzG,kBAAkB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,eAAe,EAC7E,yBAAyB,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,0BAA0B,GAC9G,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,iBAAkB,SAAQ,KAAK;IAI9B,QAAQ,CAAC,MAAM,EAAE,WAAW;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM;IAHpG,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;gBACrB,MAAM,EAAE,WAAW,EAAW,MAAM,CAAC,EAAE,MAAM,YAAA,EAAW,cAAc,CAAC,EAAE,MAAM,YAAA;CAIrG;AACD,qBAAa,iBAAkB,SAAQ,iBAAiB;IAChB,QAAQ,CAAC,cAAc,EAAE,MAAM;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM;IAAE,QAAQ,CAAC,YAAY,EAAE,MAAM;gBAAjH,KAAK,EAAE,iBAAiB,EAAW,cAAc,EAAE,MAAM,EAAW,MAAM,EAAE,MAAM,EAAW,YAAY,EAAE,MAAM;CAG9H;AACD,MAAM,WAAW,cAAc,CAAC,CAAC;IAAI,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAAE;AACvF,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAAG,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAAE;AAC1G,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAAG,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CAAE;AAC7G,MAAM,WAAW,6BAA8B,SAAQ,oBAAoB;IAAG,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAAE;AAC5H,MAAM,WAAW,yBAA0B,SAAQ,iBAAiB;IAAG,MAAM,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;CAAE;AACjH,MAAM,WAAW,+BAAgC,SAAQ,kBAAkB;IAAG,KAAK,CAAC,EAAE,MAAM,CAAC;CAAE;AAC/F,MAAM,WAAW,4BAA6B,SAAQ,oBAAoB;IAAG,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CAAE;AACvI,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAAG,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,UAAU,CAAC;CAAE"}
@@ -0,0 +1,31 @@
1
+ export class OfficeClientError extends Error {
2
+ detail;
3
+ status;
4
+ idempotencyKey;
5
+ code;
6
+ decision;
7
+ history;
8
+ constructor(detail, status, idempotencyKey) {
9
+ super(detail.message);
10
+ this.detail = detail;
11
+ this.status = status;
12
+ this.idempotencyKey = idempotencyKey;
13
+ this.name = 'OfficeClientError';
14
+ this.code = detail.code;
15
+ this.decision = detail.decision;
16
+ this.history = detail.history;
17
+ }
18
+ }
19
+ export class OfficeStreamError extends OfficeClientError {
20
+ conversationId;
21
+ turnId;
22
+ lastSequence;
23
+ constructor(error, conversationId, turnId, lastSequence) {
24
+ super(error.detail, error.status, error.idempotencyKey);
25
+ this.conversationId = conversationId;
26
+ this.turnId = turnId;
27
+ this.lastSequence = lastSequence;
28
+ this.name = 'OfficeStreamError';
29
+ }
30
+ }
31
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/office/types.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAIrB;IAA8B;IAA0B;IAHpE,IAAI,CAAkB;IACtB,QAAQ,CAA2B;IACnC,OAAO,CAA0B;IAC1C,YAAqB,MAAmB,EAAW,MAAe,EAAW,cAAuB;QAClG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QADH,WAAM,GAAN,MAAM,CAAa;QAAW,WAAM,GAAN,MAAM,CAAS;QAAW,mBAAc,GAAd,cAAc,CAAS;QAC3E,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QAChF,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAAC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IACjE,CAAC;CACF;AACD,MAAM,OAAO,iBAAkB,SAAQ,iBAAiB;IACP;IAAiC;IAAyB;IAAzG,YAAY,KAAwB,EAAW,cAAsB,EAAW,MAAc,EAAW,YAAoB;QAC3H,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;QADX,mBAAc,GAAd,cAAc,CAAQ;QAAW,WAAM,GAAN,MAAM,CAAQ;QAAW,iBAAY,GAAZ,YAAY,CAAQ;QAClE,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAC3F,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@butterbase/sdk",
3
- "version": "2.11.0",
3
+ "version": "2.12.0",
4
4
  "description": "Universal TypeScript SDK for Butterbase",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://butterbase.ai",
@@ -38,7 +38,7 @@
38
38
  "storage"
39
39
  ],
40
40
  "dependencies": {
41
- "@butterbase/shared": "^0.4.0"
41
+ "@butterbase/shared": "^0.4.2"
42
42
  },
43
43
  "devDependencies": {
44
44
  "typescript": "^5.7.0",