@useorgx/orgx-opencode-plugin 0.1.0-alpha.7 → 0.1.0-alpha.9
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 +19 -0
- package/dist/attentionBridge.d.ts +38 -0
- package/dist/attentionBridge.d.ts.map +1 -0
- package/dist/attentionBridge.js +230 -0
- package/dist/attentionBridge.js.map +1 -0
- package/dist/childProcessEnv.d.ts +5 -0
- package/dist/childProcessEnv.d.ts.map +1 -0
- package/dist/childProcessEnv.js +17 -0
- package/dist/childProcessEnv.js.map +1 -0
- package/dist/cli.js +3 -2
- package/dist/cli.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +48 -3
- package/dist/plugin.js.map +1 -1
- package/package.json +5 -3
- package/plugin.manifest.json +3 -2
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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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type ProcessEnv = Record<string, string | undefined>;
|
|
2
|
+
export declare const GATEWAY_SECRET_ENV_KEYS: readonly ["ORGX_API_KEY", "ORGX_GATEWAY_KEY"];
|
|
3
|
+
export declare function captureGatewayCredential(env: ProcessEnv): string | undefined;
|
|
4
|
+
export declare function sanitizedChildProcessEnv(base: ProcessEnv, overrides?: ProcessEnv): ProcessEnv;
|
|
5
|
+
//# sourceMappingURL=childProcessEnv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"childProcessEnv.d.ts","sourceRoot":"","sources":["../src/childProcessEnv.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAE5D,eAAO,MAAM,uBAAuB,+CAG1B,CAAC;AAEX,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAM5E;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,UAAU,EAChB,SAAS,GAAE,UAAe,GACzB,UAAU,CAIZ"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const GATEWAY_SECRET_ENV_KEYS = [
|
|
2
|
+
'ORGX_API_KEY',
|
|
3
|
+
'ORGX_GATEWAY_KEY',
|
|
4
|
+
];
|
|
5
|
+
export function captureGatewayCredential(env) {
|
|
6
|
+
const credential = env.ORGX_API_KEY?.trim() || env.ORGX_GATEWAY_KEY?.trim() || undefined;
|
|
7
|
+
for (const key of GATEWAY_SECRET_ENV_KEYS)
|
|
8
|
+
delete env[key];
|
|
9
|
+
return credential;
|
|
10
|
+
}
|
|
11
|
+
export function sanitizedChildProcessEnv(base, overrides = {}) {
|
|
12
|
+
const childEnv = { ...base, ...overrides };
|
|
13
|
+
for (const key of GATEWAY_SECRET_ENV_KEYS)
|
|
14
|
+
delete childEnv[key];
|
|
15
|
+
return childEnv;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=childProcessEnv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"childProcessEnv.js","sourceRoot":"","sources":["../src/childProcessEnv.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,cAAc;IACd,kBAAkB;CACV,CAAC;AAEX,MAAM,UAAU,wBAAwB,CAAC,GAAe;IACtD,MAAM,UAAU,GACd,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAExE,KAAK,MAAM,GAAG,IAAI,uBAAuB;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3D,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,IAAgB,EAChB,YAAwB,EAAE;IAE1B,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,uBAAuB;QAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChE,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -6,13 +6,14 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { startPeer } from './peer.js';
|
|
8
8
|
import { captureFatalPluginException } from './sentry.js';
|
|
9
|
+
import { captureGatewayCredential } from './childProcessEnv.js';
|
|
9
10
|
async function main() {
|
|
10
|
-
const apiKey = process.env
|
|
11
|
+
const apiKey = captureGatewayCredential(process.env);
|
|
11
12
|
const workspaceId = process.env.ORGX_WORKSPACE_ID;
|
|
12
13
|
const baseUrl = process.env.ORGX_BASE_URL ?? 'https://useorgx.com';
|
|
13
14
|
if (!apiKey || !workspaceId) {
|
|
14
15
|
// eslint-disable-next-line no-console
|
|
15
|
-
console.error('Missing ORGX_API_KEY and/or ORGX_WORKSPACE_ID. Export both and retry.');
|
|
16
|
+
console.error('Missing ORGX_API_KEY (or ORGX_GATEWAY_KEY) and/or ORGX_WORKSPACE_ID. Export both and retry.');
|
|
16
17
|
process.exit(2);
|
|
17
18
|
}
|
|
18
19
|
const peer = await startPeer({ apiKey, workspaceId, baseUrl });
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,wBAAwB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,qBAAqB,CAAC;IAEnE,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,sCAAsC;QACtC,OAAO,CAAC,KAAK,CACX,6FAA6F,CAC9F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IAE/D,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChC,sCAAsC;IACtC,OAAO,CAAC,GAAG,CACT,oGAAoG,CACrG,CAAC;AACJ,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACzB,MAAM,2BAA2B,CAAC,GAAG,CAAC,CAAC;IACvC,sCAAsC;IACtC,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -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;
|
|
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;AAS/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,CA8FR;AAYD,eAAO,MAAM,kBAAkB,QAA6B,CAAC;AAC7D,eAAe,kBAAkB,CAAC"}
|
package/dist/plugin.js
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
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';
|
|
5
|
+
import { captureGatewayCredential } from './childProcessEnv.js';
|
|
3
6
|
export function createOrgXOpenCodePlugin(opts = {}) {
|
|
4
7
|
const start = opts.startPeer ?? defaultStartPeer;
|
|
5
8
|
const env = opts.env ?? process.env;
|
|
9
|
+
const apiKey = captureGatewayCredential(env);
|
|
6
10
|
const logger = opts.logger ?? console;
|
|
7
11
|
let peer = null;
|
|
8
12
|
let warnedMissingConfig = false;
|
|
13
|
+
let warnedMissingAttentionConfig = false;
|
|
14
|
+
const activeAttention = new Set();
|
|
9
15
|
async function startIfConfigured() {
|
|
10
16
|
if (peer)
|
|
11
17
|
return;
|
|
12
|
-
const apiKey = env.ORGX_API_KEY;
|
|
13
18
|
const workspaceId = env.ORGX_WORKSPACE_ID;
|
|
14
19
|
const baseUrl = env.ORGX_BASE_URL;
|
|
15
20
|
if (!apiKey || !workspaceId) {
|
|
@@ -30,13 +35,53 @@ export function createOrgXOpenCodePlugin(opts = {}) {
|
|
|
30
35
|
logger.error('[orgx-opencode-plugin] failed to start peer', formatError(err));
|
|
31
36
|
}
|
|
32
37
|
}
|
|
33
|
-
return async () => ({
|
|
38
|
+
return async (input) => ({
|
|
34
39
|
event: async ({ event }) => {
|
|
35
40
|
if (event.type === 'server.connected') {
|
|
36
41
|
await startIfConfigured();
|
|
37
42
|
// M adapter: hydrate the context pack (best-effort, never throws).
|
|
38
|
-
void hydrateContextPack(env);
|
|
43
|
+
void hydrateContextPack({ ...env, ORGX_API_KEY: apiKey });
|
|
39
44
|
}
|
|
45
|
+
if (env.ORGX_REMOTE_ATTENTION !== '1')
|
|
46
|
+
return;
|
|
47
|
+
const questionRequest = parseQuestionRequest(event);
|
|
48
|
+
if (!questionRequest || activeAttention.has(questionRequest.id))
|
|
49
|
+
return;
|
|
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
|
}
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"
|
|
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.
|
|
3
|
+
"version": "0.1.0-alpha.9",
|
|
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",
|
|
@@ -30,15 +30,17 @@
|
|
|
30
30
|
"build": "tsc",
|
|
31
31
|
"type-check": "tsc --noEmit",
|
|
32
32
|
"test": "vitest run && node --test scripts/*.node-test.mjs",
|
|
33
|
+
"pack": "mkdir -p artifacts && npm pack --pack-destination artifacts",
|
|
33
34
|
"prepublishOnly": "npm run type-check && npm test && npm run build",
|
|
34
35
|
"start": "node dist/cli.js"
|
|
35
36
|
},
|
|
36
37
|
"dependencies": {
|
|
38
|
+
"@opencode-ai/sdk": "^1.18.2",
|
|
37
39
|
"@sentry/node": "10.65.0",
|
|
38
40
|
"@useorgx/orgx-gateway-sdk": "github:useorgx/orgx-gateway-sdk#40871edeb9b92eaf4403c0ba7270a74204ba425f"
|
|
39
41
|
},
|
|
40
42
|
"devDependencies": {
|
|
41
|
-
"@opencode-ai/plugin": "^1.
|
|
43
|
+
"@opencode-ai/plugin": "^1.18.2",
|
|
42
44
|
"@types/node": "^22.0.0",
|
|
43
45
|
"typescript": "^5.4.0",
|
|
44
46
|
"vitest": "^2.0.0"
|
package/plugin.manifest.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"plugin_name": "@useorgx/orgx-opencode-plugin",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.9",
|
|
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."
|