orquesta-agent 0.2.239 → 0.2.241

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.
@@ -35,6 +35,16 @@ export interface ExecuteOptions {
35
35
  * also prevents the orquesta retry from recursing again.
36
36
  */
37
37
  _forceCli?: 'orquesta' | 'claude';
38
+ /**
39
+ * Set when this prompt is one item of an assisted QA run. Suppresses every
40
+ * deploy instruction in the settings header; the caller (index.ts) also
41
+ * commits the branch and reports the diff back afterwards.
42
+ */
43
+ assisted?: {
44
+ runId: string;
45
+ itemId: string;
46
+ branch: string;
47
+ };
38
48
  }
39
49
  export interface AuthConfig {
40
50
  anthropicApiKey?: string;
@@ -72,6 +82,22 @@ export declare function setCliEndpoint(endpoint: string): void;
72
82
  export declare function getCliEndpoint(): string;
73
83
  export declare function setBrowserEnabled(enabled: boolean): void;
74
84
  export declare function getBrowserEnabled(): boolean;
85
+ /**
86
+ * Is orquesta-cli usable, and which copy of it should we run?
87
+ *
88
+ * The agent bundles orquesta-cli as a dependency so a no-Node / standalone
89
+ * install always has a CLI. That copy used to win unconditionally — it was
90
+ * probed first and its bin dir was prepended to PATH, and every spawn uses the
91
+ * bare name `orquesta`. So a user who updated their own global CLI kept getting
92
+ * the version pinned in orquesta-agent's package.json: the Interactive Session
93
+ * reported v0.2.138 on a machine running v0.2.140, and re-running the update
94
+ * flow could never change it, because the update flow bumps the AGENT and the
95
+ * agent's pin came along with it. QA-77.
96
+ *
97
+ * Now every candidate is probed and the NEWEST one wins. The bundled copy stays
98
+ * the floor (it is still found when nothing else is installed), it just no
99
+ * longer shadows a newer install.
100
+ */
75
101
  export declare function isOrquestaCliAvailable(): boolean;
76
102
  export declare function resolveClaudeBinary(): string | null;
77
103
  export declare function isClaudeCliAvailable(): boolean;
@@ -96,7 +122,38 @@ export declare function checkClaudeAuth(): {
96
122
  };
97
123
  export declare function gitClone(repoUrl: string, targetDir: string, githubToken?: string): Promise<void>;
98
124
  export declare function gitPull(targetDir: string): Promise<void>;
99
- export declare function gitCommitAndPush(targetDir: string, message: string): Promise<void>;
125
+ /**
126
+ * Commit everything in `targetDir` and push the CURRENT branch.
127
+ *
128
+ * Two things here are load-bearing and were wrong while this function had no
129
+ * callers:
130
+ *
131
+ * - The message goes through `execFileSync` argv, never a shell string. The
132
+ * old `git commit -m "${message}"` broke on any message containing a double
133
+ * quote and executed on a backtick — and the messages are now built from
134
+ * QA-supplied item titles, i.e. untrusted text.
135
+ * - The push names its remote and branch explicitly. A bare `git push` obeys
136
+ * `push.default`, which on a fresh assisted branch with no upstream fails
137
+ * outright; `-u origin <branch>` both creates the branch remotely and sets
138
+ * the upstream for later pushes.
139
+ *
140
+ * Returns the commit sha it created, or null when there was nothing to commit.
141
+ * Never throws — the caller reports what happened either way.
142
+ */
143
+ export declare function gitCommitAndPush(targetDir: string, message: string, opts?: {
144
+ push?: boolean;
145
+ }): Promise<{
146
+ sha: string | null;
147
+ pushed: boolean;
148
+ }>;
149
+ /**
150
+ * `git diff --numstat` between `baseRef` and the working tree's last commit.
151
+ *
152
+ * Raw text, sent verbatim to the server: the agent never decides whether a diff
153
+ * is too big. Capped so a generated-file explosion cannot become a multi-MB
154
+ * request body.
155
+ */
156
+ export declare function gitNumstatSince(targetDir: string, baseRef: string): string;
100
157
  export declare function getActivePromptId(): string | null;
101
158
  /**
102
159
  * Current git branch of `cwd` (the branch a prompt runs on / an interactive
@@ -1 +1 @@
1
- {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
package/dist/executor.js CHANGED
@@ -1,4 +1,4 @@
1
- import { spawn, execSync } from 'child_process';
1
+ import { spawn, execSync, execFileSync } from 'child_process';
2
2
  // PTY binding for interactive sessions. We use @homebridge/node-pty-prebuilt-multiarch
3
3
  // (a maintained fork that ships N-API prebuilds for linux-x64/arm64, darwin-x64/arm64,
4
4
  // win32-x64) so customers never need a build toolchain on their VM. The try/catch
@@ -357,9 +357,19 @@ export function setProjectSettings(settings) {
357
357
  logger.debug(`Settings: autoDeploy=${settings.autoDeploy}, autoMigrate=${settings.autoMigrate}`);
358
358
  }
359
359
  // Generate settings header for Claude prompt
360
- function generateSettingsHeader() {
360
+ //
361
+ // `assisted` suppresses every deploy instruction: an assisted run's whole point
362
+ // is that a human reads the diff before it ships, and a deploy fired from
363
+ // inside the run would ship exactly the change the review exists to hold back.
364
+ // The server refuses the deploy call as well (assistedDeployBlock) — this half
365
+ // only stops the agent from trying, because an old agent build on a customer
366
+ // machine will keep emitting the curl for months.
367
+ function generateSettingsHeader(opts = {}) {
361
368
  const lines = ['## Active Orquesta Settings\n'];
362
- if (projectSettings.autoDeploy && projectSettings.projectId) {
369
+ if (opts.assisted) {
370
+ lines.push(`- **Assisted run: deployment is DISABLED for this task.** Do NOT deploy, do NOT call the Orquesta Deploy API, and do NOT push to the main branch. Your changes stay on the QA branch and a reviewer decides whether they ship.`);
371
+ }
372
+ else if (projectSettings.autoDeploy && projectSettings.projectId) {
363
373
  lines.push(`- **Auto-Deploy: ENABLED**
364
374
 
365
375
  ⚠️ CRITICAL DEPLOYMENT RULES:
@@ -710,66 +720,118 @@ const CLI_DETECTION_TTL_MS = 5 * 60 * 1000;
710
720
  let orquestaCliCache = null;
711
721
  let claudeCliCache = null;
712
722
  let kimiCliCache = null;
723
+ /**
724
+ * Version of an orquesta-cli binary, or null when it does not run.
725
+ * '' means it runs but printed nothing we can parse as a version.
726
+ */
727
+ function probeOrquestaVersion(bin) {
728
+ try {
729
+ const out = execSync(`${bin} --version`, { stdio: 'pipe', timeout: 15000, encoding: 'utf-8' });
730
+ return (out.match(/\d+\.\d+\.\d+/) || [''])[0];
731
+ }
732
+ catch {
733
+ return null;
734
+ }
735
+ }
736
+ function compareSemver(a, b) {
737
+ const pa = a.split('.').map(n => parseInt(n, 10) || 0);
738
+ const pb = b.split('.').map(n => parseInt(n, 10) || 0);
739
+ for (let i = 0; i < 3; i++) {
740
+ if ((pa[i] || 0) !== (pb[i] || 0))
741
+ return (pa[i] || 0) - (pb[i] || 0);
742
+ }
743
+ return 0;
744
+ }
745
+ // The bin dir this module prepended to PATH on the last detection, so a later
746
+ // re-detection can drop it instead of stacking (and instead of letting a stale
747
+ // winner keep shadowing the one we just chose).
748
+ let injectedCliBinDir = null;
749
+ function prependToPath(binDir) {
750
+ if (injectedCliBinDir && injectedCliBinDir !== binDir) {
751
+ const parts = (process.env.PATH || '').split(path.delimiter).filter(p => p !== injectedCliBinDir);
752
+ process.env.PATH = parts.join(path.delimiter);
753
+ injectedCliBinDir = null;
754
+ }
755
+ const parts = (process.env.PATH || '').split(path.delimiter);
756
+ if (parts[0] !== binDir) {
757
+ // path.delimiter, not ':' — a hardcoded colon builds an unusable PATH on
758
+ // Windows, where the agent has to work too.
759
+ process.env.PATH = [binDir, ...parts.filter(p => p !== binDir)].join(path.delimiter);
760
+ }
761
+ injectedCliBinDir = binDir;
762
+ }
763
+ /**
764
+ * Is orquesta-cli usable, and which copy of it should we run?
765
+ *
766
+ * The agent bundles orquesta-cli as a dependency so a no-Node / standalone
767
+ * install always has a CLI. That copy used to win unconditionally — it was
768
+ * probed first and its bin dir was prepended to PATH, and every spawn uses the
769
+ * bare name `orquesta`. So a user who updated their own global CLI kept getting
770
+ * the version pinned in orquesta-agent's package.json: the Interactive Session
771
+ * reported v0.2.138 on a machine running v0.2.140, and re-running the update
772
+ * flow could never change it, because the update flow bumps the AGENT and the
773
+ * agent's pin came along with it. QA-77.
774
+ *
775
+ * Now every candidate is probed and the NEWEST one wins. The bundled copy stays
776
+ * the floor (it is still found when nothing else is installed), it just no
777
+ * longer shadows a newer install.
778
+ */
713
779
  export function isOrquestaCliAvailable() {
714
780
  const now = Date.now();
715
781
  if (orquestaCliCache && now - orquestaCliCache.at < CLI_DETECTION_TTL_MS) {
716
782
  return orquestaCliCache.available;
717
783
  }
718
- let available = false;
719
- // First: check bundled CLI (orquesta-cli installed as dependency)
784
+ const home = process.env.HOME || process.env.USERPROFILE || '/root';
720
785
  const bundledBin = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', '..', 'node_modules', '.bin', 'orquesta');
721
- try {
722
- if (fs.existsSync(bundledBin)) {
723
- execSync(`${bundledBin} --version`, { stdio: 'pipe', timeout: 15000 });
724
- // Add bundled bin dir to PATH so spawn() finds it
725
- const binDir = path.dirname(bundledBin);
726
- if (!process.env.PATH?.includes(binDir)) {
727
- process.env.PATH = `${binDir}:${process.env.PATH || ''}`;
728
- }
729
- available = true;
730
- orquestaCliCache = { available, at: now };
731
- return available;
732
- }
786
+ const candidates = [];
787
+ if (fs.existsSync(bundledBin))
788
+ candidates.push(bundledBin);
789
+ // Whatever `orquesta` resolves to right now but only after dropping any bin
790
+ // dir a previous detection injected, or we would just re-measure our own pick.
791
+ if (injectedCliBinDir) {
792
+ process.env.PATH = (process.env.PATH || '')
793
+ .split(path.delimiter).filter(p => p !== injectedCliBinDir).join(path.delimiter);
794
+ injectedCliBinDir = null;
733
795
  }
734
- catch { /* bundled not working */ }
735
- // Second: check PATH
736
796
  try {
737
- execSync('orquesta --version', { stdio: 'pipe', timeout: 15000 });
738
- available = true;
739
- }
740
- catch {
741
- // Fallback: common npm global paths
742
- const home = process.env.HOME || '/root';
743
- const candidates = [
744
- `${home}/.npm-global/bin/orquesta`,
745
- `${home}/.nvm/versions/node/${process.version}/bin/orquesta`,
746
- '/usr/local/bin/orquesta',
747
- '/usr/bin/orquesta',
748
- // getorquesta.com/install drops the standalone cli here when /usr/local/bin
749
- // isn't writable and there's no sudo (no-Node install on a non-root box).
750
- `${home}/.local/bin/orquesta`,
751
- ];
752
- try {
753
- const prefix = execSync('npm prefix -g', { stdio: 'pipe', timeout: 5000, encoding: 'utf-8' }).trim();
754
- if (prefix)
755
- candidates.unshift(`${prefix}/bin/orquesta`);
756
- }
757
- catch { }
758
- for (const bin of candidates) {
759
- try {
760
- execSync(`${bin} --version`, { stdio: 'pipe', timeout: 15000 });
761
- const binDir = bin.replace(/\/orquesta$/, '');
762
- if (!process.env.PATH?.includes(binDir)) {
763
- process.env.PATH = `${binDir}:${process.env.PATH || ''}`;
764
- }
765
- available = true;
766
- break;
767
- }
768
- catch { }
797
+ const prefix = execSync('npm prefix -g', { stdio: 'pipe', timeout: 5000, encoding: 'utf-8' }).trim();
798
+ if (prefix)
799
+ candidates.push(path.join(prefix, 'bin', 'orquesta'));
800
+ }
801
+ catch { /* npm may not be installed at all (standalone binary machines) */ }
802
+ candidates.push(`${home}/.npm-global/bin/orquesta`, `${home}/.nvm/versions/node/${process.version}/bin/orquesta`, '/usr/local/bin/orquesta', '/usr/bin/orquesta',
803
+ // getorquesta.com/install drops the standalone cli here when /usr/local/bin
804
+ // isn't writable and there's no sudo (no-Node install on a non-root box).
805
+ `${home}/.local/bin/orquesta`);
806
+ let best = null;
807
+ const seen = new Set();
808
+ for (const bin of candidates) {
809
+ if (seen.has(bin))
810
+ continue;
811
+ seen.add(bin);
812
+ if (bin !== bundledBin && !fs.existsSync(bin))
813
+ continue;
814
+ const version = probeOrquestaVersion(bin);
815
+ if (version === null)
816
+ continue;
817
+ if (!best || compareSemver(version, best.version) > 0)
818
+ best = { bin, version };
819
+ }
820
+ // Nothing on the candidate list ran — fall back to a bare PATH lookup, which
821
+ // covers layouts we don't enumerate (Windows shims, custom prefixes).
822
+ if (!best) {
823
+ const version = probeOrquestaVersion('orquesta');
824
+ if (version !== null) {
825
+ orquestaCliCache = { available: true, at: now };
826
+ return true;
769
827
  }
828
+ orquestaCliCache = { available: false, at: now };
829
+ return false;
770
830
  }
771
- orquestaCliCache = { available, at: now };
772
- return available;
831
+ prependToPath(path.dirname(best.bin));
832
+ logger.debug(`orquesta-cli: using ${best.bin}${best.version ? ` (v${best.version})` : ''}`);
833
+ orquestaCliCache = { available: true, at: now };
834
+ return true;
773
835
  }
774
836
  // Resolve a claude binary that ACTUALLY runs — not one that merely exists on
775
837
  // PATH. The claude-code npm package's `bin/claude` launcher can be broken: a
@@ -1120,27 +1182,92 @@ export async function gitPull(targetDir) {
1120
1182
  logger.warn(`Git pull failed (continuing without it): ${error}`);
1121
1183
  }
1122
1184
  }
1123
- export async function gitCommitAndPush(targetDir, message) {
1185
+ /**
1186
+ * Commit everything in `targetDir` and push the CURRENT branch.
1187
+ *
1188
+ * Two things here are load-bearing and were wrong while this function had no
1189
+ * callers:
1190
+ *
1191
+ * - The message goes through `execFileSync` argv, never a shell string. The
1192
+ * old `git commit -m "${message}"` broke on any message containing a double
1193
+ * quote and executed on a backtick — and the messages are now built from
1194
+ * QA-supplied item titles, i.e. untrusted text.
1195
+ * - The push names its remote and branch explicitly. A bare `git push` obeys
1196
+ * `push.default`, which on a fresh assisted branch with no upstream fails
1197
+ * outright; `-u origin <branch>` both creates the branch remotely and sets
1198
+ * the upstream for later pushes.
1199
+ *
1200
+ * Returns the commit sha it created, or null when there was nothing to commit.
1201
+ * Never throws — the caller reports what happened either way.
1202
+ */
1203
+ export async function gitCommitAndPush(targetDir, message, opts = {}) {
1124
1204
  try {
1125
1205
  // Check if there are changes
1126
1206
  const status = execSync('git status --porcelain', { cwd: targetDir, timeout: 30_000 }).toString();
1127
1207
  if (!status.trim()) {
1128
1208
  logger.info('No changes to commit');
1129
- return;
1209
+ return { sha: null, pushed: false };
1130
1210
  }
1131
1211
  logger.info('Committing changes...');
1132
- execSync('git add .', { cwd: targetDir, stdio: 'inherit', timeout: 30_000 });
1133
- execSync(`git commit -m "${message}"`, { cwd: targetDir, stdio: 'inherit', timeout: 30_000 });
1134
- execSync('git push', {
1212
+ execFileSync('git', ['add', '-A'], { cwd: targetDir, stdio: 'pipe', timeout: 30_000 });
1213
+ execFileSync('git', ['commit', '-m', message], { cwd: targetDir, stdio: 'pipe', timeout: 30_000 });
1214
+ const sha = execSync('git rev-parse HEAD', {
1135
1215
  cwd: targetDir,
1136
- stdio: 'inherit',
1137
- timeout: GIT_NET_TIMEOUT_MS,
1138
- env: GIT_NONINTERACTIVE_ENV,
1139
- });
1140
- logger.success('Changes pushed to repository');
1216
+ encoding: 'utf-8',
1217
+ timeout: 10_000,
1218
+ stdio: ['pipe', 'pipe', 'ignore'],
1219
+ }).trim();
1220
+ let pushed = false;
1221
+ if (opts.push !== false) {
1222
+ const branch = getCurrentGitBranch(targetDir);
1223
+ if (!branch) {
1224
+ logger.warn('Detached HEAD — committed but not pushed');
1225
+ }
1226
+ else {
1227
+ try {
1228
+ execFileSync('git', ['push', '-u', 'origin', branch], {
1229
+ cwd: targetDir,
1230
+ stdio: 'pipe',
1231
+ timeout: GIT_NET_TIMEOUT_MS,
1232
+ env: GIT_NONINTERACTIVE_ENV,
1233
+ });
1234
+ pushed = true;
1235
+ logger.success(`Changes pushed to origin/${branch}`);
1236
+ }
1237
+ catch (pushError) {
1238
+ // A commit that exists locally is still a reviewable result — the
1239
+ // reviewer just reads the diff stat instead of the remote branch.
1240
+ logger.warn(`Git push failed (commit kept locally): ${pushError}`);
1241
+ }
1242
+ }
1243
+ }
1244
+ return { sha, pushed };
1141
1245
  }
1142
1246
  catch (error) {
1143
1247
  logger.warn(`Git commit/push failed: ${error}`);
1248
+ return { sha: null, pushed: false };
1249
+ }
1250
+ }
1251
+ /**
1252
+ * `git diff --numstat` between `baseRef` and the working tree's last commit.
1253
+ *
1254
+ * Raw text, sent verbatim to the server: the agent never decides whether a diff
1255
+ * is too big. Capped so a generated-file explosion cannot become a multi-MB
1256
+ * request body.
1257
+ */
1258
+ export function gitNumstatSince(targetDir, baseRef) {
1259
+ try {
1260
+ const out = execFileSync('git', ['diff', '--numstat', `${baseRef}...HEAD`], {
1261
+ cwd: targetDir,
1262
+ encoding: 'utf-8',
1263
+ timeout: 30_000,
1264
+ stdio: ['pipe', 'pipe', 'ignore'],
1265
+ maxBuffer: 8 * 1024 * 1024,
1266
+ });
1267
+ return out.slice(0, 180_000);
1268
+ }
1269
+ catch {
1270
+ return '';
1144
1271
  }
1145
1272
  }
1146
1273
  // ============================================
@@ -1997,7 +2124,7 @@ export async function execute(options) {
1997
2124
  }
1998
2125
  // Build full prompt with settings, agent instructions, and attachments
1999
2126
  let fullContent = content + attachmentContext;
2000
- const settingsHeader = generateSettingsHeader();
2127
+ const settingsHeader = generateSettingsHeader({ assisted: !!options.assisted });
2001
2128
  const browserBlock = globalBrowserEnabled ? BROWSER_TOOLS_PROMPT_BLOCK : '';
2002
2129
  const coordinationBlock = await fetchCoordinationContextBlock();
2003
2130
  const capabilitiesBlock = `${ORQUESTA_CAPABILITIES_PROMPT_BLOCK}${coordinationBlock}`;