@useorgx/orgx-opencode-plugin 0.1.0-alpha.7 → 0.1.0-alpha.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -34,6 +34,25 @@ Set `ORGX_BASE_URL` only when testing against a non-production OrgX API. Until
34
34
  the npm package is updated, use the direct peer command below from a checked-out
35
35
  copy of this repository.
36
36
 
37
+ ### Resumable questions
38
+
39
+ OpenCode's native `question.asked` event can be routed to the same OrgX
40
+ Attention queue used by Codex and Claude. This is opt-in because a visible
41
+ OpenCode client can still answer its local prompt first:
42
+
43
+ ```bash
44
+ export ORGX_REMOTE_ATTENTION=1
45
+ export ORGX_INITIATIVE_ID=<uuid>
46
+ export ORGX_API_KEY=oxk_...
47
+ opencode
48
+ ```
49
+
50
+ The plugin creates one durable attention record per native question, waits for
51
+ all related answers, replies to the original OpenCode request through the v2
52
+ local SDK, and records `resuming`, `resumed`, or `resume_failed` receipts. If
53
+ the OpenCode process exits, the durable answer remains in OrgX but cannot be
54
+ claimed as resumed until a client applies it again.
55
+
37
56
  You can also run the peer directly:
38
57
 
39
58
  ```bash
@@ -0,0 +1,38 @@
1
+ type QuestionOption = {
2
+ label: string;
3
+ description?: string;
4
+ };
5
+ export type OpenCodeQuestion = {
6
+ question: string;
7
+ header?: string;
8
+ options?: QuestionOption[];
9
+ multiple?: boolean;
10
+ };
11
+ export type OpenCodeQuestionRequest = {
12
+ id: string;
13
+ sessionID: string;
14
+ questions: OpenCodeQuestion[];
15
+ tool?: {
16
+ messageID?: string;
17
+ callID?: string;
18
+ };
19
+ };
20
+ type FetchLike = typeof fetch;
21
+ type BridgeOptions = {
22
+ request: OpenCodeQuestionRequest;
23
+ apiKey: string;
24
+ initiativeId: string;
25
+ runId?: string;
26
+ workstreamId?: string;
27
+ baseUrl?: string;
28
+ reply: (answers: string[][]) => Promise<unknown>;
29
+ fetchImpl?: FetchLike;
30
+ pollIntervalMs?: number;
31
+ maxWaitMs?: number;
32
+ signal?: AbortSignal;
33
+ onCreated?: (attentionIds: string[]) => void;
34
+ };
35
+ export declare function parseQuestionRequest(event: unknown): OpenCodeQuestionRequest | null;
36
+ export declare function bridgeOpenCodeQuestions(options: BridgeOptions): Promise<void>;
37
+ export {};
38
+ //# sourceMappingURL=attentionBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attentionBridge.d.ts","sourceRoot":"","sources":["../src/attentionBridge.ts"],"names":[],"mappings":"AAAA,KAAK,cAAc,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD,CAAC;AAEF,KAAK,SAAS,GAAG,OAAO,KAAK,CAAC;AAE9B,KAAK,aAAa,GAAG;IACnB,OAAO,EAAE,uBAAuB,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC9C,CAAC;AAQF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,GAAG,IAAI,CA0BnF;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiHnF"}
@@ -0,0 +1,230 @@
1
+ export function parseQuestionRequest(event) {
2
+ if (!event || typeof event !== 'object')
3
+ return null;
4
+ const record = event;
5
+ if (record.type !== 'question.asked')
6
+ return null;
7
+ const payload = asRecord(record.properties) ?? asRecord(record.data);
8
+ if (!payload)
9
+ return null;
10
+ const id = string(payload.id ?? payload.requestID);
11
+ const sessionID = string(payload.sessionID);
12
+ const questions = Array.isArray(payload.questions)
13
+ ? payload.questions.map(normalizeQuestion).filter(Boolean)
14
+ : [];
15
+ if (!id || !sessionID || questions.length === 0)
16
+ return null;
17
+ const toolRecord = asRecord(payload.tool);
18
+ return {
19
+ id,
20
+ sessionID,
21
+ questions: questions,
22
+ ...(toolRecord
23
+ ? {
24
+ tool: {
25
+ messageID: string(toolRecord.messageID),
26
+ callID: string(toolRecord.callID),
27
+ },
28
+ }
29
+ : {}),
30
+ };
31
+ }
32
+ export async function bridgeOpenCodeQuestions(options) {
33
+ const request = options.fetchImpl ?? globalThis.fetch;
34
+ const baseUrl = (options.baseUrl ?? 'https://useorgx.com').replace(/\/$/, '');
35
+ const created = [];
36
+ for (const [questionIndex, question] of options.request.questions.entries()) {
37
+ throwIfAborted(options.signal);
38
+ const optionIds = new Map();
39
+ const optionRecords = (question.options ?? []).map((option, optionIndex) => {
40
+ const id = `q${questionIndex + 1}-o${optionIndex + 1}`;
41
+ optionIds.set(id, option.label);
42
+ return { id, label: option.label, ...(option.description ? { description: option.description } : {}) };
43
+ });
44
+ const payload = await requestJson(request, `${baseUrl}/api/client/live/attention`, options.apiKey, {
45
+ initiative_id: options.initiativeId,
46
+ ...(options.runId ? { run_id: options.runId } : {}),
47
+ ...(!options.runId
48
+ ? {
49
+ correlation_id: trimTo(`opencode:${options.request.sessionID}`, 120),
50
+ source_client: 'opencode',
51
+ }
52
+ : { source_client: 'opencode' }),
53
+ ...(options.workstreamId ? { workstream_id: options.workstreamId } : {}),
54
+ idempotency_key: trimTo(`opencode:${options.request.sessionID}:${options.request.id}:${questionIndex}`, 120),
55
+ question: question.question,
56
+ context: [
57
+ question.header,
58
+ options.request.questions.length > 1
59
+ ? `Question ${questionIndex + 1} of ${options.request.questions.length}. OpenCode resumes after every answer arrives.`
60
+ : null,
61
+ ]
62
+ .filter(Boolean)
63
+ .join('\n\n'),
64
+ ...(optionRecords.length ? { options: optionRecords } : {}),
65
+ blocking: true,
66
+ attention_kind: 'question',
67
+ response_mode: question.multiple
68
+ ? 'multi_select'
69
+ : optionRecords.length
70
+ ? 'single_select'
71
+ : 'free_text',
72
+ source_tool: 'question.asked',
73
+ source_session_id: options.request.sessionID,
74
+ source_event_id: trimTo(`${options.request.id}:${questionIndex}`, 255),
75
+ impact_if_delayed: 'The OpenCode session remains paused at its native question until every answer is returned.',
76
+ recommended_action: 'Answer here to continue the same OpenCode session.',
77
+ continuation: {
78
+ strategy: 'reply_in_place',
79
+ session_handle: options.request.sessionID,
80
+ tool_call_id: options.request.tool?.callID ?? options.request.id,
81
+ capability_version: 'opencode-question-v1',
82
+ },
83
+ metadata: {
84
+ opencode: {
85
+ request_id: options.request.id,
86
+ message_id: options.request.tool?.messageID ?? null,
87
+ call_id: options.request.tool?.callID ?? null,
88
+ question_index: questionIndex,
89
+ question_count: options.request.questions.length,
90
+ },
91
+ },
92
+ }, options.signal);
93
+ const id = string(payload.decision_id);
94
+ if (!id)
95
+ throw new Error('OrgX attention response did not include a decision id');
96
+ created.push({ id, question, optionIds });
97
+ options.onCreated?.(created.map((item) => item.id));
98
+ }
99
+ const answers = await Promise.all(created.map(async (item) => {
100
+ const payload = await pollAttention({
101
+ request,
102
+ baseUrl,
103
+ apiKey: options.apiKey,
104
+ attentionId: item.id,
105
+ pollIntervalMs: options.pollIntervalMs ?? 2_000,
106
+ maxWaitMs: options.maxWaitMs ?? 86_400_000,
107
+ signal: options.signal,
108
+ });
109
+ return normalizeAnswer(payload.question, item.optionIds);
110
+ }));
111
+ await acknowledgeAll(request, baseUrl, options.apiKey, created, 'resuming', {
112
+ session_handle: options.request.sessionID,
113
+ detail: 'Returning every owner answer to the native OpenCode question.',
114
+ });
115
+ try {
116
+ await options.reply(answers);
117
+ }
118
+ catch (error) {
119
+ await acknowledgeAll(request, baseUrl, options.apiKey, created, 'resume_failed', {
120
+ session_handle: options.request.sessionID,
121
+ detail: error instanceof Error ? error.message : String(error),
122
+ });
123
+ throw error;
124
+ }
125
+ await acknowledgeAll(request, baseUrl, options.apiKey, created, 'resumed', {
126
+ session_handle: options.request.sessionID,
127
+ detail: 'OpenCode accepted the answers in the same session.',
128
+ });
129
+ }
130
+ async function pollAttention(input) {
131
+ const deadline = Date.now() + input.maxWaitMs;
132
+ while (Date.now() < deadline) {
133
+ throwIfAborted(input.signal);
134
+ const payload = await requestJson(input.request, `${input.baseUrl}/api/client/live/attention/${encodeURIComponent(input.attentionId)}`, input.apiKey, undefined, input.signal, 'GET');
135
+ const question = asRecord(payload.question);
136
+ if (question?.resolved === true)
137
+ return payload;
138
+ await wait(input.pollIntervalMs, input.signal);
139
+ }
140
+ throw new Error(`OpenCode attention timed out after ${input.maxWaitMs}ms`);
141
+ }
142
+ async function acknowledgeAll(request, baseUrl, apiKey, items, state, detail) {
143
+ await Promise.all(items.map((item) => requestJson(request, `${baseUrl}/api/client/live/attention/${encodeURIComponent(item.id)}`, apiKey, {
144
+ state,
145
+ idempotency_key: `opencode:${item.id}:${state}`,
146
+ ...detail,
147
+ })));
148
+ }
149
+ async function requestJson(request, url, apiKey, body, signal, method = 'POST') {
150
+ const response = await request(url, {
151
+ method,
152
+ headers: {
153
+ Authorization: `Bearer ${apiKey}`,
154
+ 'Content-Type': 'application/json',
155
+ },
156
+ ...(body === undefined ? {} : { body: JSON.stringify(body) }),
157
+ signal,
158
+ });
159
+ const payload = (await response.json().catch(() => ({})));
160
+ if (!response.ok) {
161
+ throw new Error(`OrgX attention request failed (${response.status}): ${string(payload.error) ?? 'unknown error'}`);
162
+ }
163
+ return payload;
164
+ }
165
+ function normalizeQuestion(value) {
166
+ const record = asRecord(value);
167
+ const question = string(record?.question);
168
+ if (!record || !question)
169
+ return null;
170
+ const options = Array.isArray(record.options)
171
+ ? record.options
172
+ .map((option) => {
173
+ const item = asRecord(option);
174
+ const label = string(item?.label);
175
+ return label
176
+ ? { label, ...(string(item?.description) ? { description: string(item?.description) } : {}) }
177
+ : null;
178
+ })
179
+ .filter(Boolean)
180
+ : [];
181
+ return {
182
+ question,
183
+ ...(string(record.header) ? { header: string(record.header) } : {}),
184
+ ...(options.length ? { options: options } : {}),
185
+ ...(record.multiple === true ? { multiple: true } : {}),
186
+ };
187
+ }
188
+ function normalizeAnswer(value, optionIds) {
189
+ const question = asRecord(value);
190
+ const resolution = asRecord(question?.resolution_context);
191
+ const raw = question?.answer ??
192
+ resolution?.selected_option_ids ??
193
+ resolution?.option_ids ??
194
+ resolution?.answer ??
195
+ resolution?.note ??
196
+ '';
197
+ const values = Array.isArray(raw) ? raw : [raw];
198
+ return values
199
+ .filter((item) => item != null && String(item).trim())
200
+ .map((item) => optionIds.get(String(item)) ?? String(item));
201
+ }
202
+ function asRecord(value) {
203
+ return value && typeof value === 'object' && !Array.isArray(value)
204
+ ? value
205
+ : null;
206
+ }
207
+ function string(value) {
208
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
209
+ }
210
+ function trimTo(value, max) {
211
+ return value.length <= max ? value : value.slice(value.length - max);
212
+ }
213
+ function throwIfAborted(signal) {
214
+ if (signal?.aborted)
215
+ throw signal.reason ?? new Error('OpenCode attention was cancelled');
216
+ }
217
+ function wait(ms, signal) {
218
+ if (ms <= 0)
219
+ return Promise.resolve();
220
+ return new Promise((resolve, reject) => {
221
+ const timer = setTimeout(resolve, ms);
222
+ if (!signal)
223
+ return;
224
+ signal.addEventListener('abort', () => {
225
+ clearTimeout(timer);
226
+ reject(signal.reason ?? new Error('OpenCode attention was cancelled'));
227
+ }, { once: true });
228
+ });
229
+ }
230
+ //# sourceMappingURL=attentionBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attentionBridge.js","sourceRoot":"","sources":["../src/attentionBridge.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAI/D,KAAK,SAAS,GAAG,CAAC,IAAI,EAAE,gBAAgB,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAClE,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAC9C,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAEtD,MAAM,MAAM,+BAA+B,GAAG;IAC5C,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,wBAAwB,CACtC,IAAI,GAAE,+BAAoC,GACzC,MAAM,CA4CR;AAYD,eAAO,MAAM,kBAAkB,QAA6B,CAAC;AAC7D,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGlD,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAQ/D,KAAK,SAAS,GAAG,CAAC,IAAI,EAAE,gBAAgB,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAClE,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAC9C,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAEtD,MAAM,MAAM,+BAA+B,GAAG;IAC5C,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,wBAAwB,CACtC,IAAI,GAAE,+BAAoC,GACzC,MAAM,CA+FR;AAYD,eAAO,MAAM,kBAAkB,QAA6B,CAAC;AAC7D,eAAe,kBAAkB,CAAC"}
package/dist/plugin.js CHANGED
@@ -1,11 +1,15 @@
1
+ import { createOpencodeClient } from '@opencode-ai/sdk/v2';
1
2
  import { hydrateContextPack } from './contextPackHydration.js';
2
3
  import { capturePluginException } from './sentry.js';
4
+ import { bridgeOpenCodeQuestions, parseQuestionRequest, } from './attentionBridge.js';
3
5
  export function createOrgXOpenCodePlugin(opts = {}) {
4
6
  const start = opts.startPeer ?? defaultStartPeer;
5
7
  const env = opts.env ?? process.env;
6
8
  const logger = opts.logger ?? console;
7
9
  let peer = null;
8
10
  let warnedMissingConfig = false;
11
+ let warnedMissingAttentionConfig = false;
12
+ const activeAttention = new Set();
9
13
  async function startIfConfigured() {
10
14
  if (peer)
11
15
  return;
@@ -30,13 +34,54 @@ export function createOrgXOpenCodePlugin(opts = {}) {
30
34
  logger.error('[orgx-opencode-plugin] failed to start peer', formatError(err));
31
35
  }
32
36
  }
33
- return async () => ({
37
+ return async (input) => ({
34
38
  event: async ({ event }) => {
35
39
  if (event.type === 'server.connected') {
36
40
  await startIfConfigured();
37
41
  // M adapter: hydrate the context pack (best-effort, never throws).
38
42
  void hydrateContextPack(env);
39
43
  }
44
+ if (env.ORGX_REMOTE_ATTENTION !== '1')
45
+ return;
46
+ const questionRequest = parseQuestionRequest(event);
47
+ if (!questionRequest || activeAttention.has(questionRequest.id))
48
+ return;
49
+ const apiKey = env.ORGX_API_KEY;
50
+ const initiativeId = env.ORGX_INITIATIVE_ID;
51
+ if (!apiKey || !initiativeId) {
52
+ if (!warnedMissingAttentionConfig) {
53
+ logger.warn('[orgx-opencode-plugin] remote attention requires ORGX_API_KEY and ORGX_INITIATIVE_ID');
54
+ warnedMissingAttentionConfig = true;
55
+ }
56
+ return;
57
+ }
58
+ activeAttention.add(questionRequest.id);
59
+ const nativeClient = createOpencodeClient({
60
+ baseUrl: input.serverUrl.toString(),
61
+ directory: input.directory,
62
+ });
63
+ void bridgeOpenCodeQuestions({
64
+ request: questionRequest,
65
+ apiKey,
66
+ initiativeId,
67
+ runId: env.ORGX_RUN_ID,
68
+ workstreamId: env.ORGX_WORKSTREAM_ID,
69
+ baseUrl: env.ORGX_BASE_URL,
70
+ reply: async (answers) => {
71
+ await nativeClient.question.reply({
72
+ requestID: questionRequest.id,
73
+ answers,
74
+ });
75
+ },
76
+ })
77
+ .then(() => {
78
+ logger.log(`[orgx-opencode-plugin] resumed native question ${questionRequest.id}`);
79
+ })
80
+ .catch((error) => {
81
+ capturePluginException(error, { stage: 'native_attention_bridge' });
82
+ logger.error('[orgx-opencode-plugin] could not resume native question', formatError(error));
83
+ })
84
+ .finally(() => activeAttention.delete(questionRequest.id));
40
85
  },
41
86
  });
42
87
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAYrD,MAAM,UAAU,wBAAwB,CACtC,OAAwC,EAAE;IAE1C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;IACtC,IAAI,IAAI,GAAgC,IAAI,CAAC;IAC7C,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAEhC,KAAK,UAAU,iBAAiB;QAC9B,IAAI,IAAI;YAAE,OAAO;QAEjB,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC;QAChC,MAAM,WAAW,GAAG,GAAG,CAAC,iBAAiB,CAAC;QAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC;QAElC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAC5B,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CACT,6GAA6G,CAC9G,CAAC;gBACF,mBAAmB,GAAG,IAAI,CAAC;YAC7B,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC;YACX,MAAM,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,IAAI,CAAC;YACZ,sBAAsB,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;YAC9D,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC;QAClB,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAgC,EAAE,EAAE;YACvD,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACtC,MAAM,iBAAiB,EAAE,CAAC;gBAC1B,mEAAmE;gBACnE,KAAK,kBAAkB,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,IAAsB;IACpD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAChD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,WAAW,CAAC,GAAY;IAC/B,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,wBAAwB,EAAE,CAAC;AAC7D,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@useorgx/orgx-opencode-plugin",
3
- "version": "0.1.0-alpha.7",
3
+ "version": "0.1.0-alpha.8",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "description": "OrgX plugin peer for OpenCode with task dispatch, execution receipts, deviations, and passive Work Graph reconciliation events.",
7
+ "description": "OrgX plugin peer for OpenCode with task dispatch, resumable native questions, execution receipts, deviations, and passive Work Graph reconciliation events.",
8
8
  "type": "module",
9
9
  "main": "dist/index.js",
10
10
  "module": "dist/index.js",
@@ -34,11 +34,12 @@
34
34
  "start": "node dist/cli.js"
35
35
  },
36
36
  "dependencies": {
37
+ "@opencode-ai/sdk": "^1.18.2",
37
38
  "@sentry/node": "10.65.0",
38
39
  "@useorgx/orgx-gateway-sdk": "github:useorgx/orgx-gateway-sdk#40871edeb9b92eaf4403c0ba7270a74204ba425f"
39
40
  },
40
41
  "devDependencies": {
41
- "@opencode-ai/plugin": "^1.15.7",
42
+ "@opencode-ai/plugin": "^1.18.2",
42
43
  "@types/node": "^22.0.0",
43
44
  "typescript": "^5.4.0",
44
45
  "vitest": "^2.0.0"
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "plugin_name": "@useorgx/orgx-opencode-plugin",
3
- "version": "0.1.0-alpha.7",
3
+ "version": "0.1.0-alpha.8",
4
4
  "manifest_fingerprint": "",
5
5
  "signature": "",
6
6
  "capabilities": [
7
7
  "gateway:drive",
8
8
  "plugin:heartbeat",
9
9
  "plugin:runtime_hooks",
10
- "work_graph:reconcile"
10
+ "work_graph:reconcile",
11
+ "attention:reply_in_place"
11
12
  ],
12
13
  "driver_ids": ["opencode"],
13
14
  "notes": "fingerprint + signature are populated by the npm prepublish step; the dev build ships unsigned and gets 'degraded' status from the server."