@askexenow/exe-os 0.9.20 → 0.9.22

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 (62) hide show
  1. package/LICENSE +24 -15
  2. package/dist/bin/backfill-conversations.js +17 -4
  3. package/dist/bin/backfill-responses.js +17 -4
  4. package/dist/bin/backfill-vectors.js +2 -2
  5. package/dist/bin/cleanup-stale-review-tasks.js +17 -4
  6. package/dist/bin/cli.js +420 -180
  7. package/dist/bin/exe-assign.js +17 -4
  8. package/dist/bin/exe-boot.js +2 -2
  9. package/dist/bin/exe-dispatch.js +17 -4
  10. package/dist/bin/exe-doctor.js +2 -2
  11. package/dist/bin/exe-export-behaviors.js +17 -4
  12. package/dist/bin/exe-forget.js +17 -4
  13. package/dist/bin/exe-gateway.js +17 -4
  14. package/dist/bin/exe-heartbeat.js +17 -4
  15. package/dist/bin/exe-kill.js +17 -4
  16. package/dist/bin/exe-launch-agent.js +17 -4
  17. package/dist/bin/exe-new-employee.js +42 -18
  18. package/dist/bin/exe-pending-messages.js +17 -4
  19. package/dist/bin/exe-pending-notifications.js +17 -4
  20. package/dist/bin/exe-pending-reviews.js +17 -4
  21. package/dist/bin/exe-review.js +17 -4
  22. package/dist/bin/exe-search.js +23 -8
  23. package/dist/bin/exe-session-cleanup.js +17 -4
  24. package/dist/bin/exe-start-codex.js +209 -32
  25. package/dist/bin/exe-start-opencode.js +17 -4
  26. package/dist/bin/exe-status.js +17 -4
  27. package/dist/bin/exe-team.js +17 -4
  28. package/dist/bin/git-sweep.js +17 -4
  29. package/dist/bin/graph-backfill.js +17 -4
  30. package/dist/bin/graph-export.js +17 -4
  31. package/dist/bin/install.js +84 -18
  32. package/dist/bin/intercom-check.js +17 -4
  33. package/dist/bin/scan-tasks.js +17 -4
  34. package/dist/bin/shard-migrate.js +17 -4
  35. package/dist/bin/update.js +187 -42
  36. package/dist/gateway/index.js +17 -4
  37. package/dist/hooks/bug-report-worker.js +793 -150
  38. package/dist/hooks/codex-stop-task-finalizer.js +3020 -2375
  39. package/dist/hooks/commit-complete.js +156 -6
  40. package/dist/hooks/error-recall.js +23 -8
  41. package/dist/hooks/ingest.js +17 -4
  42. package/dist/hooks/instructions-loaded.js +17 -4
  43. package/dist/hooks/notification.js +17 -4
  44. package/dist/hooks/post-compact.js +17 -4
  45. package/dist/hooks/post-tool-combined.js +23 -8
  46. package/dist/hooks/pre-compact.js +156 -8
  47. package/dist/hooks/pre-tool-use.js +21 -12
  48. package/dist/hooks/prompt-submit.js +23 -8
  49. package/dist/hooks/session-end.js +156 -8
  50. package/dist/hooks/session-start.js +23 -8
  51. package/dist/hooks/stop.js +306 -9
  52. package/dist/hooks/subagent-stop.js +306 -9
  53. package/dist/hooks/summary-worker.js +2 -2
  54. package/dist/index.js +17 -4
  55. package/dist/lib/exe-daemon.js +17 -4
  56. package/dist/lib/hybrid-search.js +23 -8
  57. package/dist/lib/schedules.js +2 -2
  58. package/dist/lib/store.js +17 -4
  59. package/dist/mcp/server.js +36 -10
  60. package/dist/runtime/index.js +17 -4
  61. package/dist/tui/App.js +17 -4
  62. package/package.json +2 -2
package/LICENSE CHANGED
@@ -1,21 +1,30 @@
1
- MIT License
1
+ Proprietary License
2
2
 
