@agentuity/opencode 0.1.41 → 0.1.43

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 (51) hide show
  1. package/README.md +3 -10
  2. package/dist/agents/lead.d.ts +1 -1
  3. package/dist/agents/lead.d.ts.map +1 -1
  4. package/dist/agents/lead.js +2 -3
  5. package/dist/agents/lead.js.map +1 -1
  6. package/dist/background/manager.d.ts +1 -0
  7. package/dist/background/manager.d.ts.map +1 -1
  8. package/dist/background/manager.js +6 -0
  9. package/dist/background/manager.js.map +1 -1
  10. package/dist/plugin/hooks/cadence.d.ts.map +1 -1
  11. package/dist/plugin/hooks/cadence.js +3 -1
  12. package/dist/plugin/hooks/cadence.js.map +1 -1
  13. package/dist/plugin/plugin.d.ts.map +1 -1
  14. package/dist/plugin/plugin.js +54 -11
  15. package/dist/plugin/plugin.js.map +1 -1
  16. package/dist/skills/frontmatter.js +1 -1
  17. package/dist/skills/frontmatter.js.map +1 -1
  18. package/dist/tmux/executor.d.ts +57 -6
  19. package/dist/tmux/executor.d.ts.map +1 -1
  20. package/dist/tmux/executor.js +676 -57
  21. package/dist/tmux/executor.js.map +1 -1
  22. package/dist/tmux/index.d.ts +1 -1
  23. package/dist/tmux/index.d.ts.map +1 -1
  24. package/dist/tmux/index.js +1 -1
  25. package/dist/tmux/index.js.map +1 -1
  26. package/dist/tmux/manager.d.ts +70 -0
  27. package/dist/tmux/manager.d.ts.map +1 -1
  28. package/dist/tmux/manager.js +357 -22
  29. package/dist/tmux/manager.js.map +1 -1
  30. package/dist/tmux/state-query.d.ts.map +1 -1
  31. package/dist/tmux/state-query.js +4 -1
  32. package/dist/tmux/state-query.js.map +1 -1
  33. package/dist/tmux/types.d.ts +11 -0
  34. package/dist/tmux/types.d.ts.map +1 -1
  35. package/dist/tmux/types.js.map +1 -1
  36. package/dist/tmux/utils.d.ts +17 -0
  37. package/dist/tmux/utils.d.ts.map +1 -1
  38. package/dist/tmux/utils.js +39 -0
  39. package/dist/tmux/utils.js.map +1 -1
  40. package/package.json +3 -3
  41. package/src/agents/lead.ts +2 -3
  42. package/src/background/manager.ts +6 -0
  43. package/src/plugin/hooks/cadence.ts +2 -1
  44. package/src/plugin/plugin.ts +67 -11
  45. package/src/skills/frontmatter.ts +1 -1
  46. package/src/tmux/executor.ts +748 -55
  47. package/src/tmux/index.ts +6 -0
  48. package/src/tmux/manager.ts +410 -21
  49. package/src/tmux/state-query.ts +4 -1
  50. package/src/tmux/types.ts +12 -0
  51. package/src/tmux/utils.ts +39 -0
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tmux/types.ts"],"names":[],"mappings":"AAkGA,0BAA0B;AAC1B,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAElC,oBAAoB;AACpB,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AACrC,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tmux/types.ts"],"names":[],"mappings":"AA8GA,0BAA0B;AAC1B,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAElC,oBAAoB;AACpB,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AACrC,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC"}
@@ -29,4 +29,21 @@ export declare function runTmuxCommandSync(args: string[]): {
29
29
  * Get the path to the tmux binary synchronously
30
30
  */
31
31
  export declare function getTmuxPathSync(): string | null;
32
+ /**
33
+ * Get the tmux session ID for a given pane.
34
+ * This is used to ensure windows are created in the correct tmux session
35
+ * when multiple opencode instances run in different sessions.
36
+ */
37
+ export declare function getTmuxSessionId(paneId: string): Promise<string | undefined>;
38
+ /**
39
+ * Get the tmux session ID synchronously (for shutdown scenarios)
40
+ */
41
+ export declare function getTmuxSessionIdSync(paneId: string): string | undefined;
42
+ /**
43
+ * Canonicalize server URL for consistent ownership tagging.
44
+ * Normalizes loopback addresses (127.0.0.1, ::1) to localhost.
45
+ *
46
+ * @throws Error if URL is invalid
47
+ */
48
+ export declare function canonicalizeServerUrl(url: string): string;
32
49
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/tmux/utils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAErD;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS1D;AAED;;GAEG;AACH,wBAAsB,cAAc,CACnC,IAAI,EAAE,MAAM,EAAE,GACZ,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAgBvF;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAS/C"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/tmux/utils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAErD;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS1D;AAED;;GAEG;AACH,wBAAsB,cAAc,CACnC,IAAI,EAAE,MAAM,EAAE,GACZ,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAgBvF;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAS/C;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAIlF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIvE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWzD"}
@@ -77,4 +77,43 @@ export function getTmuxPathSync() {
77
77
  return null;
78
78
  }
