orbit-code-ai 0.1.34 → 0.1.36

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 (2) hide show
  1. package/dist/cli.mjs +206 -25
  2. package/package.json +1 -1
package/dist/cli.mjs CHANGED
@@ -83759,7 +83759,7 @@ async function printStartupScreen() {
83759
83759
  const sLen = ` ● ${sL} Ready — type /help to begin`.length;
83760
83760
  out.push(boxRow(sRow, W2, sLen));
83761
83761
  out.push(`${rgb(...BORDER)}╚${"═".repeat(W2 - 2)}╝${RESET}`);
83762
- out.push(` ${DIM}${rgb(...DIMCOL)}orbit-code ${RESET}${rgb(...ACCENT)}v${"0.1.34"}${RESET}`);
83762
+ out.push(` ${DIM}${rgb(...DIMCOL)}orbit-code ${RESET}${rgb(...ACCENT)}v${"0.1.36"}${RESET}`);
83763
83763
  out.push("");
83764
83764
  process.stdout.write(out.join(`
83765
83765
  `) + `
@@ -334266,7 +334266,7 @@ function getAnthropicEnvMetadata() {
334266
334266
  function getBuildAgeMinutes() {
334267
334267
  if (false)
334268
334268
  ;
334269
- const buildTime = new Date("2026-07-01T08:02:14.526Z").getTime();
334269
+ const buildTime = new Date("2026-07-01T10:12:07.638Z").getTime();
334270
334270
  if (isNaN(buildTime))
334271
334271
  return;
334272
334272
  return Math.floor((Date.now() - buildTime) / 60000);
@@ -358683,7 +358683,7 @@ function buildPrimarySection() {
358683
358683
  }, undefined, false, undefined, this);
358684
358684
  return [{
358685
358685
  label: "Version",
358686
- value: "0.1.34"
358686
+ value: "0.1.36"
358687
358687
  }, {
358688
358688
  label: "Session name",
358689
358689
  value: nameValue
@@ -470794,7 +470794,7 @@ function WelcomeV2() {
470794
470794
  dimColor: true,
470795
470795
  children: [
470796
470796
  "v",
470797
- "0.1.34",
470797
+ "0.1.36",
470798
470798
  " "
470799
470799
  ]
470800
470800
  }, undefined, true, undefined, this)
@@ -470994,7 +470994,7 @@ function WelcomeV2() {
470994
470994
  dimColor: true,
470995
470995
  children: [
470996
470996
  "v",
470997
- "0.1.34",
470997
+ "0.1.36",
470998
470998
  " "
470999
470999
  ]
471000
471000
  }, undefined, true, undefined, this)
@@ -471220,7 +471220,7 @@ function AppleTerminalWelcomeV2(t0) {
471220
471220
  dimColor: true,
471221
471221
  children: [
471222
471222
  "v",
471223
- "0.1.34",
471223
+ "0.1.36",
471224
471224
  " "
471225
471225
  ]
471226
471226
  }, undefined, true, undefined, this);
@@ -471474,7 +471474,7 @@ function AppleTerminalWelcomeV2(t0) {
471474
471474
  dimColor: true,
471475
471475
  children: [
471476
471476
  "v",
471477
- "0.1.34",
471477
+ "0.1.36",
471478
471478
  " "
471479
471479
  ]
471480
471480
  }, undefined, true, undefined, this);
@@ -509921,9 +509921,39 @@ async function testConnection(conn) {
509921
509921
  await runQuery(conn, "SELECT 1 AS ok");
509922
509922
  return true;
509923
509923
  }
509924
- var import_tedious;
509924
+ function assertReadOnlySelect(sql) {
509925
+ const cleaned = sql.trim().replace(/;\s*$/, "").trim();
509926
+ if (!cleaned)
509927
+ throw new ReadOnlyGuardError("Empty query.");
509928
+ if (cleaned.includes(";"))
509929
+ throw new ReadOnlyGuardError('Only a single statement is allowed (no ";" chaining).');
509930
+ if (cleaned.includes("--") || cleaned.includes("/*"))
509931
+ throw new ReadOnlyGuardError("Comments are not allowed in the query.");
509932
+ if (!/^(with|select)\b/i.test(cleaned))
509933
+ throw new ReadOnlyGuardError("Query must start with SELECT (or WITH … SELECT).");
509934
+ const banned = cleaned.match(FORBIDDEN_TOKENS);
509935
+ if (banned)
509936
+ throw new ReadOnlyGuardError(`Query contains a disallowed keyword: "${banned[0]}". Only read-only SELECTs are permitted.`);
509937
+ return cleaned;
509938
+ }
509939
+ async function runReadOnlySelect(conn, sql, maxRows = READONLY_ROW_CAP) {
509940
+ const gated = assertReadOnlySelect(sql);
509941
+ const cap = Math.max(1, Math.min(maxRows, READONLY_ROW_CAP));
509942
+ const batch = `SET ROWCOUNT ${cap};
509943
+ ${gated};
509944
+ SET ROWCOUNT 0;`;
509945
+ return runQuery(conn, batch);
509946
+ }
509947
+ var import_tedious, READONLY_ROW_CAP = 50, FORBIDDEN_TOKENS, ReadOnlyGuardError;
509925
509948
  var init_mssqlClient = __esm(() => {
509926
509949
  import_tedious = __toESM(require_tedious(), 1);
509950
+ FORBIDDEN_TOKENS = /\b(insert|update|delete|merge|drop|alter|truncate|create|exec|execute|grant|revoke|into|waitfor|shutdown|reconfigure|backup|restore|openrowset|openquery|opendatasource|bulk|sp_[a-z0-9_]+|xp_[a-z0-9_]+)\b/i;
509951
+ ReadOnlyGuardError = class ReadOnlyGuardError extends Error {
509952
+ constructor(message) {
509953
+ super(message);
509954
+ this.name = "ReadOnlyGuardError";
509955
+ }
509956
+ };
509927
509957
  });
509928
509958
 
509929
509959
  // src/utils/sql/spMetadata.ts
@@ -509980,6 +510010,35 @@ async function describeProcedure(conn, schema, name) {
509980
510010
  }
509981
510011
  return { schema, name, params, resultSet, resultSetUndescribable };
509982
510012
  }
510013
+ async function findProcedures(conn, name) {
510014
+ const bare = name.replace(/^.*\./, "");
510015
+ const rows = await runQuery(conn, `SELECT s.name AS [schema],
510016
+ p.name AS [name],
510017
+ CAST(ISNULL(OBJECTPROPERTY(p.object_id, 'IsEncrypted'), 0) AS INT) AS [isEncrypted],
510018
+ CAST(HAS_PERMS_BY_NAME(QUOTENAME(s.name) + N'.' + QUOTENAME(p.name),
510019
+ 'OBJECT', 'VIEW DEFINITION') AS INT) AS [canViewDef]
510020
+ FROM sys.procedures p
510021
+ JOIN sys.schemas s ON p.schema_id = s.schema_id
510022
+ WHERE p.name = @name
510023
+ ORDER BY CASE WHEN s.name = 'dbo' THEN 0 ELSE 1 END, s.name`, [{ name: "name", type: "NVarChar", value: bare }]);
510024
+ return rows.map((r) => ({
510025
+ schema: String(r.schema),
510026
+ name: String(r.name),
510027
+ isEncrypted: Number(r.isEncrypted) === 1,
510028
+ canViewDefinition: Number(r.canViewDef) === 1
510029
+ }));
510030
+ }
510031
+ async function getDbContext(conn) {
510032
+ const rows = await runQuery(conn, `SELECT DB_NAME() AS [database],
510033
+ SUSER_SNAME() AS [login],
510034
+ (SELECT COUNT(*) FROM sys.procedures) AS [visibleProcCount]`);
510035
+ const r = rows[0] ?? {};
510036
+ return {
510037
+ database: String(r.database ?? "(unknown)"),
510038
+ login: String(r.login ?? "(unknown)"),
510039
+ visibleProcCount: Number(r.visibleProcCount ?? 0)
510040
+ };
510041
+ }
509983
510042
  async function getProcedureDefinition(conn, schema, name) {
509984
510043
  const rows = await runQuery(conn, `SELECT OBJECT_DEFINITION(OBJECT_ID(@obj)) AS definition`, [{ name: "obj", type: "NVarChar", value: `${schema}.${name}` }]);
509985
510044
  const def2 = rows[0]?.definition;
@@ -510161,11 +510220,52 @@ ${params}
510161
510220
  First result set:
510162
510221
  ${cols}${GROUND}`;
510163
510222
  }
510223
+ async function resolveProc(conn, schema, name) {
510224
+ let matches;
510225
+ try {
510226
+ matches = await findProcedures(conn, name);
510227
+ } catch {
510228
+ return { schema, name };
510229
+ }
510230
+ if (matches.length === 0)
510231
+ return { schema, name };
510232
+ const exact = matches.find((m) => m.schema.toLowerCase() === schema.toLowerCase());
510233
+ const readable2 = matches.find((m) => m.canViewDefinition && !m.isEncrypted);
510234
+ const chosen = exact ?? readable2 ?? matches[0];
510235
+ return { schema: chosen.schema, name: chosen.name };
510236
+ }
510237
+ async function diagnoseMissingProc(conn, name) {
510238
+ let matches;
510239
+ let ctx;
510240
+ try {
510241
+ [matches, ctx] = await Promise.all([
510242
+ findProcedures(conn, name),
510243
+ getDbContext(conn)
510244
+ ]);
510245
+ } catch (e2) {
510246
+ return `Could not read "${name}", and the diagnostic query also failed: ${e2.message}. Ask the user to re-check the /sql connection.`;
510247
+ }
510248
+ const where = `database "${ctx.database}" as login "${ctx.login}" (${ctx.visibleProcCount} procedure(s) visible to this login)`;
510249
+ if (matches.length === 0) {
510250
+ return `No stored procedure named "${name}" is VISIBLE in ${where}. SQL Server hides objects a login has no permission on, so this means EITHER it does not exist in this database OR the connected login cannot see it. Do NOT tell the user the procedure "doesn't exist" — instead: (1) confirm the connection is on the right database (run /sql status); (2) confirm this login has VIEW DEFINITION / metadata access, or reconnect with a login that does. Then retry.`;
510251
+ }
510252
+ const lines = matches.map((m) => ` - ${m.schema}.${m.name}${m.isEncrypted ? " [WITH ENCRYPTION]" : ""}${m.canViewDefinition ? "" : " [login lacks VIEW DEFINITION]"}`).join(`
510253
+ `);
510254
+ const readable2 = matches.find((m) => m.canViewDefinition && !m.isEncrypted);
510255
+ const guidance = readable2 ? `It IS present and readable as ${readable2.schema}.${readable2.name} — re-run with that exact schema-qualified name.` : matches.some((m) => m.isEncrypted) ? `It exists but is defined WITH ENCRYPTION; its T-SQL cannot be read. Tell the user the source is unavailable.` : `It exists but login "${ctx.login}" lacks VIEW DEFINITION on it. Grant VIEW DEFINITION or reconnect with a privileged login.`;
510256
+ return `"${name}" was found in ${where}, under:
510257
+ ${lines}
510258
+
510259
+ ${guidance}`;
510260
+ }
510164
510261
  async function runSource(conn, schema, name) {
510165
- const def2 = await getProcedureDefinition(conn, schema, name);
510262
+ const r = await resolveProc(conn, schema, name);
510263
+ const def2 = await getProcedureDefinition(conn, r.schema, r.name);
510166
510264
  if (!def2) {
510167
- return `Could not read the source of ${schema}.${name}. Either it does not exist, or it is defined WITH ENCRYPTION (OBJECT_DEFINITION returns NULL for encrypted procedures). Do not guess its contents — tell the user it is unavailable.`;
510265
+ return await diagnoseMissingProc(conn, name);
510168
510266
  }
510267
+ schema = r.schema;
510268
+ name = r.name;
510169
510269
  const MAX = 24000;
510170
510270
  const body = def2.length > MAX ? `${def2.slice(0, MAX)}
510171
510271
  -- …[truncated; ${def2.length} chars total]…` : def2;
@@ -510205,6 +510305,70 @@ How to judge matches (ESQL LANGUAGE DATABASE rules):
510205
510305
  - REAL mismatches are: parameter COUNT, ORDER, direction (IN/OUT), type incompatibility, and \`DYNAMIC RESULT SETS <n>\` not matching the actual result-set count above (e.g. declaring RESULT SETS 1 when the DB proc returns none — this breaks any code reading the result set).
510206
510306
  Report concrete functional mismatches with file:line, or confirm it matches.${GROUND}`;
510207
510307
  }
510308
+ function renderCell(v) {
510309
+ if (v === null || v === undefined)
510310
+ return "NULL";
510311
+ if (v instanceof Date)
510312
+ return v.toISOString();
510313
+ if (typeof v === "object" && v !== null && "length" in v)
510314
+ return `0x${Buffer.from(v).toString("hex")}`;
510315
+ return String(v);
510316
+ }
510317
+ async function runQueryCmd(conn, sql) {
510318
+ let rows;
510319
+ try {
510320
+ rows = await runReadOnlySelect(conn, sql);
510321
+ } catch (e2) {
510322
+ if (e2 instanceof ReadOnlyGuardError)
510323
+ return `Query rejected by the read-only gate: ${e2.message}
510324
+
510325
+ Rewrite it as a single SELECT (or WITH … SELECT) with no other statements.`;
510326
+ return `Query failed: ${e2.message}. This is the real database error — report it; do not invent rows.`;
510327
+ }
510328
+ if (rows.length === 0)
510329
+ return `The SELECT returned NO rows. This is a real result — it means no row in the database matches those conditions. Do NOT fabricate values; tell the user no matching data exists (for an "error/not-found" case this may be exactly what you want).`;
510330
+ const cols = Object.keys(rows[0]);
510331
+ const lines = rows.map((r, i3) => `${i3 + 1}. ${cols.map((c6) => `${c6}=${renderCell(r[c6])}`).join(", ")}`).join(`
510332
+ `);
510333
+ return `Real rows from the live database (${rows.length}, capped at ${READONLY_ROW_CAP}):
510334
+ ${lines}
510335
+
510336
+ These are ACTUAL values from the database. Use them exactly as returned — never alter, round, or invent field values. State only what appears above; if a value is not shown, say it is not shown.`;
510337
+ }
510338
+ function runTestData(appName, caseHint) {
510339
+ const wanted = caseHint || "happy";
510340
+ return `Goal: produce REAL, runnable "${wanted}" test-data for the ACE application "${appName}", expressed as the application's request input body.
510341
+
510342
+ IMPORTANT: "${appName}" is an APPLICATION name (a project/folder in this workspace), NOT a stored procedure. One application typically calls one OR MORE stored procedures — you must find them ALL and gather test data for each.
510343
+
510344
+ Do this, in order:
510345
+
510346
+ 1. Locate the application in the workspace. Glob for its folder (e.g. \`**/${appName}/**\`); its ESQL lives under \`.../com/qiwa/esb/<appnamelowercase>/*.esql\` and its contract under \`.../${appName}/XSD&Swagger/\`.
510347
+ - If NO application named "${appName}" exists but a stored procedure by that name does, fall back to treating it as a single SP.
510348
+
510349
+ 2. Read the app's REQUEST contract: its XSD (\`XSD&Swagger/XSD/${appName}.xsd\`) → the input-body field names and types; skim the msgflow/ESQL to see how the request is shaped.
510350
+
510351
+ 3. Enumerate EVERY stored procedure the app calls. Grep the app's ESQL for:
510352
+ - \`EXTERNAL NAME "<schema>.<proc>"\` (LANGUAGE DATABASE procedure declarations), and their CALL sites,
510353
+ - any PASSTHRU / Database-node inline SQL.
510354
+ Collect the real \`schema.proc\` for each. List them for the user before continuing.
510355
+
510356
+ 4. For EACH stored procedure found:
510357
+ a. Fetch its REAL T-SQL by invoking the /sql skill with: source <schema.proc>
510358
+ (If the source is unavailable — encrypted or no VIEW DEFINITION — say so for that SP and skip to the next; do not fabricate its logic.)
510359
+ b. From that source, identify the driving table(s) and the WHERE/branch conditions the SP's input parameters flow into, for a "${wanted}" case:
510360
+ - happy → values that make the SP's main/success path return a row.
510361
+ - error/not-found → a key that does NOT exist, or values that hit the empty-result / validation branch.
510362
+ - boundary → real extremes (longest value, min/max, nullable edges) drawn from the actual data.
510363
+ c. Write ONE read-only SELECT that pulls a REAL row supplying those parameter values, and run it by invoking the /sql skill with: query <your SELECT>
510364
+ (single SELECT/CTE only; it runs through the read-only gate and returns actual rows).
510365
+
510366
+ 5. Combine the real values from all the SPs and map them back onto the app's REQUEST input-body fields — trace each SP parameter to the request field that feeds it (via the ESQL field→parameter mapping) and use the XSD field names.
510367
+
510368
+ 6. Return the finished request input body (XML matching the app's request schema) with concrete REAL values filled in. Then, per SP, show the exact SELECT you ran so the developer can see exactly where each value came from.
510369
+
510370
+ Data-handling notice (state once): these are REAL values from the connected database and may include personal/production data. Return them as-is; never fabricate. If a SELECT returns no rows, say so plainly — for a happy case it means no qualifying data exists; do not invent a row. If the app calls no stored procedures at all, build the input body from the XSD types alone and clearly mark those values as synthetic (no DB row backs them).`;
510371
+ }
510208
510372
  async function handle(args) {
510209
510373
  const trimmed = args.trim();
510210
510374
  if (!trimmed)
@@ -510299,6 +510463,20 @@ Do NOT attempt to answer database questions — you have no connection or data.`
510299
510463
  return `Failed to verify ${restStr}: ${e2.message}`;
510300
510464
  }
510301
510465
  }
510466
+ if (firstTok === "query") {
510467
+ if (!restStr)
510468
+ return "Usage: /sql query <SELECT …>";
510469
+ return await runQueryCmd(conn, restStr);
510470
+ }
510471
+ if (firstTok === "testdata" || firstTok === "test-data") {
510472
+ if (!restStr)
510473
+ return "Usage: /sql testdata <AppName> [happy|error|boundary] (AppName is the ACE application, not a stored procedure)";
510474
+ const caseMatch = restStr.match(/\b(happy|error|not[- ]?found|boundary|edge)\b/i);
510475
+ const caseHint = caseMatch?.[1]?.toLowerCase() ?? "";
510476
+ const withoutCase = caseMatch ? restStr.replace(caseMatch[0], " ") : restStr;
510477
+ const appName = withoutCase.trim().split(/\s+/)[0].replace(/[[\]"';,]/g, "");
510478
+ return runTestData(appName, caseHint);
510479
+ }
510302
510480
  const intent = inferIntent(trimmed);
510303
510481
  if (intent === "list" && !extractProcName(trimmed)) {
510304
510482
  try {
@@ -510327,9 +510505,9 @@ Do NOT attempt to answer database questions — you have no connection or data.`
510327
510505
  function registerSqlSkill() {
510328
510506
  registerBundledSkill({
510329
510507
  name: "sql",
510330
- description: "Connect to a SQL Server database (read-only) to list/describe stored procedures, generate the ESQL SP call, or verify how an ACE app calls an SP — all from live DB metadata.",
510331
- whenToUse: "When the user asks about the SQL database, stored procedures (their inputs/outputs), wants an ESQL stored-procedure CALL generated from the DB, or wants to verify SP parameters used inside an ACE application.",
510332
- argumentHint: "connect|status|procs|describe|gen|verify … (or plain English)",
510508
+ description: "Connect to a SQL Server database (read-only) to list/describe stored procedures, generate the ESQL SP call, verify how an ACE app calls an SP, or produce real test-data input for an application from live tables — all from live DB metadata and gated read-only SELECTs.",
510509
+ whenToUse: "When the user asks about the SQL database, stored procedures (their inputs/outputs), wants an ESQL stored-procedure CALL generated from the DB, wants to verify SP parameters used inside an ACE application, or wants real test-data for an ACE APPLICATION (a happy/error/boundary request input body) — discovering every SP the app calls and sampling actual rows from the database.",
510510
+ argumentHint: "connect|status|procs|describe|gen|verify|testdata|query … (or plain English)",
510333
510511
  userInvocable: true,
510334
510512
  allowedTools: ["Read", "Glob", "Grep"],
510335
510513
  async getPromptForCommand(args) {
@@ -510341,7 +510519,15 @@ function registerSqlSkill() {
510341
510519
  }
510342
510520
  });
510343
510521
  }
510344
- var HELP = `# /sql — SQL Server helper (native connection)
510522
+ var HELP, GROUND = `
510523
+
510524
+ IMPORTANT: The metadata above is the ONLY database information you have — you cannot query the DB yourself. State only what appears above; never invent, guess, or "fill in" parameters, columns, types, or procedures. If something is not shown, say it is not shown.`, STOPWORDS;
510525
+ var init_sql = __esm(() => {
510526
+ init_bundledSkills();
510527
+ init_connectionStore();
510528
+ init_mssqlClient();
510529
+ init_spMetadata();
510530
+ HELP = `# /sql — SQL Server helper (native connection)
510345
510531
 
510346
510532
  Subcommands (also understands plain English, e.g. "/sql details of the SP Get_UserInformation"):
510347
510533
  - \`/sql connect server=HOST database=DB user=USER password=PASS [port=1433] [encrypt=false]\` — save the connection once (OS secure vault; password never written to disk in plaintext).
@@ -510352,15 +510538,10 @@ Subcommands (also understands plain English, e.g. "/sql details of the SP Get_Us
510352
510538
  - \`/sql source <schema.proc>\` — the actual T-SQL body of the procedure (read the real code).
510353
510539
  - \`/sql gen <schema.proc>\` — generate the ESQL PROCEDURE declaration + CALL.
510354
510540
  - \`/sql verify <schema.proc>\` — pull the real SP signature, then check how this project's ESQL calls it.
510541
+ - \`/sql testdata <AppName> [happy|error|boundary]\` — for an ACE APPLICATION, find EVERY stored procedure it calls, read each SP's real T-SQL, pull REAL matching rows from the database, and return the application's request input body.
510542
+ - \`/sql query <SELECT …>\` — run one read-only SELECT (SELECT/CTE only, capped to ${READONLY_ROW_CAP} rows). Used by /sql testdata to fetch real rows.
510355
510543
 
510356
- Everything is read-only and every answer comes from live DB metadata.`, GROUND = `
510357
-
510358
- IMPORTANT: The metadata above is the ONLY database information you have — you cannot query the DB yourself. State only what appears above; never invent, guess, or "fill in" parameters, columns, types, or procedures. If something is not shown, say it is not shown.`, STOPWORDS;
510359
- var init_sql = __esm(() => {
510360
- init_bundledSkills();
510361
- init_connectionStore();
510362
- init_mssqlClient();
510363
- init_spMetadata();
510544
+ Metadata/verify/gen are read-only catalog lookups. \`testdata\`/\`query\` execute a single gated SELECT against real tables and return ACTUAL data (which may include personal/production data).`;
510364
510545
  STOPWORDS = new Set([
510365
510546
  "sp",
510366
510547
  "the",
@@ -527012,7 +527193,7 @@ Usage: orbit --remote "your task description"`, () => gracefulShutdown(1));
527012
527193
  pendingHookMessages
527013
527194
  }, renderAndRun);
527014
527195
  }
527015
- }).version("0.1.34 (Orbit AI)", "-v, --version", "Output the version number");
527196
+ }).version("0.1.36 (Orbit AI)", "-v, --version", "Output the version number");
527016
527197
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
527017
527198
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
527018
527199
  if (canUserConfigureAdvisor()) {
@@ -527534,7 +527715,7 @@ if (false) {}
527534
527715
  async function main2() {
527535
527716
  const args = process.argv.slice(2);
527536
527717
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
527537
- console.log(`${"0.1.34"} (Orbit AI)`);
527718
+ console.log(`${"0.1.36"} (Orbit AI)`);
527538
527719
  return;
527539
527720
  }
527540
527721
  if (args.includes("--provider")) {
@@ -527638,4 +527819,4 @@ async function main2() {
527638
527819
  }
527639
527820
  main2();
527640
527821
 
527641
- //# debugId=2DF01C013452CDF264756E2164756E21
527822
+ //# debugId=AFCC06C9D77C087364756E2164756E21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orbit-code-ai",
3
- "version": "0.1.34",
3
+ "version": "0.1.36",
4
4
  "description": "Orbit AI – Your AI-powered IBM ACE coding companion",
5
5
  "type": "module",
6
6
  "author": "moenawaf",