3
- Copyright (c) 2026 AskExe
3
+ Copyright (c) 2026 Ask Exe Now Pty Ltd. All rights reserved.
4
4
 
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
5
+ This software and associated documentation files (the "Software") are the
6
+ exclusive property of Ask Exe Now Pty Ltd ("AskExe"). The Software is
7
+ licensed, not sold.
11
8
 
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
9
+ RESTRICTIONS
10
+
11
+ You may not, without the prior written consent of AskExe:
12
+
13
+ 1. Copy, modify, merge, or create derivative works of the Software;
14
+ 2. Distribute, sublicense, sell, lease, or transfer the Software;
15
+ 3. Reverse engineer, decompile, or disassemble the Software;
16
+ 4. Remove or alter any proprietary notices or labels on the Software.
17
+
18
+ PERMITTED USE
19
+
20
+ Use of the Software is permitted only under a valid license agreement
21
+ with AskExe. See https://askexe.com/license for terms.
22
+
23
+ DISCLAIMER
14
24
 
15
25
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
26
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
27
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
28
+ ASKEXE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -2736,8 +2736,8 @@ function getShardClient(projectName) {
2736
2736
  throw new Error("Shard manager not initialized. Call initShardManager() first.");
2737
2737
  }
2738
2738
  const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
2739
- if (!safeName) {
2740
- throw new Error(`Invalid project name for shard: "${projectName}"`);
2739
+ if (!safeName || safeName === "unknown") {
2740
+ throw new Error(`Invalid project name for shard: "${projectName}" (resolved to "${safeName}")`);
2741
2741
  }
2742
2742
  const cached = _shards.get(safeName);
2743
2743
  if (cached) {
@@ -3713,19 +3713,32 @@ async function flushBatch() {
3713
3713
  const { isShardingEnabled: isShardingEnabled2, getReadyShardClient: getReadyShardClient2 } = await Promise.resolve().then(() => (init_shard_manager(), shard_manager_exports));
3714
3714
  if (isShardingEnabled2()) {
3715
3715
  const byProject = /* @__PURE__ */ new Map();
3716
+ let skippedUnknown = 0;
3716
3717
  for (const row of batch) {
3717
- const proj = row.project_name || "unknown";
3718
+ const proj = row.project_name?.trim();
3719
+ if (!proj) {
3720
+ skippedUnknown++;
3721
+ continue;
3722
+ }
3718
3723
  if (!byProject.has(proj)) byProject.set(proj, []);
3719
3724
  byProject.get(proj).push(row);
3720
3725
  }
3726
+ if (skippedUnknown > 0) {
3727
+ process.stderr.write(
3728
+ `[store] Shard skip: ${skippedUnknown} record(s) with empty project_name (kept in main DB only)
3729
+ `
3730
+ );
3731
+ }
3721
3732
  for (const [project, rows] of byProject) {
3722
3733
  try {
3723
3734
  const shardClient = await getReadyShardClient2(project);
3724
3735
  const shardStmts = rows.map(buildStmt);
3725
3736
  await shardClient.batch(shardStmts, "write");
3726
3737
  } catch (err) {
3738
+ const fullError = err instanceof Error ? `${err.name}: ${err.message}${err.stack ? `
3739
+ ${err.stack.split("\n").slice(1, 3).join("\n")}` : ""}` : String(err);
3727
3740
  process.stderr.write(
3728
- `[store] Shard write failed for ${project}: ${err instanceof Error ? err.message : String(err)}
3741
+ `[store] Shard write failed for ${project} (${rows.length} records): ${fullError}
3729
3742
  `
3730
3743
  );
3731
3744
  }
@@ -2736,8 +2736,8 @@ function getShardClient(projectName) {
2736
2736
  throw new Error("Shard manager not initialized. Call initShardManager() first.");
2737
2737
  }
2738
2738
  const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
2739
- if (!safeName) {
2740
- throw new Error(`Invalid project name for shard: "${projectName}"`);
2739
+ if (!safeName || safeName === "unknown") {
2740
+ throw new Error(`Invalid project name for shard: "${projectName}" (resolved to "${safeName}")`);
2741
2741
  }
2742
2742
  const cached = _shards.get(safeName);
2743
2743
  if (cached) {
@@ -3712,19 +3712,32 @@ async function flushBatch() {
3712
3712
  const { isShardingEnabled: isShardingEnabled2, getReadyShardClient: getReadyShardClient2 } = await Promise.resolve().then(() => (init_shard_manager(), shard_manager_exports));
3713
3713
  if (isShardingEnabled2()) {
3714
3714
  const byProject = /* @__PURE__ */ new Map();
3715
+ let skippedUnknown = 0;
3715
3716
  for (const row of batch) {
3716
- const proj = row.project_name || "unknown";
3717
+ const proj = row.project_name?.trim();
3718
+ if (!proj) {
3719
+ skippedUnknown++;
3720
+ continue;
3721
+ }
3717
3722
  if (!byProject.has(proj)) byProject.set(proj, []);
3718
3723
  byProject.get(proj).push(row);
3719
3724
  }
3725
+ if (skippedUnknown > 0) {
3726
+ process.stderr.write(
3727
+ `[store] Shard skip: ${skippedUnknown} record(s) with empty project_name (kept in main DB only)
3728
+ `
3729
+ );
3730
+ }
3720
3731
  for (const [project, rows] of byProject) {
3721
3732
  try {
3722
3733
  const shardClient = await getReadyShardClient2(project);
3723
3734
  const shardStmts = rows.map(buildStmt);
3724
3735
  await shardClient.batch(shardStmts, "write");
3725
3736
  } catch (err) {
3737
+ const fullError = err instanceof Error ? `${err.name}: ${err.message}${err.stack ? `
3738
+ ${err.stack.split("\n").slice(1, 3).join("\n")}` : ""}` : String(err);
3726
3739
  process.stderr.write(
3727
- `[store] Shard write failed for ${project}: ${err instanceof Error ? err.message : String(err)}
3740
+ `[store] Shard write failed for ${project} (${rows.length} records): ${fullError}
3728
3741
  `
3729
3742
  );
3730
3743
  }
@@ -2732,8 +2732,8 @@ function getShardClient(projectName) {
2732
2732
  throw new Error("Shard manager not initialized. Call initShardManager() first.");
2733
2733
  }
2734
2734
  const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
2735
- if (!safeName) {
2736
- throw new Error(`Invalid project name for shard: "${projectName}"`);
2735
+ if (!safeName || safeName === "unknown") {
2736
+ throw new Error(`Invalid project name for shard: "${projectName}" (resolved to "${safeName}")`);
2737
2737
  }
2738
2738
  const cached = _shards.get(safeName);
2739
2739
  if (cached) {
@@ -2934,8 +2934,8 @@ function getShardClient(projectName) {
2934
2934
  throw new Error("Shard manager not initialized. Call initShardManager() first.");
2935
2935
  }
2936
2936
  const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
2937
- if (!safeName) {
2938
- throw new Error(`Invalid project name for shard: "${projectName}"`);
2937
+ if (!safeName || safeName === "unknown") {
2938
+ throw new Error(`Invalid project name for shard: "${projectName}" (resolved to "${safeName}")`);
2939
2939
  }
2940
2940
  const cached = _shards.get(safeName);
2941
2941
  if (cached) {
@@ -3804,19 +3804,32 @@ async function flushBatch() {
3804
3804
  const { isShardingEnabled: isShardingEnabled2, getReadyShardClient: getReadyShardClient2 } = await Promise.resolve().then(() => (init_shard_manager(), shard_manager_exports));
3805
3805
  if (isShardingEnabled2()) {
3806
3806
  const byProject = /* @__PURE__ */ new Map();
3807
+ let skippedUnknown = 0;
3807
3808
  for (const row of batch) {
3808
- const proj = row.project_name || "unknown";
3809
+ const proj = row.project_name?.trim();
3810
+ if (!proj) {
3811
+ skippedUnknown++;
3812
+ continue;
3813
+ }
3809
3814
  if (!byProject.has(proj)) byProject.set(proj, []);
3810
3815
  byProject.get(proj).push(row);
3811
3816
  }
3817
+ if (skippedUnknown > 0) {
3818
+ process.stderr.write(
3819
+ `[store] Shard skip: ${skippedUnknown} record(s) with empty project_name (kept in main DB only)
3820
+ `
3821
+ );
3822
+ }
3812
3823
  for (const [project, rows] of byProject) {
3813
3824
  try {
3814
3825
  const shardClient = await getReadyShardClient2(project);
3815
3826
  const shardStmts = rows.map(buildStmt);
3816
3827
  await shardClient.batch(shardStmts, "write");
3817
3828
  } catch (err) {
3829
+ const fullError = err instanceof Error ? `${err.name}: ${err.message}${err.stack ? `
3830
+ ${err.stack.split("\n").slice(1, 3).join("\n")}` : ""}` : String(err);
3818
3831
  process.stderr.write(
3819
- `[store] Shard write failed for ${project}: ${err instanceof Error ? err.message : String(err)}
3832
+ `[store] Shard write failed for ${project} (${rows.length} records): ${fullError}
3820
3833
  `
3821
3834
  );
3822
3835
  }