@askexenow/exe-os 0.9.81 → 0.9.82

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.
@@ -17944,7 +17944,7 @@ init_config();
17944
17944
  import { z as z39 } from "zod";
17945
17945
  var FETCH_TIMEOUT_MS = 1e4;
17946
17946
  var QUERY_SCOPE = z39.enum(["raw", "crm", "wiki", "memory", "gateway", "all"]);
17947
- var QUERY_ACTION = z39.enum(["search", "list_sources"]);
17947
+ var QUERY_ACTION = z39.enum(["search", "list_sources", "sql"]);
17948
17948
  var LOCAL_GATEWAY_HTTP_HOSTS = /^(localhost|127\.0\.0\.1|::1|exe-gateway|gateway)$/i;
17949
17949
  function assertSecureGatewayUrlForToken(gatewayUrl, authToken) {
17950
17950
  if (!authToken) return;
@@ -17979,14 +17979,15 @@ function registerQueryCompanyBrain(server2) {
17979
17979
  title: "Query Company Brain",
17980
17980
  description: "Search the Company Brain \u2014 queries across all data (raw events, wiki docs, agent memories, gateway messages).",
17981
17981
  inputSchema: {
17982
- action: QUERY_ACTION.default("search").describe("search = search exe-db; list_sources = list available raw/CRM/wiki/memory/gateway sources"),
17982
+ action: QUERY_ACTION.default("search").describe("search = search exe-db; list_sources = list available sources; sql = run read-only SQL through gateway"),
17983
17983
  query: z39.string().optional().describe("Search text. Required for action=search."),
17984
+ sql: z39.string().optional().describe("Read-only SELECT/WITH SQL. Required for action=sql."),
17984
17985
  scope: QUERY_SCOPE.default("all").describe("Which data scope to search/read (raw, crm, wiki, memory, gateway, all)"),
17985
17986
  source: z39.string().optional().describe("Filter raw events by source (shopify, asana, etc.)"),
17986
17987
  limit: z39.coerce.number().int().min(1).max(100).default(20).describe("Max results per scope")
17987
17988
  }
17988
17989
  },
17989
- async ({ action, query, scope, source, limit }) => {
17990
+ async ({ action, query, sql, scope, source, limit }) => {
17990
17991
  const resolvedAction = action ?? "search";
17991
17992
  if (resolvedAction === "search" && !query?.trim()) {
17992
17993
  return {
@@ -17994,6 +17995,12 @@ function registerQueryCompanyBrain(server2) {
17994
17995
  isError: true
17995
17996
  };
17996
17997
  }
17998
+ if (resolvedAction === "sql" && !sql?.trim()) {
17999
+ return {
18000
+ content: [{ type: "text", text: "sql is required when action=sql" }],
18001
+ isError: true
18002
+ };
18003
+ }
17997
18004
  const config2 = await loadConfig();
17998
18005
  const gatewayUrl = config2.gateway?.url || process.env.EXE_GATEWAY_URL;
17999
18006
  const authToken = config2.gateway?.authToken || process.env.EXE_GATEWAY_QUERY_AUTH_TOKEN || process.env.EXE_COMPANY_BRAIN_AUTH_TOKEN || process.env.EXE_GATEWAY_AUTH_TOKEN;
@@ -18022,7 +18029,10 @@ function registerQueryCompanyBrain(server2) {
18022
18029
  }
18023
18030
  let url;
18024
18031
  try {
18025
- url = new URL(resolvedAction === "list_sources" ? "/query/sources" : "/query", gatewayUrl);
18032
+ url = new URL(
18033
+ resolvedAction === "list_sources" ? "/query/sources" : resolvedAction === "sql" ? "/query/sql" : "/query",
18034
+ gatewayUrl
18035
+ );
18026
18036
  } catch (err) {
18027
18037
  return {
18028
18038
  content: [
@@ -18042,7 +18052,12 @@ function registerQueryCompanyBrain(server2) {
18042
18052
  }
18043
18053
  try {
18044
18054
  const response = await fetch(url.toString(), {
18045
- headers: authToken ? { Authorization: `Bearer ${authToken}` } : {},
18055
+ method: resolvedAction === "sql" ? "POST" : "GET",
18056
+ headers: {
18057
+ ...authToken ? { Authorization: `Bearer ${authToken}` } : {},
18058
+ ...resolvedAction === "sql" ? { "Content-Type": "application/json" } : {}
18059
+ },
18060
+ body: resolvedAction === "sql" ? JSON.stringify({ sql: sql.trim(), max_rows: limit }) : void 0,
18046
18061
  signal: AbortSignal.timeout(FETCH_TIMEOUT_MS)
18047
18062
  });
18048
18063
  if (!response.ok) {
@@ -18552,10 +18567,10 @@ function registerExportGraph(server2) {
18552
18567
  format: z44.enum(["html", "markdown"]).default("markdown").describe("Export format: markdown (inline) or html (file)")
18553
18568
  }
18554
18569
  },
18555
- async ({ format }) => {
18570
+ async ({ format: format2 }) => {
18556
18571
  try {
18557
18572
  const client = getClient();
18558
- if (format === "markdown") {
18573
+ if (format2 === "markdown") {
18559
18574
  const report = await generateGraphReport(client);
18560
18575
  return {
18561
18576
  content: [{ type: "text", text: report }]
@@ -27049,23 +27064,89 @@ function registerRawData(server2) {
27049
27064
  });
27050
27065
  }
27051
27066
 
27067
+ // src/mcp/tools/company-actions.ts
27068
+ init_config();
27069
+ import { z as z87 } from "zod";
27070
+ var FETCH_TIMEOUT_MS5 = 15e3;
27071
+ var ACTION = z87.enum(["list_connectors", "describe_connector", "preview", "execute", "list_runs", "get_run"]);
27072
+ function format(payload) {
27073
+ return ["# Company Actions", "", JSON.stringify(payload, null, 2)].join("\n");
27074
+ }
27075
+ function registerCompanyActions(server2) {
27076
+ server2.registerTool(
27077
+ "company_actions",
27078
+ {
27079
+ title: "Company Actions",
27080
+ description: "Preview and execute external connector actions (Asana, WhatsApp) through exe-gateway with audit/safety gates.",
27081
+ inputSchema: {
27082
+ action: ACTION.describe("list_connectors, describe_connector, preview, execute, list_runs, get_run"),
27083
+ connector: z87.string().optional().describe("Connector to use, e.g. asana, whatsapp, airtable, notion"),
27084
+ connector_ref: z87.string().optional().describe("Exact connector ref from list_connectors when connector names overlap"),
27085
+ operation: z87.string().optional().describe("Connector operation, e.g. create_task or send_message"),
27086
+ payload: z87.record(z87.string(), z87.unknown()).optional().describe("Operation payload"),
27087
+ idempotency_key: z87.string().optional().describe("Stable key to prevent duplicate execution"),
27088
+ confirm_token: z87.string().optional().describe("Optional future approval token"),
27089
+ run_id: z87.string().optional().describe("Run id for get_run")
27090
+ }
27091
+ },
27092
+ async (input) => {
27093
+ const config2 = await loadConfig();
27094
+ const gatewayUrl = config2.gateway?.url || process.env.EXE_GATEWAY_URL;
27095
+ const authToken = config2.gateway?.authToken || process.env.EXE_GATEWAY_QUERY_AUTH_TOKEN || process.env.EXE_COMPANY_BRAIN_AUTH_TOKEN || process.env.EXE_GATEWAY_AUTH_TOKEN;
27096
+ if (!gatewayUrl) {
27097
+ return { content: [{ type: "text", text: "Company Actions not configured. Set gateway.url in ~/.exe-os/config.json" }] };
27098
+ }
27099
+ try {
27100
+ assertSecureGatewayUrlForToken(gatewayUrl, authToken);
27101
+ } catch (err) {
27102
+ return { content: [{ type: "text", text: err instanceof Error ? err.message : String(err) }], isError: true };
27103
+ }
27104
+ let url;
27105
+ try {
27106
+ url = new URL("/actions", gatewayUrl);
27107
+ } catch (err) {
27108
+ return { content: [{ type: "text", text: `Company Actions not configured. Invalid gateway.url: ${err instanceof Error ? err.message : String(err)}` }], isError: true };
27109
+ }
27110
+ try {
27111
+ const response = await fetch(url.toString(), {
27112
+ method: "POST",
27113
+ headers: {
27114
+ "Content-Type": "application/json",
27115
+ ...authToken ? { Authorization: `Bearer ${authToken}` } : {}
27116
+ },
27117
+ body: JSON.stringify(input),
27118
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS5)
27119
+ });
27120
+ const contentType = response.headers.get("content-type") ?? "";
27121
+ const payload = contentType.includes("application/json") ? await response.json() : await response.text();
27122
+ return {
27123
+ content: [{ type: "text", text: response.ok ? format(payload) : `Company Actions failed (${response.status}): ${typeof payload === "string" ? payload : JSON.stringify(payload)}` }],
27124
+ ...response.ok ? {} : { isError: true }
27125
+ };
27126
+ } catch {
27127
+ return { content: [{ type: "text", text: `Gateway unreachable at ${url.origin}` }], isError: true };
27128
+ }
27129
+ }
27130
+ );
27131
+ }
27132
+
27052
27133
  // src/mcp/tools/create-bug-report.ts
27053
27134
  init_embedder();
27054
27135
  init_active_agent();
27055
27136
  init_config();
27056
27137
  init_license();
27057
27138
  init_store();
27058
- import { z as z87 } from "zod";
27139
+ import { z as z88 } from "zod";
27059
27140
  import crypto18 from "crypto";
27060
27141
  import { mkdir as mkdir6, writeFile as writeFile7 } from "fs/promises";
27061
27142
  import path49 from "path";
27062
- var CLASSIFICATION = z87.enum([
27143
+ var CLASSIFICATION = z88.enum([
27063
27144
  "upstream_bug",
27064
27145
  "customer_customization",
27065
27146
  "emergency_hotfix",
27066
27147
  "unclear"
27067
27148
  ]);
27068
- var SEVERITY = z87.enum(["p0", "p1", "p2", "p3"]);
27149
+ var SEVERITY = z88.enum(["p0", "p1", "p2", "p3"]);
27069
27150
  function slugify2(input) {
27070
27151
  return input.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 80) || "bug-report";
27071
27152
  }
@@ -27145,22 +27226,22 @@ function registerCreateBugReport(server2) {
27145
27226
  title: "Create Bug Report",
27146
27227
  description: "Classify and file an exe-os issue as upstream_bug, customer_customization, emergency_hotfix, or unclear. Writes a local report, stores memory, and optionally sends to AskExe support when a support endpoint is configured.",
27147
27228
  inputSchema: {
27148
- title: z87.string().min(3).describe("Short descriptive title"),
27229
+ title: z88.string().min(3).describe("Short descriptive title"),
27149
27230
  classification: CLASSIFICATION.describe(
27150
27231
  "upstream_bug = platform defect; customer_customization = local preference; emergency_hotfix = temporary local patch; unclear = needs maintainer triage"
27151
27232
  ),
27152
27233
  severity: SEVERITY.default("p2").describe("p0 critical \u2192 p3 low"),
27153
- summary: z87.string().min(10).describe("What happened and why it matters"),
27154
- customer_impact: z87.string().optional().describe("How this affects the customer/founder"),
27155
- reproduction_steps: z87.array(z87.string()).optional().describe("Steps to reproduce"),
27156
- expected: z87.string().optional().describe("Expected behavior"),
27157
- actual: z87.string().optional().describe("Actual behavior"),
27158
- files_changed: z87.array(z87.string()).optional().describe("Files changed or suspected"),
27159
- workaround: z87.string().optional().describe("Temporary local workaround/hotfix, if any"),
27160
- local_patch_diff: z87.string().optional().describe("Small local diff or patch summary"),
27161
- package_version: z87.string().optional().describe("Installed @askexenow/exe-os version"),
27162
- project_name: z87.string().optional().describe("Project/customer context"),
27163
- send_upstream: z87.boolean().default(true).describe("Attempt to POST to configured AskExe support endpoint")
27234
+ summary: z88.string().min(10).describe("What happened and why it matters"),
27235
+ customer_impact: z88.string().optional().describe("How this affects the customer/founder"),
27236
+ reproduction_steps: z88.array(z88.string()).optional().describe("Steps to reproduce"),
27237
+ expected: z88.string().optional().describe("Expected behavior"),
27238
+ actual: z88.string().optional().describe("Actual behavior"),
27239
+ files_changed: z88.array(z88.string()).optional().describe("Files changed or suspected"),
27240
+ workaround: z88.string().optional().describe("Temporary local workaround/hotfix, if any"),
27241
+ local_patch_diff: z88.string().optional().describe("Small local diff or patch summary"),
27242
+ package_version: z88.string().optional().describe("Installed @askexenow/exe-os version"),
27243
+ project_name: z88.string().optional().describe("Project/customer context"),
27244
+ send_upstream: z88.boolean().default(true).describe("Attempt to POST to configured AskExe support endpoint")
27164
27245
  }
27165
27246
  },
27166
27247
  async ({
@@ -27269,7 +27350,7 @@ Upstream status: ${upstreamStatus}`
27269
27350
  }
27270
27351
 
27271
27352
  // src/mcp/tools/support.ts
27272
- import { z as z88 } from "zod";
27353
+ import { z as z89 } from "zod";
27273
27354
 
27274
27355
  // src/bin/exe-support.ts
27275
27356
  init_config();
@@ -27532,7 +27613,7 @@ function registerSupportTools(server2) {
27532
27613
  title: "Support Test",
27533
27614
  description: "End-to-end support intake smoke test. Files a clearly marked test report upstream and auto-closes it on AskExe machines with admin credentials.",
27534
27615
  inputSchema: {
27535
- project: z88.string().default("support-smoke").describe("Customer/project name, e.g. hygo")
27616
+ project: z89.string().default("support-smoke").describe("Customer/project name, e.g. hygo")
27536
27617
  }
27537
27618
  },
27538
27619
  async ({ project }) => {
@@ -27549,7 +27630,7 @@ function registerSupportTools(server2) {
27549
27630
  // src/mcp/tools/cli-parity.ts
27550
27631
  import { execFile as execFile2 } from "child_process";
27551
27632
  import { promisify as promisify2 } from "util";
27552
- import { z as z89 } from "zod";
27633
+ import { z as z90 } from "zod";
27553
27634
 
27554
27635
  // src/bin/exe-status.ts
27555
27636
  init_employees();
@@ -28055,12 +28136,12 @@ function registerCliParityTools(server2) {
28055
28136
  title: "Doctor",
28056
28137
  description: "Run exe-os doctor audit. Defaults to read-only diagnostics; optional dry-run/fix flags mirror CLI.",
28057
28138
  inputSchema: {
28058
- agent: z89.string().optional(),
28059
- project: z89.string().optional(),
28060
- verbose: z89.boolean().default(false),
28061
- conflicts: z89.boolean().default(false),
28062
- dry_run: z89.boolean().default(false),
28063
- fix: z89.boolean().default(false)
28139
+ agent: z90.string().optional(),
28140
+ project: z90.string().optional(),
28141
+ verbose: z90.boolean().default(false),
28142
+ conflicts: z90.boolean().default(false),
28143
+ dry_run: z90.boolean().default(false),
28144
+ fix: z90.boolean().default(false)
28064
28145
  }
28065
28146
  }, async ({ agent, project, verbose, conflicts, dry_run, fix }) => {
28066
28147
  const args = [];
@@ -28077,9 +28158,9 @@ function registerCliParityTools(server2) {
28077
28158
  title: "Rename Employee",
28078
28159
  description: "Rename an employee using the same path as `exe-os rename <old> <new>`. Use for customer roster/identity renames.",
28079
28160
  inputSchema: {
28080
- old_name: z89.string().min(1),
28081
- new_name: z89.string().min(1),
28082
- dry_run: z89.boolean().default(false)
28161
+ old_name: z90.string().min(1),
28162
+ new_name: z90.string().min(1),
28163
+ dry_run: z90.boolean().default(false)
28083
28164
  }
28084
28165
  }, async ({ old_name, new_name, dry_run }) => {
28085
28166
  if (dry_run) {
@@ -28092,7 +28173,7 @@ function registerCliParityTools(server2) {
28092
28173
  server2.registerTool("status_brief", {
28093
28174
  title: "Status Brief",
28094
28175
  description: "Return current employee/tmux status. Mirrors `exe-status` and supports optional deep view for one employee.",
28095
- inputSchema: { employee: z89.string().optional() }
28176
+ inputSchema: { employee: z90.string().optional() }
28096
28177
  }, async ({ employee }) => {
28097
28178
  const text3 = await status(employee);
28098
28179
  return result2(text3, { ok: true, employee: employee ?? null });
@@ -28100,7 +28181,7 @@ function registerCliParityTools(server2) {
28100
28181
  server2.registerTool("pending_work_summary", {
28101
28182
  title: "Pending Work Summary",
28102
28183
  description: "Return pending reviews, messages, and notifications using the same summaries as the CLI tools.",
28103
- inputSchema: { agent: z89.string().optional() }
28184
+ inputSchema: { agent: z90.string().optional() }
28104
28185
  }, async ({ agent }) => {
28105
28186
  const parts = await Promise.all([
28106
28187
  runCommand("exe-pending-reviews", [], 3e4),
@@ -28121,7 +28202,7 @@ function registerCliParityTools(server2) {
28121
28202
  server2.registerTool("key_rotation_preflight", {
28122
28203
  title: "Key Rotation Preflight",
28123
28204
  description: "Dry-run key rotation/update preflight. No destructive changes.",
28124
- inputSchema: { mode: z89.enum(["rotate", "update"]).default("rotate") }
28205
+ inputSchema: { mode: z90.enum(["rotate", "update"]).default("rotate") }
28125
28206
  }, async ({ mode }) => {
28126
28207
  const out = await runCommand("exe-os", ["key", mode, "--dry-run"], 6e4);
28127
28208
  return result2(out.text, { ok: out.ok, command: out.command, mode }, !out.ok);
@@ -28140,11 +28221,11 @@ function registerCliParityTools(server2) {
28140
28221
  title: "Stack Update Check",
28141
28222
  description: "Plan/check a customer stack update without applying Docker changes. Mirrors `exe-os stack-update --check`.",
28142
28223
  inputSchema: {
28143
- target: z89.string().optional(),
28144
- manifest: z89.string().optional(),
28145
- compose_file: z89.string().optional(),
28146
- env_file: z89.string().optional(),
28147
- deployment_persona: z89.enum(["customer", "askexe-control-plane"]).default("customer")
28224
+ target: z90.string().optional(),
28225
+ manifest: z90.string().optional(),
28226
+ compose_file: z90.string().optional(),
28227
+ env_file: z90.string().optional(),
28228
+ deployment_persona: z90.enum(["customer", "askexe-control-plane"]).default("customer")
28148
28229
  }
28149
28230
  }, async ({ target, manifest, compose_file, env_file, deployment_persona }) => {
28150
28231
  const args = ["stack-update", "--check", "--deployment-persona", deployment_persona];
@@ -28168,7 +28249,7 @@ function registerCliParityTools(server2) {
28168
28249
  // src/mcp/tools/get-session-events.ts
28169
28250
  init_active_agent();
28170
28251
  init_fast_db_init();
28171
- import { z as z90 } from "zod";
28252
+ import { z as z91 } from "zod";
28172
28253
 
28173
28254
  // src/lib/session-events.ts
28174
28255
  init_task_scope();
@@ -28255,7 +28336,7 @@ async function listRecentSessionEvents(client, options) {
28255
28336
  }
28256
28337
 
28257
28338
  // src/mcp/tools/get-session-events.ts
28258
- var EVENT_TYPE = z90.enum([
28339
+ var EVENT_TYPE = z91.enum([
28259
28340
  "user_prompt",
28260
28341
  "assistant_response",
28261
28342
  "tool_call",
@@ -28285,11 +28366,11 @@ function registerGetSessionEvents(server2) {
28285
28366
  title: "Get Session Events",
28286
28367
  description: "Return exact recent chronological user prompts, assistant responses, and tool calls from the append-only session journal. Use this when asked what happened last, not semantic memory search.",
28287
28368
  inputSchema: {
28288
- agent_id: z90.string().optional().describe("Agent to inspect. Defaults to active agent. COO/CTO may inspect others."),
28289
- session_id: z90.string().optional().describe("Optional exact runtime session id."),
28369
+ agent_id: z91.string().optional().describe("Agent to inspect. Defaults to active agent. COO/CTO may inspect others."),
28370
+ session_id: z91.string().optional().describe("Optional exact runtime session id."),
28290
28371
  event_type: EVENT_TYPE.optional().describe("Filter to one event type."),
28291
- project_name: z90.string().optional().describe("Optional project filter. Pass 'all' for all projects."),
28292
- limit: z90.number().int().min(1).max(100).default(20).describe("Number of events to return.")
28372
+ project_name: z91.string().optional().describe("Optional project filter. Pass 'all' for all projects."),
28373
+ limit: z91.number().int().min(1).max(100).default(20).describe("Number of events to return.")
28293
28374
  }
28294
28375
  },
28295
28376
  async ({ agent_id, session_id, event_type, project_name, limit }) => {
@@ -28325,8 +28406,8 @@ function registerGetLastAssistantResponse(server2) {
28325
28406
  title: "Get Last Assistant Response",
28326
28407
  description: "Return the exact last assistant response for an agent from the session event journal. Use for 'what was the last thing you said?'",
28327
28408
  inputSchema: {
28328
- agent_id: z90.string().optional().describe("Agent to inspect. Defaults to active agent. COO/CTO may inspect others."),
28329
- project_name: z90.string().optional().describe("Optional project filter. Pass 'all' for all projects.")
28409
+ agent_id: z91.string().optional().describe("Agent to inspect. Defaults to active agent. COO/CTO may inspect others."),
28410
+ project_name: z91.string().optional().describe("Optional project filter. Pass 'all' for all projects.")
28330
28411
  }
28331
28412
  },
28332
28413
  async ({ agent_id, project_name }) => {
@@ -28356,7 +28437,7 @@ function registerGetLastAssistantResponse(server2) {
28356
28437
  }
28357
28438
 
28358
28439
  // src/mcp/tools/code-context.ts
28359
- import { z as z91 } from "zod";
28440
+ import { z as z92 } from "zod";
28360
28441
 
28361
28442
  // src/lib/code-context-index.ts
28362
28443
  init_config();
@@ -28772,19 +28853,19 @@ function registerCodeContext(server2) {
28772
28853
  title: "Code Context",
28773
28854
  description: "Persistent codebase context engine. One consolidated tool to avoid MCP bloat. Actions: index, search, trace, blast_radius, stats.",
28774
28855
  inputSchema: {
28775
- action: z91.enum(["index", "search", "trace", "blast_radius", "stats"]).describe("Code context operation"),
28776
- project_root: z91.string().optional().describe("Repository root. Defaults to current working directory."),
28777
- query: z91.string().optional().describe("Search query for action=search"),
28778
- symbol: z91.string().optional().describe("Symbol/function/class/type name for trace or blast_radius"),
28779
- file_path: z91.string().optional().describe("File path for blast_radius"),
28780
- force: z91.boolean().optional().describe("Force rebuild before answering"),
28781
- limit: z91.coerce.number().int().min(1).max(100).optional().describe("Max results"),
28782
- offset: z91.coerce.number().int().min(0).optional().describe("Search pagination offset"),
28783
- refresh_index: z91.boolean().optional().describe("Refresh/rebuild index before searching"),
28784
- languages: z91.array(z91.string()).optional().describe('Language filters, e.g. ["python", "typescript"]'),
28785
- paths: z91.array(z91.string()).optional().describe("Path/glob filters"),
28786
- depth: z91.coerce.number().int().min(1).max(5).optional().describe("Dependent traversal depth for blast_radius"),
28787
- max_files: z91.coerce.number().int().min(1).max(1e4).optional().describe("Max code files to index")
28856
+ action: z92.enum(["index", "search", "trace", "blast_radius", "stats"]).describe("Code context operation"),
28857
+ project_root: z92.string().optional().describe("Repository root. Defaults to current working directory."),
28858
+ query: z92.string().optional().describe("Search query for action=search"),
28859
+ symbol: z92.string().optional().describe("Symbol/function/class/type name for trace or blast_radius"),
28860
+ file_path: z92.string().optional().describe("File path for blast_radius"),
28861
+ force: z92.boolean().optional().describe("Force rebuild before answering"),
28862
+ limit: z92.coerce.number().int().min(1).max(100).optional().describe("Max results"),
28863
+ offset: z92.coerce.number().int().min(0).optional().describe("Search pagination offset"),
28864
+ refresh_index: z92.boolean().optional().describe("Refresh/rebuild index before searching"),
28865
+ languages: z92.array(z92.string()).optional().describe('Language filters, e.g. ["python", "typescript"]'),
28866
+ paths: z92.array(z92.string()).optional().describe("Path/glob filters"),
28867
+ depth: z92.coerce.number().int().min(1).max(5).optional().describe("Dependent traversal depth for blast_radius"),
28868
+ max_files: z92.coerce.number().int().min(1).max(1e4).optional().describe("Max code files to index")
28788
28869
  }
28789
28870
  }, async ({ action, project_root, query, symbol, file_path, force, limit, offset, refresh_index, languages, paths, depth, max_files }) => {
28790
28871
  const opts = { projectRoot: project_root, force, maxFiles: max_files };
@@ -28829,9 +28910,9 @@ function registerCodeContext(server2) {
28829
28910
  }
28830
28911
 
28831
28912
  // src/mcp/tools/support-inbox.ts
28832
- import { z as z92 } from "zod";
28913
+ import { z as z93 } from "zod";
28833
28914
  var DEFAULT_ENDPOINT = "https://askexe.com/admin/support/bug-reports";
28834
- var STATUS = z92.enum(["open", "triaged", "fixed", "closed", "wontfix"]);
28915
+ var STATUS = z93.enum(["open", "triaged", "fixed", "closed", "wontfix"]);
28835
28916
  function adminToken() {
28836
28917
  return process.env.ASKEXE_SUPPORT_ADMIN_TOKEN || process.env.EXE_SUPPORT_ADMIN_TOKEN;
28837
28918
  }
@@ -28870,9 +28951,9 @@ function registerListBugReports(server2) {
28870
28951
  title: "List Bug Reports",
28871
28952
  description: "AskExe-internal only: list incoming customer bug reports from the support inbox.",
28872
28953
  inputSchema: {
28873
- status: z92.enum(["all", "open", "triaged", "fixed", "closed", "wontfix"]).default("open"),
28874
- severity: z92.enum(["p0", "p1", "p2", "p3"]).optional(),
28875
- limit: z92.number().int().min(1).max(100).default(25)
28954
+ status: z93.enum(["all", "open", "triaged", "fixed", "closed", "wontfix"]).default("open"),
28955
+ severity: z93.enum(["p0", "p1", "p2", "p3"]).optional(),
28956
+ limit: z93.number().int().min(1).max(100).default(25)
28876
28957
  }
28877
28958
  },
28878
28959
  async ({ status: status2, severity, limit }) => {
@@ -28891,7 +28972,7 @@ function registerGetBugReport(server2) {
28891
28972
  {
28892
28973
  title: "Get Bug Report",
28893
28974
  description: "AskExe-internal only: fetch one customer bug report with full markdown payload.",
28894
- inputSchema: { id: z92.string().min(8) }
28975
+ inputSchema: { id: z93.string().min(8) }
28895
28976
  },
28896
28977
  async ({ id }) => {
28897
28978
  const data = await requestJson(`${endpoint()}/${encodeURIComponent(id)}`);
@@ -28906,12 +28987,12 @@ function registerTriageBugReport(server2) {
28906
28987
  title: "Triage Bug Report",
28907
28988
  description: "AskExe-internal only: update bug report status and link task/commit/release metadata.",
28908
28989
  inputSchema: {
28909
- id: z92.string().min(8),
28990
+ id: z93.string().min(8),
28910
28991
  status: STATUS.optional(),
28911
- triage_notes: z92.string().optional(),
28912
- linked_task_id: z92.string().optional(),
28913
- linked_commit: z92.string().optional(),
28914
- fixed_version: z92.string().optional()
28992
+ triage_notes: z93.string().optional(),
28993
+ linked_task_id: z93.string().optional(),
28994
+ linked_commit: z93.string().optional(),
28995
+ fixed_version: z93.string().optional()
28915
28996
  }
28916
28997
  },
28917
28998
  async ({ id, status: status2, triage_notes, linked_task_id, linked_commit, fixed_version }) => {
@@ -28947,7 +29028,7 @@ var TOOL_GATES = {
28947
29028
  documents: ["COO", "CTO", "Wiki Agent"],
28948
29029
  // ingest, list, purge, set_importance, rerank
28949
29030
  gateway: ["COO", "Gateway Agent"],
28950
- // send_whatsapp, query_conversations, query_company_brain
29031
+ // send_whatsapp, query_conversations, query_company_brain, company_actions
28951
29032
  admin: ["COO"],
28952
29033
  // deploy, backup, daemon health, auto-wake, worker gate, memory audit, consolidation, cloud sync, agent config, list employees, agent spend, sessions, session kills
28953
29034
  licensing: ["COO"],
@@ -29036,6 +29117,7 @@ var TOOL_CATEGORIES = {
29036
29117
  registerSendWhatsapp: "gateway",
29037
29118
  registerQueryConversations: "gateway",
29038
29119
  registerQueryCompanyBrain: "gateway",
29120
+ registerCompanyActions: "gateway",
29039
29121
  // admin
29040
29122
  registerConfig: "admin",
29041
29123
  registerDeployClient: "admin",
@@ -29300,6 +29382,7 @@ function registerAllTools(server2) {
29300
29382
  }
29301
29383
  if (exposeLegacyGateway) {
29302
29384
  gate("registerQueryCompanyBrain", registerQueryCompanyBrain);
29385
+ gate("registerCompanyActions", registerCompanyActions);
29303
29386
  }
29304
29387
  }
29305
29388
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askexenow/exe-os",
3
- "version": "0.9.81",
3
+ "version": "0.9.82",
4
4
  "description": "AI employee operating system — persistent memory, task management, and multi-agent coordination for Claude Code.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",
@@ -4,8 +4,8 @@
4
4
  "repo": "AskExe/exe-os",
5
5
  "service": "exed",
6
6
  "packageName": "@askexenow/exe-os",
7
- "version": "0.9.3",
8
- "image": "ghcr.io/askexe/exed:v0.9.3",
7
+ "version": "0.9.5",
8
+ "image": "ghcr.io/askexe/exed:v0.9.5",
9
9
  "imageEnv": "EXED_IMAGE_TAG",
10
10
  "stackParticipation": {
11
11
  "required": true,
@@ -42,8 +42,9 @@
42
42
  "breakingChanges": [],
43
43
  "dataSovereignty": "Customer-local memory/tasks/behaviors stay in SQLCipher/local storage. Updates must not overwrite roster, identity, behavior, or local memory files.",
44
44
  "releaseLine": "v0.9 private/customer pilot; v1.0 is public-beta stable.",
45
- "highGhostStack": "0.9.3",
45
+ "highGhostStack": "0.9.5",
46
46
  "deploymentScope": "customer"
47
47
  },
48
- "deploymentScope": "customer"
48
+ "deploymentScope": "customer",
49
+ "highGhostStack": "0.9.5"
49
50
  }