79
79
  }
80
+ /**
81
+ * Get the tmux session ID for a given pane.
82
+ * This is used to ensure windows are created in the correct tmux session
83
+ * when multiple opencode instances run in different sessions.
84
+ */
85
+ export async function getTmuxSessionId(paneId) {
86
+ const result = await runTmuxCommand(['display', '-p', '-t', paneId, '#{session_id}']);
87
+ if (!result.success || !result.output)
88
+ return undefined;
89
+ return result.output.trim() || undefined;
90
+ }
91
+ /**
92
+ * Get the tmux session ID synchronously (for shutdown scenarios)
93
+ */
94
+ export function getTmuxSessionIdSync(paneId) {
95
+ const result = runTmuxCommandSync(['display', '-p', '-t', paneId, '#{session_id}']);
96
+ if (!result.success || !result.output)
97
+ return undefined;
98
+ return result.output.trim() || undefined;
99
+ }
100
+ /**
101
+ * Canonicalize server URL for consistent ownership tagging.
102
+ * Normalizes loopback addresses (127.0.0.1, ::1) to localhost.
103
+ *
104
+ * @throws Error if URL is invalid
105
+ */
106
+ export function canonicalizeServerUrl(url) {
107
+ try {
108
+ const parsed = new URL(url);
109
+ let host = parsed.hostname.toLowerCase();
110
+ if (host === '127.0.0.1' || host === '::1') {
111
+ host = 'localhost';
112
+ }
113
+ return `${parsed.protocol}//${host}:${parsed.port}`;
114
+ }
115
+ catch (error) {
116
+ throw new Error(`Invalid server URL: ${url}`, { cause: error });
117
+ }
118
+ }
80
119
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tmux/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,YAAY;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAChC,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,MAAM,IAAI,CAAC,MAAM,CAAC;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,IAAc;IAEd,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;IACjC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAE/D,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACtD,MAAM,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAEtD,OAAO;QACN,OAAO,EAAE,QAAQ,KAAK,CAAC;QACvB,MAAM,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;KACtD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAc;IAChD,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAE/D,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAE/C,OAAO;YACN,OAAO,EAAE,MAAM,CAAC,QAAQ,KAAK,CAAC;YAC9B,MAAM,EAAE,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;SAC7D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAC1D,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC9B,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC/C,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tmux/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentuity/opencode",
3
- "version": "0.1.41",
3
+ "version": "0.1.43",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Agentuity employees and contributors",
6
6
  "description": "Agentuity Open Code plugin with specialized AI coding agents",
@@ -40,13 +40,13 @@
40
40
  "prepublishOnly": "bun run clean && bun run build"
41
41
  },
