@useorgx/orgx-opencode-plugin 0.1.0-alpha.1 → 0.1.0-alpha.11

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 (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +126 -3
  3. package/dist/OpenCodeDriver.d.ts +5 -2
  4. package/dist/OpenCodeDriver.d.ts.map +1 -1
  5. package/dist/OpenCodeDriver.js +12 -1
  6. package/dist/OpenCodeDriver.js.map +1 -1
  7. package/dist/attentionBridge.d.ts +38 -0
  8. package/dist/attentionBridge.d.ts.map +1 -0
  9. package/dist/attentionBridge.js +230 -0
  10. package/dist/attentionBridge.js.map +1 -0
  11. package/dist/childProcessEnv.d.ts +5 -0
  12. package/dist/childProcessEnv.d.ts.map +1 -0
  13. package/dist/childProcessEnv.js +17 -0
  14. package/dist/childProcessEnv.js.map +1 -0
  15. package/dist/cli.js +6 -3
  16. package/dist/cli.js.map +1 -1
  17. package/dist/contextPackHydration.d.ts +14 -0
  18. package/dist/contextPackHydration.d.ts.map +1 -0
  19. package/dist/contextPackHydration.js +57 -0
  20. package/dist/contextPackHydration.js.map +1 -0
  21. package/dist/continuityHealth.d.ts +48 -0
  22. package/dist/continuityHealth.d.ts.map +1 -0
  23. package/dist/continuityHealth.js +118 -0
  24. package/dist/continuityHealth.js.map +1 -0
  25. package/dist/index.d.ts +6 -3
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +8 -3
  28. package/dist/index.js.map +1 -1
  29. package/dist/peer.d.ts +14 -0
  30. package/dist/peer.d.ts.map +1 -1
  31. package/dist/peer.js +142 -13
  32. package/dist/peer.js.map +1 -1
  33. package/dist/plugin.d.ts +17 -0
  34. package/dist/plugin.d.ts.map +1 -0
  35. package/dist/plugin.js +124 -0
  36. package/dist/plugin.js.map +1 -0
  37. package/dist/sentry.d.ts +4 -0
  38. package/dist/sentry.d.ts.map +1 -0
  39. package/dist/sentry.js +97 -0
  40. package/dist/sentry.js.map +1 -0
  41. package/dist/sessionSummaryBridge.d.ts +20 -0
  42. package/dist/sessionSummaryBridge.d.ts.map +1 -0
  43. package/dist/sessionSummaryBridge.js +125 -0
  44. package/dist/sessionSummaryBridge.js.map +1 -0
  45. package/dist/v2Canary.d.ts +13 -0
  46. package/dist/v2Canary.d.ts.map +1 -0
  47. package/dist/v2Canary.js +27 -0
  48. package/dist/v2Canary.js.map +1 -0
  49. package/dist/workGraphOutbox.js +2 -2
  50. package/dist/workGraphOutbox.js.map +1 -1
  51. package/dist/workGraphReplay.d.ts +9 -0
  52. package/dist/workGraphReplay.d.ts.map +1 -0
  53. package/dist/workGraphReplay.js +41 -0
  54. package/dist/workGraphReplay.js.map +1 -0
  55. package/package.json +30 -9
  56. package/plugin.manifest.json +8 -2
  57. package/scripts/orgx-work-graph-reconcile.mjs +994 -0
  58. package/scripts/orgx-work-graph-reconcile.node-test.mjs +131 -0
package/dist/cli.js CHANGED
@@ -5,13 +5,15 @@
5
5
  * ORGX_API_KEY=oxk_... ORGX_WORKSPACE_ID=... orgx-opencode-plugin
6
6
  */
7
7
  import { startPeer } from './peer.js';
8
+ import { captureFatalPluginException } from './sentry.js';
9
+ import { captureGatewayCredential } from './childProcessEnv.js';
8
10
  async function main() {
9
- const apiKey = process.env.ORGX_API_KEY;
11
+ const apiKey = captureGatewayCredential(process.env);
10
12
  const workspaceId = process.env.ORGX_WORKSPACE_ID;
11
13
  const baseUrl = process.env.ORGX_BASE_URL ?? 'https://useorgx.com';
12
14
  if (!apiKey || !workspaceId) {
13
15
  // eslint-disable-next-line no-console
14
- 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.');
15
17
  process.exit(2);
16
18
  }
17
19
  const peer = await startPeer({ apiKey, workspaceId, baseUrl });
@@ -24,7 +26,8 @@ async function main() {
24
26
  // eslint-disable-next-line no-console
25
27
  console.log('[orgx-opencode-plugin] peer running — ctrl-c to stop. Dispatches will arrive when OrgX sends them.');
26
28
  }
27
- main().catch((err) => {
29
+ main().catch(async (err) => {
30
+ await captureFatalPluginException(err);
28
31
  // eslint-disable-next-line no-console
29
32
  console.error('[orgx-opencode-plugin] fatal', err);
30
33
  process.exit(1);
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;AAEtC,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACxC,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,uEAAuE,CACxE,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,CAAC,GAAG,EAAE,EAAE;IACnB,sCAAsC;IACtC,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,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"}
@@ -0,0 +1,14 @@
1
+ type Env = Record<string, string | undefined>;
2
+ export interface ContextPackConfig {
3
+ apiKey: string;
4
+ baseUrl: string;
5
+ initiativeId: string;
6
+ }
7
+ export declare function resolveContextPackConfig(env: Env): ContextPackConfig | null;
8
+ export declare function buildContextPackRequest(config: ContextPackConfig): {
9
+ url: string;
10
+ init: RequestInit;
11
+ };
12
+ export declare function hydrateContextPack(env?: Env): Promise<boolean>;
13
+ export {};
14
+ //# sourceMappingURL=contextPackHydration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextPackHydration.d.ts","sourceRoot":"","sources":["../src/contextPackHydration.ts"],"names":[],"mappings":"AAYA,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,GAAG,GAAG,iBAAiB,GAAG,IAAI,CAM3E;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,WAAW,CAAC;CACnB,CAYA;AAED,wBAAsB,kBAAkB,CAAC,GAAG,GAAE,GAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAuBjF"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Context-pack hydration (M adapter — OpenCode).
3
+ *
4
+ * On session connect, fetches the compiled AgentContextPack for the active
5
+ * initiative (POST /api/client/context-pack) and writes .opencode/
6
+ * orgx-context-pack.json (0600) so the agent starts briefed. Best-effort — never
7
+ * throws. The MCP backbone also returns the pack on first orgx_inspect call, so
8
+ * hydration is guaranteed either way.
9
+ */
10
+ import { mkdir, writeFile, chmod } from 'node:fs/promises';
11
+ import { join } from 'node:path';
12
+ export function resolveContextPackConfig(env) {
13
+ const apiKey = env.ORGX_API_KEY?.trim();
14
+ const baseUrl = env.ORGX_BASE_URL?.trim() || 'https://useorgx.com';
15
+ const initiativeId = env.ORGX_INITIATIVE_ID?.trim();
16
+ if (!apiKey || !initiativeId)
17
+ return null;
18
+ return { apiKey, baseUrl, initiativeId };
19
+ }
20
+ export function buildContextPackRequest(config) {
21
+ return {
22
+ url: `${config.baseUrl.replace(/\/$/, '')}/api/client/context-pack`,
23
+ init: {
24
+ method: 'POST',
25
+ headers: {
26
+ 'content-type': 'application/json',
27
+ authorization: `Bearer ${config.apiKey}`,
28
+ },
29
+ body: JSON.stringify({ initiative_id: config.initiativeId }),
30
+ },
31
+ };
32
+ }
33
+ export async function hydrateContextPack(env = process.env) {
34
+ try {
35
+ const config = resolveContextPackConfig(env);
36
+ if (!config)
37
+ return false;
38
+ const { url, init } = buildContextPackRequest(config);
39
+ const res = await fetch(url, init);
40
+ if (!res.ok)
41
+ return false;
42
+ const payload = (await res.json().catch(() => null));
43
+ const data = payload?.data ?? null;
44
+ if (!data)
45
+ return false;
46
+ const dir = join(process.cwd(), '.opencode');
47
+ await mkdir(dir, { recursive: true });
48
+ const out = join(dir, 'orgx-context-pack.json');
49
+ await writeFile(out, JSON.stringify({ fetchedAt: new Date().toISOString(), data }, null, 2), { mode: 0o600 });
50
+ await chmod(out, 0o600).catch(() => { });
51
+ return true;
52
+ }
53
+ catch {
54
+ return false;
55
+ }
56
+ }
57
+ //# sourceMappingURL=contextPackHydration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextPackHydration.js","sourceRoot":"","sources":["../src/contextPackHydration.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAUjC,MAAM,UAAU,wBAAwB,CAAC,GAAQ;IAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,qBAAqB,CAAC;IACnE,MAAM,YAAY,GAAG,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAyB;IAI/D,OAAO;QACL,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,0BAA0B;QACnE,IAAI,EAAE;YACJ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;aACzC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;SAC7D;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAW,OAAO,CAAC,GAAG;IAC7D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QAC1B,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAA8B,CAAC;QAClF,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC;QACnC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;QAC7C,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC;QAChD,MAAM,SAAS,CACb,GAAG,EACH,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EACtE,EAAE,IAAI,EAAE,KAAK,EAAE,CAChB,CAAC;QACF,MAAM,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,48 @@
1
+ export type ContinuityOutboxHealth = {
2
+ state: 'ready' | 'pending' | 'degraded';
3
+ pending: number;
4
+ dead_letters: number;
5
+ last_replay_at: string | null;
6
+ };
7
+ export declare function inspectContinuityOutbox({ outboxPath, reportPath, }?: {
8
+ outboxPath?: string;
9
+ reportPath?: string;
10
+ }): Promise<ContinuityOutboxHealth>;
11
+ export declare function buildPluginContinuityHealth({ version, authState, endpoint, outbox, }: {
12
+ version: string;
13
+ authState: string;
14
+ endpoint?: string;
15
+ outbox?: ContinuityOutboxHealth;
16
+ }): Promise<{
17
+ schema_version: string;
18
+ endpoint: string;
19
+ source_client: string;
20
+ auth_state: string;
21
+ release: {
22
+ installed: string;
23
+ source: string;
24
+ deployed: string;
25
+ };
26
+ hooks: {
27
+ reported: number;
28
+ expected: number;
29
+ terminal_passive: boolean;
30
+ events: string[];
31
+ };
32
+ outbox: ContinuityOutboxHealth;
33
+ capture: {
34
+ adapter: string;
35
+ terminal_run_event: string;
36
+ terminal_session_event: string;
37
+ raw_content_included: boolean;
38
+ };
39
+ capabilities: {
40
+ profile: string;
41
+ profile_tools: number;
42
+ manifest_tools: number;
43
+ inspectable_entities: number;
44
+ visible_entities: number;
45
+ };
46
+ last_receipt_at: string | null;
47
+ }>;
48
+ //# sourceMappingURL=continuityHealth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continuityHealth.d.ts","sourceRoot":"","sources":["../src/continuityHealth.ts"],"names":[],"mappings":"AAsBA,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAkBF,wBAAsB,uBAAuB,CAAC,EAC5C,UAAkE,EAClE,UAC8D,GAC/D,GAAE;IACD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAmDvC;AAED,wBAAsB,2BAA2B,CAAC,EAChD,OAAO,EACP,SAAS,EACT,QAAoE,EACpE,MAAM,GACP,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,sBAAsB,CAAC;CACjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CA"}
@@ -0,0 +1,118 @@
1
+ import { readFile } from 'fs/promises';
2
+ import { homedir } from 'os';
3
+ import { join } from 'path';
4
+ const DEFAULT_OUTBOX = join(homedir(), '.config', 'useorgx', 'wizard', 'hooks', 'events.jsonl');
5
+ const DEFAULT_REPORT = join(homedir(), '.config', 'useorgx', 'wizard', 'hooks', 'reports', 'latest-work-graph-report.json');
6
+ async function readText(path) {
7
+ try {
8
+ return await readFile(path, 'utf8');
9
+ }
10
+ catch (error) {
11
+ if (error &&
12
+ typeof error === 'object' &&
13
+ 'code' in error &&
14
+ error.code === 'ENOENT') {
15
+ return null;
16
+ }
17
+ throw error;
18
+ }
19
+ }
20
+ export async function inspectContinuityOutbox({ outboxPath = process.env.ORGX_WIZARD_HOOK_OUTBOX ?? DEFAULT_OUTBOX, reportPath = process.env.ORGX_WIZARD_HOOK_REPORT_OUTPUT ?? DEFAULT_REPORT, } = {}) {
21
+ const [outboxText, reportText] = await Promise.all([
22
+ readText(outboxPath),
23
+ readText(reportPath),
24
+ ]);
25
+ const lines = (outboxText ?? '')
26
+ .split('\n')
27
+ .map((line) => line.trim())
28
+ .filter(Boolean)
29
+ .slice(-5000);
30
+ let validRecords = 0;
31
+ let deadLetters = 0;
32
+ for (const line of lines) {
33
+ try {
34
+ const parsed = JSON.parse(line);
35
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
36
+ validRecords += 1;
37
+ }
38
+ else {
39
+ deadLetters += 1;
40
+ }
41
+ }
42
+ catch {
43
+ deadLetters += 1;
44
+ }
45
+ }
46
+ let replayedRecords = 0;
47
+ let lastReplayAt = null;
48
+ if (reportText) {
49
+ try {
50
+ const report = JSON.parse(reportText);
51
+ if (report?.posted) {
52
+ replayedRecords = Number.isFinite(report.records_read)
53
+ ? Math.max(0, Math.round(report.records_read))
54
+ : 0;
55
+ lastReplayAt =
56
+ typeof report.report?.generated_at === 'string'
57
+ ? report.report.generated_at
58
+ : null;
59
+ }
60
+ }
61
+ catch {
62
+ deadLetters += 1;
63
+ }
64
+ }
65
+ const pending = Math.max(0, validRecords - replayedRecords);
66
+ return {
67
+ state: deadLetters > 0 ? 'degraded' : pending > 0 ? 'pending' : 'ready',
68
+ pending,
69
+ dead_letters: deadLetters,
70
+ last_replay_at: lastReplayAt,
71
+ };
72
+ }
73
+ export async function buildPluginContinuityHealth({ version, authState, endpoint = process.env.ORGX_MCP_URL ?? 'https://mcp.useorgx.com/mcp', outbox, }) {
74
+ const outboxHealth = outbox ?? (await inspectContinuityOutbox());
75
+ const hookEvents = [
76
+ 'session.created',
77
+ 'message.updated:user',
78
+ 'tool.execute.before',
79
+ 'tool.execute.after',
80
+ 'permission.asked',
81
+ 'session.idle',
82
+ 'session.error',
83
+ 'session.deleted',
84
+ ];
85
+ return {
86
+ schema_version: 'plugin-health.v1',
87
+ endpoint,
88
+ source_client: 'opencode',
89
+ auth_state: authState,
90
+ release: {
91
+ installed: version,
92
+ source: version,
93
+ deployed: version,
94
+ },
95
+ hooks: {
96
+ reported: hookEvents.length,
97
+ expected: hookEvents.length,
98
+ terminal_passive: true,
99
+ events: hookEvents,
100
+ },
101
+ outbox: outboxHealth,
102
+ capture: {
103
+ adapter: 'wizard_session_summary',
104
+ terminal_run_event: 'session.idle',
105
+ terminal_session_event: 'session.deleted',
106
+ raw_content_included: false,
107
+ },
108
+ capabilities: {
109
+ profile: 'opencode',
110
+ profile_tools: 33,
111
+ manifest_tools: 33,
112
+ inspectable_entities: 20,
113
+ visible_entities: 20,
114
+ },
115
+ last_receipt_at: outboxHealth.last_replay_at,
116
+ };
117
+ }
118
+ //# sourceMappingURL=continuityHealth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continuityHealth.js","sourceRoot":"","sources":["../src/continuityHealth.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,7 @@
1
- export { OpenCodeDriver, type OpenCodeDriverOptions } from './OpenCodeDriver';
2
- export { startPeer } from './peer';
3
- export { buildWorkGraphEventRecord, recordWorkGraphEvent, resolveWorkGraphOutboxPath, } from './workGraphOutbox';
1
+ export { OpenCodeDriver, type OpenCodeDriverOptions } from './OpenCodeDriver.js';
2
+ export { default, createOrgXOpenCodePlugin, OrgXOpenCodePlugin, type CreateOrgXOpenCodePluginOptions, } from './plugin.js';
3
+ export type { StartedPeer, StartPeerOptions } from './peer.js';
4
+ export { buildWorkGraphEventRecord, recordWorkGraphEvent, resolveWorkGraphOutboxPath, } from './workGraphOutbox.js';
5
+ export { inspectOpenCodeV2Canary } from './v2Canary.js';
6
+ export declare function startPeer(opts: import('./peer.js').StartPeerOptions): Promise<import('./peer.js').StartedPeer>;
4
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EACL,OAAO,EACP,wBAAwB,EACxB,kBAAkB,EAClB,KAAK,+BAA+B,GACrC,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD,wBAAsB,SAAS,CAC7B,IAAI,EAAE,OAAO,WAAW,EAAE,gBAAgB,GACzC,OAAO,CAAC,OAAO,WAAW,EAAE,WAAW,CAAC,CAG1C"}
package/dist/index.js CHANGED
@@ -1,4 +1,9 @@
1
- export { OpenCodeDriver } from './OpenCodeDriver';
2
- export { startPeer } from './peer';
3
- export { buildWorkGraphEventRecord, recordWorkGraphEvent, resolveWorkGraphOutboxPath, } from './workGraphOutbox';
1
+ export { OpenCodeDriver } from './OpenCodeDriver.js';
2
+ export { default, createOrgXOpenCodePlugin, OrgXOpenCodePlugin, } from './plugin.js';
3
+ export { buildWorkGraphEventRecord, recordWorkGraphEvent, resolveWorkGraphOutboxPath, } from './workGraphOutbox.js';
4
+ export { inspectOpenCodeV2Canary } from './v2Canary.js';
5
+ export async function startPeer(opts) {
6
+ const peer = await import('./peer.js');
7
+ return peer.startPeer(opts);
8
+ }
4
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA8B,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA8B,MAAM,qBAAqB,CAAC;AACjF,OAAO,EACL,OAAO,EACP,wBAAwB,EACxB,kBAAkB,GAEnB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAA0C;IAE1C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
package/dist/peer.d.ts CHANGED
@@ -12,6 +12,12 @@
12
12
  * });
13
13
  */
14
14
  import { type Driver } from '@useorgx/orgx-gateway-sdk';
15
+ import { type ContinuityOutboxHealth } from './continuityHealth.js';
16
+ export declare function summarizeTransportError(error: unknown): {
17
+ name: string;
18
+ message: string;
19
+ code?: string | number;
20
+ };
15
21
  export type StartPeerOptions = {
16
22
  apiKey: string;
17
23
  workspaceId: string;
@@ -23,6 +29,14 @@ export type StartPeerOptions = {
23
29
  skipHeartbeat?: boolean;
24
30
  /** Local Work Graph JSONL outbox path. Set false to disable. */
25
31
  workGraphOutboxPath?: string | false;
32
+ /** Stable installation identity used to join heartbeat observations. */
33
+ installationId?: string;
34
+ /** MCP endpoint advertised in Chronicle health. */
35
+ mcpEndpoint?: string;
36
+ /** Override local replay state for tests. */
37
+ continuityOutbox?: ContinuityOutboxHealth;
38
+ /** Disable terminal replay for tests or intentionally offline installs. */
39
+ autoReplayWorkGraph?: boolean;
26
40
  };
27
41
  export type StartedPeer = {
28
42
  stop: () => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"peer.d.ts","sourceRoot":"","sources":["../src/peer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAOpE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC;AAEF,wBAAsB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAuD5E"}
1
+ {"version":3,"file":"peer.d.ts","sourceRoot":"","sources":["../src/peer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAMpE,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,uBAAuB,CAAC;AAuB/B,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB,CAyBA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACrC,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,2EAA2E;IAC3E,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC;AAEF,wBAAsB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAiG5E"}
package/dist/peer.js CHANGED
@@ -15,52 +15,131 @@ import { PeerClient } from '@useorgx/orgx-gateway-sdk';
15
15
  import { readFile } from 'fs/promises';
16
16
  import { resolve } from 'path';
17
17
  import { fileURLToPath } from 'url';
18
- import { OpenCodeDriver } from './OpenCodeDriver';
18
+ import { OpenCodeDriver } from './OpenCodeDriver.js';
19
+ import { buildPluginContinuityHealth, } from './continuityHealth.js';
20
+ import { capturePluginException, initializePluginSentry, } from './sentry.js';
21
+ import { createWorkGraphReplay } from './workGraphReplay.js';
22
+ const PRESENCE_HEARTBEAT_MS = 20_000;
23
+ const LICENSE_HEARTBEAT_MS = 7 * 24 * 60 * 60 * 1000;
24
+ const PLUGIN_ID = 'orgx-opencode-plugin';
25
+ // Protocol v2 requires a canonical proof-bearing ExecutionResult. Keep the
26
+ // production peer on v1 until the driver can obtain that proof from OrgX.
27
+ const GATEWAY_PROTOCOL_VERSION = 1;
28
+ const MAX_TRANSPORT_LOG_LENGTH = 500;
29
+ function redactTransportText(value) {
30
+ return String(value)
31
+ .slice(0, MAX_TRANSPORT_LOG_LENGTH)
32
+ .replace(/\bBearer\s+[^\s,;]+/gi, 'Bearer [redacted]')
33
+ .replace(/\bbearer\.[A-Za-z0-9._~-]+/gi, 'bearer.[redacted]')
34
+ .replace(/\boxk_[A-Za-z0-9_-]+\b/g, 'oxk_[redacted]');
35
+ }
36
+ export function summarizeTransportError(error) {
37
+ const record = error !== null && typeof error === 'object'
38
+ ? error
39
+ : undefined;
40
+ const name = typeof record?.name === 'string' && record.name.trim()
41
+ ? redactTransportText(record.name)
42
+ : 'TransportError';
43
+ const message = typeof record?.message === 'string' && record.message.trim()
44
+ ? redactTransportText(record.message)
45
+ : typeof error === 'string' && error.trim()
46
+ ? redactTransportText(error)
47
+ : 'Gateway transport failed';
48
+ const code = record?.code;
49
+ return {
50
+ name,
51
+ message,
52
+ ...(typeof code === 'number' ||
53
+ (typeof code === 'string' && /^[A-Za-z0-9_-]{1,32}$/.test(code))
54
+ ? { code }
55
+ : {}),
56
+ };
57
+ }
19
58
  export async function startPeer(opts) {
20
59
  const baseUrl = opts.baseUrl ?? 'https://useorgx.com';
60
+ const manifest = await loadManifest();
61
+ initializePluginSentry(manifest.version);
62
+ const replayWorkGraph = opts.autoReplayWorkGraph === false
63
+ ? undefined
64
+ : createWorkGraphReplay({
65
+ apiKey: opts.apiKey,
66
+ baseUrl,
67
+ workspaceId: opts.workspaceId,
68
+ outboxPath: opts.workGraphOutboxPath,
69
+ });
21
70
  const driver = opts.driver ??
22
71
  new OpenCodeDriver({
23
72
  skillRules: async () => fetchSkillRules(baseUrl, opts),
24
73
  workGraphOutboxPath: opts.workGraphOutboxPath,
74
+ replayWorkGraph,
25
75
  });
26
- const manifest = await loadManifest();
76
+ let transportOnline = false;
77
+ let presenceTimer = null;
78
+ const heartbeatPresence = () => postPresenceHeartbeat(baseUrl, opts, manifest, driver, transportOnline);
27
79
  const client = new PeerClient({
28
80
  baseUrl: httpsToWss(baseUrl),
29
81
  apiKey: opts.apiKey,
30
82
  workspaceId: opts.workspaceId,
31
- pluginId: '@useorgx/orgx-opencode-plugin',
83
+ pluginId: PLUGIN_ID,
84
+ installationId: opts.installationId ?? defaultInstallationId(),
85
+ protocolVersion: GATEWAY_PROTOCOL_VERSION,
32
86
  drivers: [driver],
33
87
  onOpen: () => {
88
+ transportOnline = true;
34
89
  // eslint-disable-next-line no-console
35
90
  console.log('[orgx-opencode-plugin] connected');
91
+ void heartbeatPresence().catch((err) => {
92
+ // eslint-disable-next-line no-console
93
+ console.warn('[orgx-opencode-plugin] open heartbeat failed', err);
94
+ });
36
95
  },
37
96
  onClose: (code, reason) => {
97
+ transportOnline = false;
38
98
  // eslint-disable-next-line no-console
39
99
  console.warn('[orgx-opencode-plugin] closed', { code, reason });
40
100
  },
41
101
  onError: (err) => {
102
+ const safeError = summarizeTransportError(err);
103
+ capturePluginException(new Error(`${safeError.name}: ${safeError.message}`), {
104
+ stage: 'gateway_transport',
105
+ });
42
106
  // eslint-disable-next-line no-console
43
- console.error('[orgx-opencode-plugin] error', err);
107
+ console.error('[orgx-opencode-plugin] error', safeError);
44
108
  },
45
109
  });
46
110
  client.connect();
47
- let heartbeatTimer = null;
111
+ let licenseHeartbeatTimer = null;
48
112
  if (!opts.skipHeartbeat) {
49
- await postHeartbeat(baseUrl, opts, manifest).catch((err) => {
113
+ await heartbeatPresence().catch((err) => {
114
+ // eslint-disable-next-line no-console
115
+ console.warn('[orgx-opencode-plugin] initial presence heartbeat failed', err);
116
+ });
117
+ presenceTimer = setInterval(() => {
118
+ void heartbeatPresence().catch((err) => {
119
+ // eslint-disable-next-line no-console
120
+ console.warn('[orgx-opencode-plugin] presence heartbeat failed', err);
121
+ });
122
+ }, PRESENCE_HEARTBEAT_MS);
123
+ presenceTimer.unref?.();
124
+ await postLicenseHeartbeat(baseUrl, opts, manifest).catch((err) => {
50
125
  // eslint-disable-next-line no-console
51
- console.warn('[orgx-opencode-plugin] initial heartbeat failed', err);
126
+ console.warn('[orgx-opencode-plugin] initial license heartbeat failed', err);
52
127
  });
53
- heartbeatTimer = setInterval(() => {
54
- void postHeartbeat(baseUrl, opts, manifest).catch((err) => {
128
+ licenseHeartbeatTimer = setInterval(() => {
129
+ void postLicenseHeartbeat(baseUrl, opts, manifest).catch((err) => {
55
130
  // eslint-disable-next-line no-console
56
131
  console.warn('[orgx-opencode-plugin] weekly heartbeat failed', err);
57
132
  });
58
- }, 7 * 24 * 60 * 60 * 1000);
133
+ }, LICENSE_HEARTBEAT_MS);
134
+ licenseHeartbeatTimer.unref?.();
59
135
  }
60
136
  return {
61
137
  stop: async () => {
62
- if (heartbeatTimer)
63
- clearInterval(heartbeatTimer);
138
+ if (presenceTimer)
139
+ clearInterval(presenceTimer);
140
+ if (licenseHeartbeatTimer)
141
+ clearInterval(licenseHeartbeatTimer);
142
+ transportOnline = false;
64
143
  client.disconnect();
65
144
  },
66
145
  };
@@ -84,7 +163,54 @@ async function loadManifest() {
84
163
  };
85
164
  }
86
165
  }
87
- async function postHeartbeat(baseUrl, opts, manifest) {
166
+ async function postPresenceHeartbeat(baseUrl, opts, manifest, driver, transportOnline) {
167
+ const detected = await driver.detect();
168
+ const authenticated = detected.authenticated === true;
169
+ const authState = authenticated
170
+ ? 'authenticated'
171
+ : detected.installed
172
+ ? 'unauthenticated'
173
+ : 'unavailable';
174
+ const continuityHealth = await buildPluginContinuityHealth({
175
+ version: manifest.version,
176
+ authState,
177
+ endpoint: opts.mcpEndpoint,
178
+ outbox: opts.continuityOutbox,
179
+ });
180
+ const r = await fetch(`${baseUrl.replace(/\/$/, '')}/api/v1/gateway/heartbeat`, {
181
+ method: 'POST',
182
+ headers: {
183
+ 'Content-Type': 'application/json',
184
+ Authorization: `Bearer ${opts.apiKey}`,
185
+ },
186
+ body: JSON.stringify({
187
+ workspace_id: opts.workspaceId,
188
+ plugin_id: PLUGIN_ID,
189
+ installation_id: opts.installationId ?? defaultInstallationId(),
190
+ host_platform: process.platform,
191
+ drivers_installed: [driver.id],
192
+ gateway_version: manifest.version,
193
+ protocol_version: GATEWAY_PROTOCOL_VERSION,
194
+ plan_tier: null,
195
+ subscription_type: null,
196
+ subscription_active: authenticated,
197
+ metadata: {
198
+ runtime: 'peer',
199
+ transport_online: transportOnline,
200
+ runtime_online: true,
201
+ dispatch_ready: transportOnline && detected.installed === true && authenticated,
202
+ auth_status: authState,
203
+ auth_method: null,
204
+ probe_version: detected.version ?? null,
205
+ continuity_health: continuityHealth,
206
+ },
207
+ }),
208
+ });
209
+ if (!r.ok) {
210
+ throw new Error(`presence heartbeat ${r.status}`);
211
+ }
212
+ }
213
+ async function postLicenseHeartbeat(baseUrl, opts, manifest) {
88
214
  const r = await fetch(`${baseUrl.replace(/\/$/, '')}/api/v1/licenses/heartbeat`, {
89
215
  method: 'POST',
90
216
  headers: {
@@ -103,6 +229,9 @@ async function postHeartbeat(baseUrl, opts, manifest) {
103
229
  throw new Error(`heartbeat ${r.status}: ${await r.text().catch(() => '')}`);
104
230
  }
105
231
  }
232
+ function defaultInstallationId() {
233
+ return `${PLUGIN_ID}:${process.platform}:${process.env.USER ?? 'local'}`;
234
+ }
106
235
  async function fetchSkillRules(baseUrl, opts) {
107
236
  try {
108
237
  const r = await fetch(`${baseUrl.replace(/\/$/, '')}/api/v1/plan-skills?workspace_id=${encodeURIComponent(opts.workspaceId)}`, {
package/dist/peer.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"peer.js","sourceRoot":"","sources":["../src/peer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"peer.js","sourceRoot":"","sources":["../src/peer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAe,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACL,2BAA2B,GAE5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,qBAAqB,GAAG,MAAM,CAAC;AACrC,MAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACrD,MAAM,SAAS,GAAG,sBAAsB,CAAC;AACzC,2EAA2E;AAC3E,0EAA0E;AAC1E,MAAM,wBAAwB,GAAG,CAAC,CAAC;AACnC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAErC,SAAS,mBAAmB,CAAC,KAAc;IACzC,OAAO,MAAM,CAAC,KAAK,CAAC;SACjB,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC;SAClC,OAAO,CAAC,uBAAuB,EAAE,mBAAmB,CAAC;SACrD,OAAO,CAAC,8BAA8B,EAAE,mBAAmB,CAAC;SAC5D,OAAO,CAAC,yBAAyB,EAAE,gBAAgB,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IAKpD,MAAM,MAAM,GACV,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QACzC,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,IAAI,GACR,OAAO,MAAM,EAAE,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;QACpD,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC;QAClC,CAAC,CAAC,gBAAgB,CAAC;IACvB,MAAM,OAAO,GACX,OAAO,MAAM,EAAE,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;QAC1D,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC;QACrC,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE;YACzC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC;YAC5B,CAAC,CAAC,0BAA0B,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,CAAC;IAE1B,OAAO;QACL,IAAI;QACJ,OAAO;QACP,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ;YAC5B,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9D,CAAC,CAAC,EAAE,IAAI,EAAE;YACV,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AA2BD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAsB;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,qBAAqB,CAAC;IACtD,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,eAAe,GACnB,IAAI,CAAC,mBAAmB,KAAK,KAAK;QAChC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,qBAAqB,CAAC;YACpB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO;YACP,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,mBAAmB;SACrC,CAAC,CAAC;IACT,MAAM,MAAM,GACV,IAAI,CAAC,MAAM;QACX,IAAI,cAAc,CAAC;YACjB,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC;YACtD,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,eAAe;SAChB,CAAC,CAAC;IAEL,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,aAAa,GAA0C,IAAI,CAAC;IAChE,MAAM,iBAAiB,GAAG,GAAG,EAAE,CAC7B,qBAAqB,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IAE1E,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC;QAC5B,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC;QAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,SAAS;QACnB,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,qBAAqB,EAAE;QAC9D,eAAe,EAAE,wBAAwB;QACzC,OAAO,EAAE,CAAC,MAAM,CAAC;QACjB,MAAM,EAAE,GAAG,EAAE;YACX,eAAe,GAAG,IAAI,CAAC;YACvB,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,KAAK,iBAAiB,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrC,sCAAsC;gBACtC,OAAO,CAAC,IAAI,CAAC,8CAA8C,EAAE,GAAG,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACxB,eAAe,GAAG,KAAK,CAAC;YACxB,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACf,MAAM,SAAS,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;YAC/C,sBAAsB,CAAC,IAAI,KAAK,CAAC,GAAG,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE;gBAC3E,KAAK,EAAE,mBAAmB;aAC3B,CAAC,CAAC;YACH,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,SAAS,CAAC,CAAC;QAC3D,CAAC;KACF,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,EAAE,CAAC;IAEjB,IAAI,qBAAqB,GAA0C,IAAI,CAAC;IACxE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACxB,MAAM,iBAAiB,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACtC,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,0DAA0D,EAAE,GAAG,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QACH,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;YAC/B,KAAK,iBAAiB,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrC,sCAAsC;gBACtC,OAAO,CAAC,IAAI,CAAC,kDAAkD,EAAE,GAAG,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAC1B,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC;QAExB,MAAM,oBAAoB,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAChE,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,yDAAyD,EAAE,GAAG,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;QACH,qBAAqB,GAAG,WAAW,CACjC,GAAG,EAAE;YACH,KAAK,oBAAoB,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC/D,sCAAsC;gBACtC,OAAO,CAAC,IAAI,CAAC,gDAAgD,EAAE,GAAG,CAAC,CAAC;YACtE,CAAC,CAAC,CAAC;QACL,CAAC,EACD,oBAAoB,CACrB,CAAC;QACF,qBAAqB,CAAC,KAAK,EAAE,EAAE,CAAC;IAClC,CAAC;IAED,OAAO;QACL,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,IAAI,aAAa;gBAAE,aAAa,CAAC,aAAa,CAAC,CAAC;YAChD,IAAI,qBAAqB;gBAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC;YAChE,eAAe,GAAG,KAAK,CAAC;YACxB,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC;AASD,KAAK,UAAU,YAAY;IACzB,mFAAmF;IACnF,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAC;IACpE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;QACjE,8DAA8D;QAC9D,OAAO;YACL,WAAW,EAAE,+BAA+B;YAC5C,OAAO,EAAE,WAAW;YACpB,oBAAoB,EAAE,iBAAiB;YACvC,SAAS,EAAE,EAAE;SACd,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,OAAe,EACf,IAAsB,EACtB,QAAkB,EAClB,MAAc,EACd,eAAwB;IAExB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACvC,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC;IACtD,MAAM,SAAS,GAAG,aAAa;QAC7B,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,QAAQ,CAAC,SAAS;YAClB,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,aAAa,CAAC;IACpB,MAAM,gBAAgB,GAAG,MAAM,2BAA2B,CAAC;QACzD,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,SAAS;QACT,QAAQ,EAAE,IAAI,CAAC,WAAW;QAC1B,MAAM,EAAE,IAAI,CAAC,gBAAgB;KAC9B,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,2BAA2B,EAAE;QAC9E,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;SACvC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,YAAY,EAAE,IAAI,CAAC,WAAW;YAC9B,SAAS,EAAE,SAAS;YACpB,eAAe,EAAE,IAAI,CAAC,cAAc,IAAI,qBAAqB,EAAE;YAC/D,aAAa,EAAE,OAAO,CAAC,QAAQ;YAC/B,iBAAiB,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,eAAe,EAAE,QAAQ,CAAC,OAAO;YACjC,gBAAgB,EAAE,wBAAwB;YAC1C,SAAS,EAAE,IAAI;YACf,iBAAiB,EAAE,IAAI;YACvB,mBAAmB,EAAE,aAAa;YAClC,QAAQ,EAAE;gBACR,OAAO,EAAE,MAAM;gBACf,gBAAgB,EAAE,eAAe;gBACjC,cAAc,EAAE,IAAI;gBACpB,cAAc,EACZ,eAAe,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,IAAI,aAAa;gBACjE,WAAW,EAAE,SAAS;gBACtB,WAAW,EAAE,IAAI;gBACjB,aAAa,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI;gBACvC,iBAAiB,EAAE,gBAAgB;aACpC;SACF,CAAC;KACH,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,OAAe,EACf,IAAsB,EACtB,QAAkB;IAElB,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,4BAA4B,EAAE;QAC/E,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;SACvC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,YAAY,EAAE,IAAI,CAAC,WAAW;YAC9B,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB;YACnD,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC9B,CAAC;KACH,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO,GAAG,SAAS,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;AAC3E,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,OAAe,EACf,IAAsB;IAStB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,KAAK,CACnB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,oCAAoC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EACvG;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE;SACpD,CACF,CAAC;QACF,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAU3B,CAAC;QACF,MAAM,KAAK,GAKN,EAAE,CAAC;QACR,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YACtC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC;oBACT,QAAQ,EAAE,KAAK,CAAC,EAAE;oBAClB,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;oBAC7C,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;oBAC3C,aAAa,EAAE,IAAI,CAAC,aAAa;iBAClC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC/E,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5E,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Plugin } from '@opencode-ai/plugin';
2
+ import type { StartedPeer, StartPeerOptions } from './peer.js';
3
+ import { bridgeOpenCodeSessionSummary } from './sessionSummaryBridge.js';
4
+ type StartPeer = (opts: StartPeerOptions) => Promise<StartedPeer>;
5
+ type Env = Record<string, string | undefined>;
6
+ type Logger = Pick<Console, 'log' | 'warn' | 'error'>;
7
+ type BridgeSessionSummary = typeof bridgeOpenCodeSessionSummary;
8
+ export type CreateOrgXOpenCodePluginOptions = {
9
+ startPeer?: StartPeer;
10
+ env?: Env;
11
+ logger?: Logger;
12
+ bridgeSessionSummary?: BridgeSessionSummary;
13
+ };
14
+ export declare function createOrgXOpenCodePlugin(opts?: CreateOrgXOpenCodePluginOptions): Plugin;
15
+ export declare const OrgXOpenCodePlugin: Plugin;
16
+ export default OrgXOpenCodePlugin;
17
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
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,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAEzE,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;AACtD,KAAK,oBAAoB,GAAG,OAAO,4BAA4B,CAAC;AAEhE,MAAM,MAAM,+BAA+B,GAAG;IAC5C,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C,CAAC;AAEF,wBAAgB,wBAAwB,CACtC,IAAI,GAAE,+BAAoC,GACzC,MAAM,CA0HR;AAYD,eAAO,MAAM,kBAAkB,QAA6B,CAAC;AAC7D,eAAe,kBAAkB,CAAC"}