42
42
  "dependencies": {
43
- "@agentuity/core": "0.1.41",
43
+ "@agentuity/core": "0.1.43",
44
44
  "@opencode-ai/plugin": "^1.1.36",
45
45
  "yaml": "^2.8.1",
46
46
  "zod": "^4.3.5"
47
47
  },
48
48
  "devDependencies": {
49
- "@agentuity/test-utils": "0.1.41",
49
+ "@agentuity/test-utils": "0.1.43",
50
50
  "@types/bun": "latest",
51
51
  "bun-types": "latest",
52
52
  "typescript": "^5.9.0"
@@ -882,10 +882,9 @@ agentuity cloud queue publish agentuity-cadence-work '{
882
882
  }'
883
883
  \`\`\`
884
884
 
885
- Check on child teams:
885
+ Check on child teams by querying KV state directly:
886
886
  \`\`\`bash
887
- agentuity ai cadence list
888
- agentuity ai cadence status lp_child
887
+ agentuity cloud kv get agentuity-opencode-tasks "loop:lp_child:state" --json
889
888
  \`\`\`
890
889
 
891
890
  ### Context Management
@@ -31,6 +31,7 @@ export interface BackgroundManagerCallbacks {
31
31
  title: string;
32
32
  }) => void;
33
33
  onSubagentSessionDeleted?: (event: { sessionId: string }) => void;
34
+ onShutdown?: () => void | Promise<void>;
34
35
  }
35
36
 
36
37
  export class BackgroundManager {
@@ -182,6 +183,11 @@ export class BackgroundManager {
182
183
  this.shuttingDown = true;
183
184
  this.concurrency.clear();
184
185
  this.notifications.clear();
186
+ try {
187
+ void this.callbacks?.onShutdown?.();
188
+ } catch {
189
+ // Ignore shutdown callback errors
190
+ }
185
191
  }
186
192
 
187
193
  private indexTask(task: BackgroundTask): void {
@@ -107,6 +107,7 @@ export function createCadenceHooks(ctx: PluginInput, _config: CoderConfig): Cade
107
107
  );
108
108
  if (statusMatch) {
109
109
  const [, loopId, iteration, maxIterations] = statusMatch;
110
+ if (!iteration || !maxIterations) return;
110
111
  const newIteration = parseInt(iteration, 10);
111
112
  const newMax = parseInt(maxIterations, 10);
112
113
  const changed =
@@ -127,7 +128,7 @@ export function createCadenceHooks(ctx: PluginInput, _config: CoderConfig): Cade
127
128
 
128
129
  // Fallback: try to extract iteration from loose "iteration: N" pattern
129
130
  const iterMatch = messageText.match(/iteration[:\s]+(\d+)/i);
130
- if (iterMatch) {
131
+ if (iterMatch && iterMatch[1]) {
131
132
  const newIteration = parseInt(iterMatch[1], 10);
132
133
  if (newIteration !== state.iteration) {
133
134
  state.iteration = newIteration;
@@ -95,6 +95,11 @@ export async function createCoderPlugin(ctx: PluginInput): Promise<Hooks> {
95
95
  void tmuxManager.onSessionDeleted(event);
96
96
  }
97
97
  : undefined,
98
+ onShutdown: tmuxManager
99
+ ? () => {
100
+ void tmuxManager.cleanup();
101
+ }
102
+ : undefined,
98
103
  });
99
104
 
100
105
  // Session memory hooks handle checkpointing and compaction for non-Cadence sessions
@@ -106,7 +111,17 @@ export async function createCoderPlugin(ctx: PluginInput): Promise<Hooks> {
106
111
  // Create plugin tools using the @opencode-ai/plugin tool helper
107
112
  const tools = createTools(backgroundManager);
108
113
 
109
- registerShutdownHandler(backgroundManager, tmuxManager);
114
+ // Create a logger for shutdown handler
115
+ const shutdownLogger = (message: string) =>
116
+ ctx.client.app.log({
117
+ body: {
118
+ service: 'agentuity-coder',
119
+ level: 'info',
120
+ message: `[shutdown] ${message}`,
121
+ },
122
+ });
123
+
124
+ registerShutdownHandler(backgroundManager, tmuxManager, shutdownLogger);
110
125
 
111
126
  // Show startup toast (fire and forget, don't block)
112
127
  try {
@@ -647,18 +662,59 @@ function extractEventFromInput(
647
662
 
648
663
  function registerShutdownHandler(
649
664
  manager: BackgroundManager,
650
- tmuxManager?: TmuxSessionManager
665
+ tmuxManager?: TmuxSessionManager,
666
+ logger?: (msg: string) => void
651
667
  ): void {
652
- if (typeof process === 'undefined') return;
653
- const shutdown = () => {
654
- manager.shutdown();
668
+ if (typeof process === 'undefined') {
669
+ logger?.('[shutdown] process is undefined, cannot register handlers');
670
+ return;
671
+ }
672
+
673
+ const log = logger ?? (() => {});
674
+ let shutdownCalled = false;
675
+
676
+ log(
677
+ `Registering shutdown handlers (PID: ${process.pid}, tmuxManager: ${tmuxManager ? 'yes' : 'no'})`
678
+ );
679
+ log(`Current tracked sessions in tmuxManager: ${tmuxManager ? 'checking...' : 'N/A'}`);
680
+
681
+ const shutdown = (signal?: string) => {
682
+ // Prevent multiple shutdown calls
683
+ if (shutdownCalled) {
684
+ log(`Shutdown already in progress, ignoring ${signal ?? 'unknown'} signal`);
685
+ return;
686
+ }
687
+ shutdownCalled = true;
688
+
689
+ log(`Shutdown triggered by ${signal ?? 'unknown'} signal`);
690
+
691
+ try {
692
+ log('Shutting down background manager...');
693
+ manager.shutdown();
694
+ log('Background manager shutdown complete');
695
+ } catch (error) {
696
+ log(`Background manager shutdown error: ${error}`);
697
+ }
698
+
655
699
  if (tmuxManager) {
656
- // Use sync version to ensure cleanup completes before process exits
657
- tmuxManager.cleanupSync();
700
+ try {
701
+ log('Cleaning up tmux sessions...');
702
+ // Use sync version to ensure cleanup completes before process exits
703
+ tmuxManager.cleanupSync();
704
+ log('Tmux cleanup complete');
705
+ } catch (error) {
706
+ log(`Tmux cleanup error: ${error}`);
707
+ }
658
708
  }
709
+
710
+ log('Shutdown complete');
659
711
  };
660
- process.once('beforeExit', shutdown);
661
- process.once('SIGINT', shutdown);
662
- process.once('SIGTERM', shutdown);
663
- process.once('exit', shutdown); // Also handle exit event for extra safety
712
+
713
+ process.once('beforeExit', () => shutdown('beforeExit'));
714
+ process.once('SIGINT', () => shutdown('SIGINT'));
715
+ process.once('SIGTERM', () => shutdown('SIGTERM'));
716
+ process.once('SIGHUP', () => shutdown('SIGHUP')); // Handle tmux pane close
717
+ process.once('exit', () => shutdown('exit')); // Also handle exit event for extra safety
718
+
719
+ log('Shutdown handlers registered for: beforeExit, SIGINT, SIGTERM, SIGHUP, exit');
664
720
  }
@@ -13,7 +13,7 @@ export function parseFrontmatter<T = Record<string, unknown>>(
13
13
  return { data: {} as T, body: content.trim() };
14
14
  }
15
15
 
16
- const frontmatter = match[1];
16
+ const frontmatter = match[1] ?? '';
17
17
  const body = content.slice(match[0].length).trim();
18
18
 
19
19
  try {