evil-omo 3.12.5 → 3.13.1

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 (71) hide show
  1. package/dist/agents/prometheus/system-prompt.d.ts +1 -1
  2. package/dist/cli/index.js +61 -18
  3. package/dist/config/schema/evil-omo-config.d.ts +31 -0
  4. package/dist/config/schema/hooks.d.ts +1 -1
  5. package/dist/config/schema/openclaw.d.ts +64 -0
  6. package/dist/config/schema.d.ts +1 -0
  7. package/dist/create-hooks.d.ts +1 -1
  8. package/dist/evil-omo.schema.json +141 -0
  9. package/dist/features/background-agent/constants.d.ts +3 -3
  10. package/dist/features/boulder-state/index.d.ts +1 -0
  11. package/dist/features/boulder-state/storage.d.ts +10 -1
  12. package/dist/features/boulder-state/top-level-task.d.ts +2 -0
  13. package/dist/features/boulder-state/types.d.ts +28 -0
  14. package/dist/hooks/atlas/boulder-continuation-injector.d.ts +2 -0
  15. package/dist/hooks/atlas/subagent-session-id.d.ts +7 -1
  16. package/dist/hooks/atlas/tool-execute-after.d.ts +2 -1
  17. package/dist/hooks/atlas/tool-execute-before.d.ts +2 -0
  18. package/dist/hooks/atlas/types.d.ts +13 -1
  19. package/dist/hooks/index.d.ts +1 -1
  20. package/dist/hooks/keyword-detector/constants.d.ts +1 -1
  21. package/dist/hooks/keyword-detector/ultrawork/index.d.ts +1 -1
  22. package/dist/hooks/keyword-detector/ultrawork/source-detector.d.ts +5 -0
  23. package/dist/hooks/openclaw.d.ts +11 -0
  24. package/dist/hooks/preemptive-compaction-degradation-monitor.d.ts +55 -0
  25. package/dist/hooks/preemptive-compaction-no-text-tail.d.ts +18 -0
  26. package/dist/hooks/session-recovery/storage/thinking-prepend.d.ts +27 -2
  27. package/dist/hooks/todo-continuation-enforcer/compaction-guard.d.ts +2 -0
  28. package/dist/hooks/todo-continuation-enforcer/handler.d.ts +0 -1
  29. package/dist/hooks/todo-continuation-enforcer/idle-event.d.ts +0 -1
  30. package/dist/hooks/todo-continuation-enforcer/types.d.ts +2 -1
  31. package/dist/hooks/webfetch-redirect-guard/constants.d.ts +6 -0
  32. package/dist/hooks/webfetch-redirect-guard/hook.d.ts +19 -0
  33. package/dist/hooks/webfetch-redirect-guard/index.d.ts +1 -0
  34. package/dist/hooks/webfetch-redirect-guard/redirect-resolution.d.ts +16 -0
  35. package/dist/index.js +1592 -860
  36. package/dist/openclaw/config.d.ts +8 -0
  37. package/dist/openclaw/daemon.d.ts +1 -0
  38. package/dist/openclaw/dispatcher.d.ts +16 -0
  39. package/dist/openclaw/index.d.ts +5 -0
  40. package/dist/openclaw/reply-listener.d.ts +31 -0
  41. package/dist/openclaw/session-registry.d.ts +17 -0
  42. package/dist/openclaw/tmux.d.ts +8 -0
  43. package/dist/openclaw/types.d.ts +38 -0
  44. package/dist/plugin/chat-message.d.ts +5 -4
  45. package/dist/plugin/chat-params.d.ts +5 -1
  46. package/dist/plugin/event.d.ts +0 -1
  47. package/dist/plugin/hooks/create-continuation-hooks.d.ts +1 -2
  48. package/dist/plugin/hooks/create-core-hooks.d.ts +1 -0
  49. package/dist/plugin/hooks/create-tool-guard-hooks.d.ts +2 -1
  50. package/dist/plugin/normalize-tool-arg-schemas.d.ts +1 -0
  51. package/dist/plugin/system-transform.d.ts +1 -9
  52. package/dist/plugin-handlers/prometheus-agent-config-builder.d.ts +1 -0
  53. package/dist/plugin-interface.d.ts +2 -3
  54. package/dist/shared/first-message-variant.d.ts +0 -1
  55. package/dist/shared/jsonc-parser.d.ts +4 -0
  56. package/dist/shared/shell-env.d.ts +1 -1
  57. package/dist/tools/delegate-task/categories.d.ts +1 -0
  58. package/dist/tools/delegate-task/constants.d.ts +2 -2
  59. package/dist/tools/delegate-task/model-selection.d.ts +1 -0
  60. package/dist/tools/delegate-task/subagent-resolver.d.ts +1 -1
  61. package/dist/tools/hashline-edit/formatter-trigger.d.ts +38 -0
  62. package/dist/tools/hashline-edit/hashline-edit-executor.d.ts +2 -1
  63. package/dist/tools/hashline-edit/tools.d.ts +2 -1
  64. package/package.json +12 -12
  65. package/bin/evil-omo.test.ts +0 -82
  66. package/dist/hooks/gpt-permission-continuation/assistant-message.d.ts +0 -23
  67. package/dist/hooks/gpt-permission-continuation/constants.d.ts +0 -4
  68. package/dist/hooks/gpt-permission-continuation/detector.d.ts +0 -1
  69. package/dist/hooks/gpt-permission-continuation/handler.d.ts +0 -12
  70. package/dist/hooks/gpt-permission-continuation/index.d.ts +0 -13
  71. package/dist/hooks/gpt-permission-continuation/session-state.d.ts +0 -15
@@ -25,4 +25,4 @@ export declare function getPrometheusPromptSource(model?: string): PrometheusPro
25
25
  * Gemini models → Gemini-optimized prompt (aggressive tool-call enforcement, thinking checkpoints)
26
26
  * Default (Claude, etc.) → Claude-optimized prompt (modular sections)
27
27
  */
28
- export declare function getPrometheusPrompt(model?: string): string;
28
+ export declare function getPrometheusPrompt(model?: string, disabledTools?: readonly string[]): string;
package/dist/cli/index.js CHANGED
@@ -6067,7 +6067,8 @@ var init_hook_names = __esm(() => {
6067
6067
  "sisyphus-orchestrator": "atlas",
6068
6068
  "sisyphus-gpt-hephaestus-reminder": "no-sisyphus-gpt",
6069
6069
  "empty-message-sanitizer": null,
6070
- "delegate-task-english-directive": null
6070
+ "delegate-task-english-directive": null,
6071
+ "gpt-permission-continuation": null
6071
6072
  };
6072
6073
  });
6073
6074
 
@@ -6573,6 +6574,10 @@ var init_model_requirements = __esm(() => {
6573
6574
  },
6574
6575
  quick: {
6575
6576
  fallbackChain: [
6577
+ {
6578
+ providers: ["openai", "github-copilot", "opencode"],
6579
+ model: "gpt-5.4-mini"
6580
+ },
6576
6581
  {
6577
6582
  providers: ["anthropic", "github-copilot", "opencode"],
6578
6583
  model: "claude-haiku-4-5"
@@ -7510,7 +7515,7 @@ var init_openai_only_model_catalog = __esm(() => {
7510
7515
  };
7511
7516
  OPENAI_ONLY_CATEGORY_OVERRIDES = {
7512
7517
  artistry: { model: "openai/gpt-5.4", variant: "xhigh" },
7513
- quick: { model: "openai/gpt-5.3-codex", variant: "low" },
7518
+ quick: { model: "openai/gpt-5.4-mini" },
7514
7519
  "visual-engineering": { model: "openai/gpt-5.4", variant: "high" },
7515
7520
  writing: { model: "openai/gpt-5.4", variant: "medium" }
7516
7521
  };
@@ -8967,7 +8972,7 @@ var {
8967
8972
  // package.json
8968
8973
  var package_default = {
8969
8974
  name: "evil-omo",
8970
- version: "3.12.5",
8975
+ version: "3.13.1",
8971
8976
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
8972
8977
  main: "dist/index.js",
8973
8978
  types: "dist/index.d.ts",
@@ -9043,17 +9048,17 @@ var package_default = {
9043
9048
  typescript: "^5.7.3"
9044
9049
  },
9045
9050
  optionalDependencies: {
9046
- "evil-omo-darwin-arm64": "3.12.5",
9047
- "evil-omo-darwin-x64": "3.12.5",
9048
- "evil-omo-darwin-x64-baseline": "3.12.5",
9049
- "evil-omo-linux-x64": "3.12.5",
9050
- "evil-omo-linux-x64-baseline": "3.12.5",
9051
- "evil-omo-linux-arm64": "3.12.5",
9052
- "evil-omo-linux-x64-musl": "3.12.5",
9053
- "evil-omo-linux-x64-musl-baseline": "3.12.5",
9054
- "evil-omo-linux-arm64-musl": "3.12.5",
9055
- "evil-omo-windows-x64": "3.12.5",
9056
- "evil-omo-windows-x64-baseline": "3.12.5"
9051
+ "evil-omo-darwin-arm64": "3.13.1",
9052
+ "evil-omo-darwin-x64": "3.13.1",
9053
+ "evil-omo-darwin-x64-baseline": "3.13.1",
9054
+ "evil-omo-linux-x64": "3.13.1",
9055
+ "evil-omo-linux-x64-baseline": "3.13.1",
9056
+ "evil-omo-linux-arm64": "3.13.1",
9057
+ "evil-omo-linux-x64-musl": "3.13.1",
9058
+ "evil-omo-linux-x64-musl-baseline": "3.13.1",
9059
+ "evil-omo-linux-arm64-musl": "3.13.1",
9060
+ "evil-omo-windows-x64": "3.13.1",
9061
+ "evil-omo-windows-x64-baseline": "3.13.1"
9057
9062
  },
9058
9063
  overrides: {
9059
9064
  "@opencode-ai/sdk": "^1.2.24"
@@ -9924,7 +9929,7 @@ async function promptInstallConfig(detected) {
9924
9929
  message: "Will you integrate Google Gemini?",
9925
9930
  options: [
9926
9931
  { value: "no", label: "No", hint: "Frontend/docs agents will use fallback" },
9927
- { value: "yes", label: "Yes", hint: "Beautiful UI generation with Gemini 3 Pro" }
9932
+ { value: "yes", label: "Yes", hint: "Beautiful UI generation with Gemini 3.1 Pro" }
9928
9933
  ],
9929
9934
  initialValue: initial.gemini
9930
9935
  });
@@ -24577,7 +24582,6 @@ var GitMasterConfigSchema = exports_external.object({
24577
24582
  });
24578
24583
  // src/config/schema/hooks.ts
24579
24584
  var HookNameSchema = exports_external.enum([
24580
- "gpt-permission-continuation",
24581
24585
  "todo-continuation-enforcer",
24582
24586
  "context-window-monitor",
24583
24587
  "session-recovery",
@@ -24625,12 +24629,45 @@ var HookNameSchema = exports_external.enum([
24625
24629
  "anthropic-effort",
24626
24630
  "hashline-read-enhancer",
24627
24631
  "read-image-resizer",
24628
- "todo-description-override"
24632
+ "todo-description-override",
24633
+ "webfetch-redirect-guard"
24629
24634
  ]);
24630
24635
  // src/config/schema/notification.ts
24631
24636
  var NotificationConfigSchema = exports_external.object({
24632
24637
  force_enable: exports_external.boolean().optional()
24633
24638
  });
24639
+ // src/config/schema/openclaw.ts
24640
+ var OpenClawGatewaySchema = exports_external.object({
24641
+ type: exports_external.enum(["http", "command"]).default("http"),
24642
+ url: exports_external.string().optional(),
24643
+ method: exports_external.string().default("POST"),
24644
+ headers: exports_external.record(exports_external.string(), exports_external.string()).optional(),
24645
+ command: exports_external.string().optional(),
24646
+ timeout: exports_external.number().optional()
24647
+ });
24648
+ var OpenClawHookSchema = exports_external.object({
24649
+ enabled: exports_external.boolean().default(true),
24650
+ gateway: exports_external.string(),
24651
+ instruction: exports_external.string()
24652
+ });
24653
+ var OpenClawReplyListenerConfigSchema = exports_external.object({
24654
+ discordBotToken: exports_external.string().optional(),
24655
+ discordChannelId: exports_external.string().optional(),
24656
+ discordMention: exports_external.string().optional(),
24657
+ authorizedDiscordUserIds: exports_external.array(exports_external.string()).default([]),
24658
+ telegramBotToken: exports_external.string().optional(),
24659
+ telegramChatId: exports_external.string().optional(),
24660
+ pollIntervalMs: exports_external.number().default(3000),
24661
+ rateLimitPerMinute: exports_external.number().default(10),
24662
+ maxMessageLength: exports_external.number().default(500),
24663
+ includePrefix: exports_external.boolean().default(true)
24664
+ });
24665
+ var OpenClawConfigSchema = exports_external.object({
24666
+ enabled: exports_external.boolean().default(false),
24667
+ gateways: exports_external.record(exports_external.string(), OpenClawGatewaySchema).default({}),
24668
+ hooks: exports_external.record(exports_external.string(), OpenClawHookSchema).default({}),
24669
+ replyListener: OpenClawReplyListenerConfigSchema.optional()
24670
+ });
24634
24671
  // src/config/schema/ralph-loop.ts
24635
24672
  var RalphLoopConfigSchema = exports_external.object({
24636
24673
  enabled: exports_external.boolean().default(false),
@@ -24756,6 +24793,7 @@ var OhMyOpenCodeConfigSchema = exports_external.object({
24756
24793
  ralph_loop: RalphLoopConfigSchema.optional(),
24757
24794
  background_task: BackgroundTaskConfigSchema.optional(),
24758
24795
  notification: NotificationConfigSchema.optional(),
24796
+ openclaw: OpenClawConfigSchema.optional(),
24759
24797
  babysitting: BabysittingConfigSchema.optional(),
24760
24798
  git_master: GitMasterConfigSchema.optional(),
24761
24799
  browser_automation_engine: BrowserAutomationConfigSchema.optional(),
@@ -26748,6 +26786,7 @@ var NOTEPAD_BASE_PATH = `${BOULDER_DIR}/${NOTEPAD_DIR}`;
26748
26786
  // src/features/boulder-state/storage.ts
26749
26787
  import { existsSync as existsSync11, readFileSync as readFileSync9, writeFileSync as writeFileSync5, mkdirSync as mkdirSync3, readdirSync } from "fs";
26750
26788
  import { dirname as dirname2, join as join10, basename } from "path";
26789
+ var RESERVED_KEYS = new Set(["__proto__", "prototype", "constructor"]);
26751
26790
  function getBoulderFilePath(directory) {
26752
26791
  return join10(directory, BOULDER_DIR, BOULDER_FILE);
26753
26792
  }
@@ -26765,6 +26804,9 @@ function readBoulderState(directory) {
26765
26804
  if (!Array.isArray(parsed.session_ids)) {
26766
26805
  parsed.session_ids = [];
26767
26806
  }
26807
+ if (!parsed.task_sessions || typeof parsed.task_sessions !== "object" || Array.isArray(parsed.task_sessions)) {
26808
+ parsed.task_sessions = {};
26809
+ }
26768
26810
  return parsed;
26769
26811
  } catch {
26770
26812
  return null;
@@ -26783,7 +26825,7 @@ function getPlanProgress(planPath) {
26783
26825
  return {
26784
26826
  total,
26785
26827
  completed,
26786
- isComplete: total === 0 || completed === total
26828
+ isComplete: total > 0 && completed === total
26787
26829
  };
26788
26830
  } catch {
26789
26831
  return { total: 0, completed: 0, isComplete: true };
@@ -27253,6 +27295,7 @@ async function waitForEventProcessorShutdown(eventProcessor, timeoutMs = EVENT_P
27253
27295
  }
27254
27296
  async function run(options) {
27255
27297
  process.env.OPENCODE_CLI_RUN_MODE = "true";
27298
+ process.env.OPENCODE_CLIENT = "run";
27256
27299
  const startTime = Date.now();
27257
27300
  const {
27258
27301
  message,
@@ -1337,6 +1337,37 @@ export declare const OhMyOpenCodeConfigSchema: z.ZodObject<{
1337
1337
  notification: z.ZodOptional<z.ZodObject<{
1338
1338
  force_enable: z.ZodOptional<z.ZodBoolean>;
1339
1339
  }, z.core.$strip>>;
1340
+ openclaw: z.ZodOptional<z.ZodObject<{
1341
+ enabled: z.ZodDefault<z.ZodBoolean>;
1342
+ gateways: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
1343
+ type: z.ZodDefault<z.ZodEnum<{
1344
+ command: "command";
1345
+ http: "http";
1346
+ }>>;
1347
+ url: z.ZodOptional<z.ZodString>;
1348
+ method: z.ZodDefault<z.ZodString>;
1349
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1350
+ command: z.ZodOptional<z.ZodString>;
1351
+ timeout: z.ZodOptional<z.ZodNumber>;
1352
+ }, z.core.$strip>>>;
1353
+ hooks: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
1354
+ enabled: z.ZodDefault<z.ZodBoolean>;
1355
+ gateway: z.ZodString;
1356
+ instruction: z.ZodString;
1357
+ }, z.core.$strip>>>;
1358
+ replyListener: z.ZodOptional<z.ZodObject<{
1359
+ discordBotToken: z.ZodOptional<z.ZodString>;
1360
+ discordChannelId: z.ZodOptional<z.ZodString>;
1361
+ discordMention: z.ZodOptional<z.ZodString>;
1362
+ authorizedDiscordUserIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
1363
+ telegramBotToken: z.ZodOptional<z.ZodString>;
1364
+ telegramChatId: z.ZodOptional<z.ZodString>;
1365
+ pollIntervalMs: z.ZodDefault<z.ZodNumber>;
1366
+ rateLimitPerMinute: z.ZodDefault<z.ZodNumber>;
1367
+ maxMessageLength: z.ZodDefault<z.ZodNumber>;
1368
+ includePrefix: z.ZodDefault<z.ZodBoolean>;
1369
+ }, z.core.$strip>>;
1370
+ }, z.core.$strip>>;
1340
1371
  babysitting: z.ZodOptional<z.ZodObject<{
1341
1372
  timeout_ms: z.ZodDefault<z.ZodNumber>;
1342
1373
  }, z.core.$strip>>;
@@ -3,7 +3,6 @@ export declare const HookNameSchema: z.ZodEnum<{
3
3
  atlas: "atlas";
4
4
  "ralph-loop": "ralph-loop";
5
5
  "start-work": "start-work";
6
- "gpt-permission-continuation": "gpt-permission-continuation";
7
6
  "todo-continuation-enforcer": "todo-continuation-enforcer";
8
7
  "context-window-monitor": "context-window-monitor";
9
8
  "session-recovery": "session-recovery";
@@ -49,5 +48,6 @@ export declare const HookNameSchema: z.ZodEnum<{
49
48
  "hashline-read-enhancer": "hashline-read-enhancer";
50
49
  "read-image-resizer": "read-image-resizer";
51
50
  "todo-description-override": "todo-description-override";
51
+ "webfetch-redirect-guard": "webfetch-redirect-guard";
52
52
  }>;
53
53
  export type HookName = z.infer<typeof HookNameSchema>;
@@ -0,0 +1,64 @@
1
+ import { z } from "zod";
2
+ export declare const OpenClawGatewaySchema: z.ZodObject<{
3
+ type: z.ZodDefault<z.ZodEnum<{
4
+ command: "command";
5
+ http: "http";
6
+ }>>;
7
+ url: z.ZodOptional<z.ZodString>;
8
+ method: z.ZodDefault<z.ZodString>;
9
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
10
+ command: z.ZodOptional<z.ZodString>;
11
+ timeout: z.ZodOptional<z.ZodNumber>;
12
+ }, z.core.$strip>;
13
+ export declare const OpenClawHookSchema: z.ZodObject<{
14
+ enabled: z.ZodDefault<z.ZodBoolean>;
15
+ gateway: z.ZodString;
16
+ instruction: z.ZodString;
17
+ }, z.core.$strip>;
18
+ export declare const OpenClawReplyListenerConfigSchema: z.ZodObject<{
19
+ discordBotToken: z.ZodOptional<z.ZodString>;
20
+ discordChannelId: z.ZodOptional<z.ZodString>;
21
+ discordMention: z.ZodOptional<z.ZodString>;
22
+ authorizedDiscordUserIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
23
+ telegramBotToken: z.ZodOptional<z.ZodString>;
24
+ telegramChatId: z.ZodOptional<z.ZodString>;
25
+ pollIntervalMs: z.ZodDefault<z.ZodNumber>;
26
+ rateLimitPerMinute: z.ZodDefault<z.ZodNumber>;
27
+ maxMessageLength: z.ZodDefault<z.ZodNumber>;
28
+ includePrefix: z.ZodDefault<z.ZodBoolean>;
29
+ }, z.core.$strip>;
30
+ export declare const OpenClawConfigSchema: z.ZodObject<{
31
+ enabled: z.ZodDefault<z.ZodBoolean>;
32
+ gateways: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
33
+ type: z.ZodDefault<z.ZodEnum<{
34
+ command: "command";
35
+ http: "http";
36
+ }>>;
37
+ url: z.ZodOptional<z.ZodString>;
38
+ method: z.ZodDefault<z.ZodString>;
39
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
40
+ command: z.ZodOptional<z.ZodString>;
41
+ timeout: z.ZodOptional<z.ZodNumber>;
42
+ }, z.core.$strip>>>;
43
+ hooks: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
44
+ enabled: z.ZodDefault<z.ZodBoolean>;
45
+ gateway: z.ZodString;
46
+ instruction: z.ZodString;
47
+ }, z.core.$strip>>>;
48
+ replyListener: z.ZodOptional<z.ZodObject<{
49
+ discordBotToken: z.ZodOptional<z.ZodString>;
50
+ discordChannelId: z.ZodOptional<z.ZodString>;
51
+ discordMention: z.ZodOptional<z.ZodString>;
52
+ authorizedDiscordUserIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
53
+ telegramBotToken: z.ZodOptional<z.ZodString>;
54
+ telegramChatId: z.ZodOptional<z.ZodString>;
55
+ pollIntervalMs: z.ZodDefault<z.ZodNumber>;
56
+ rateLimitPerMinute: z.ZodDefault<z.ZodNumber>;
57
+ maxMessageLength: z.ZodDefault<z.ZodNumber>;
58
+ includePrefix: z.ZodDefault<z.ZodBoolean>;
59
+ }, z.core.$strip>>;
60
+ }, z.core.$strip>;
61
+ export type OpenClawConfig = z.infer<typeof OpenClawConfigSchema>;
62
+ export type OpenClawGateway = z.infer<typeof OpenClawGatewaySchema>;
63
+ export type OpenClawHook = z.infer<typeof OpenClawHookSchema>;
64
+ export type OpenClawReplyListenerConfig = z.infer<typeof OpenClawReplyListenerConfigSchema>;
@@ -14,6 +14,7 @@ export * from "./schema/git-env-prefix";
14
14
  export * from "./schema/git-master";
15
15
  export * from "./schema/hooks";
16
16
  export * from "./schema/notification";
17
+ export * from "./schema/openclaw";
17
18
  export * from "./schema/evil-omo-config";
18
19
  export * from "./schema/ralph-loop";
19
20
  export * from "./schema/runtime-fallback";
@@ -27,7 +27,6 @@ export declare function createHooks(args: {
27
27
  disposeHooks: () => void;
28
28
  categorySkillReminder: ReturnType<typeof import("./hooks").createCategorySkillReminderHook> | null;
29
29
  autoSlashCommand: ReturnType<typeof import("./hooks").createAutoSlashCommandHook> | null;
30
- gptPermissionContinuation: ReturnType<typeof import("./hooks").createGptPermissionContinuationHook> | null;
31
30
  stopContinuationGuard: ReturnType<typeof import("./hooks").createStopContinuationGuardHook> | null;
32
31
  compactionContextInjector: ReturnType<typeof import("./hooks").createCompactionContextInjector> | null;
33
32
  compactionTodoPreserver: ReturnType<typeof import("./hooks").createCompactionTodoPreserverHook> | null;
@@ -51,6 +50,7 @@ export declare function createHooks(args: {
51
50
  jsonErrorRecovery: ReturnType<typeof import("./hooks").createJsonErrorRecoveryHook> | null;
52
51
  readImageResizer: ReturnType<typeof import("./hooks").createReadImageResizerHook> | null;
53
52
  todoDescriptionOverride: ReturnType<typeof import("./hooks").createTodoDescriptionOverrideHook> | null;
53
+ webfetchRedirectGuard: ReturnType<typeof import("./hooks").createWebFetchRedirectGuardHook> | null;
54
54
  contextWindowMonitor: ReturnType<typeof import("./hooks").createContextWindowMonitorHook> | null;
55
55
  preemptiveCompaction: ReturnType<typeof import("./hooks").createPreemptiveCompactionHook> | null;
56
56
  sessionRecovery: ReturnType<typeof import("./hooks").createSessionRecoveryHook> | null;
@@ -3695,6 +3695,147 @@
3695
3695
  },
3696
3696
  "additionalProperties": false
3697
3697
  },
3698
+ "openclaw": {
3699
+ "type": "object",
3700
+ "properties": {
3701
+ "enabled": {
3702
+ "default": false,
3703
+ "type": "boolean"
3704
+ },
3705
+ "gateways": {
3706
+ "default": {},
3707
+ "type": "object",
3708
+ "propertyNames": {
3709
+ "type": "string"
3710
+ },
3711
+ "additionalProperties": {
3712
+ "type": "object",
3713
+ "properties": {
3714
+ "type": {
3715
+ "default": "http",
3716
+ "type": "string",
3717
+ "enum": [
3718
+ "http",
3719
+ "command"
3720
+ ]
3721
+ },
3722
+ "url": {
3723
+ "type": "string"
3724
+ },
3725
+ "method": {
3726
+ "default": "POST",
3727
+ "type": "string"
3728
+ },
3729
+ "headers": {
3730
+ "type": "object",
3731
+ "propertyNames": {
3732
+ "type": "string"
3733
+ },
3734
+ "additionalProperties": {
3735
+ "type": "string"
3736
+ }
3737
+ },
3738
+ "command": {
3739
+ "type": "string"
3740
+ },
3741
+ "timeout": {
3742
+ "type": "number"
3743
+ }
3744
+ },
3745
+ "required": [
3746
+ "type",
3747
+ "method"
3748
+ ],
3749
+ "additionalProperties": false
3750
+ }
3751
+ },
3752
+ "hooks": {
3753
+ "default": {},
3754
+ "type": "object",
3755
+ "propertyNames": {
3756
+ "type": "string"
3757
+ },
3758
+ "additionalProperties": {
3759
+ "type": "object",
3760
+ "properties": {
3761
+ "enabled": {
3762
+ "default": true,
3763
+ "type": "boolean"
3764
+ },
3765
+ "gateway": {
3766
+ "type": "string"
3767
+ },
3768
+ "instruction": {
3769
+ "type": "string"
3770
+ }
3771
+ },
3772
+ "required": [
3773
+ "enabled",
3774
+ "gateway",
3775
+ "instruction"
3776
+ ],
3777
+ "additionalProperties": false
3778
+ }
3779
+ },
3780
+ "replyListener": {
3781
+ "type": "object",
3782
+ "properties": {
3783
+ "discordBotToken": {
3784
+ "type": "string"
3785
+ },
3786
+ "discordChannelId": {
3787
+ "type": "string"
3788
+ },
3789
+ "discordMention": {
3790
+ "type": "string"
3791
+ },
3792
+ "authorizedDiscordUserIds": {
3793
+ "default": [],
3794
+ "type": "array",
3795
+ "items": {
3796
+ "type": "string"
3797
+ }
3798
+ },
3799
+ "telegramBotToken": {
3800
+ "type": "string"
3801
+ },
3802
+ "telegramChatId": {
3803
+ "type": "string"
3804
+ },
3805
+ "pollIntervalMs": {
3806
+ "default": 3000,
3807
+ "type": "number"
3808
+ },
3809
+ "rateLimitPerMinute": {
3810
+ "default": 10,
3811
+ "type": "number"
3812
+ },
3813
+ "maxMessageLength": {
3814
+ "default": 500,
3815
+ "type": "number"
3816
+ },
3817
+ "includePrefix": {
3818
+ "default": true,
3819
+ "type": "boolean"
3820
+ }
3821
+ },
3822
+ "required": [
3823
+ "authorizedDiscordUserIds",
3824
+ "pollIntervalMs",
3825
+ "rateLimitPerMinute",
3826
+ "maxMessageLength",
3827
+ "includePrefix"
3828
+ ],
3829
+ "additionalProperties": false
3830
+ }
3831
+ },
3832
+ "required": [
3833
+ "enabled",
3834
+ "gateways",
3835
+ "hooks"
3836
+ ],
3837
+ "additionalProperties": false
3838
+ },
3698
3839
  "babysitting": {
3699
3840
  "type": "object",
3700
3841
  "properties": {
@@ -3,11 +3,11 @@ import type { BackgroundTask, LaunchInput } from "./types";
3
3
  export declare const TASK_TTL_MS: number;
4
4
  export declare const TERMINAL_TASK_TTL_MS: number;
5
5
  export declare const MIN_STABILITY_TIME_MS: number;
6
- export declare const DEFAULT_STALE_TIMEOUT_MS = 1200000;
7
- export declare const DEFAULT_MESSAGE_STALENESS_TIMEOUT_MS = 1800000;
6
+ export declare const DEFAULT_STALE_TIMEOUT_MS = 2700000;
7
+ export declare const DEFAULT_MESSAGE_STALENESS_TIMEOUT_MS = 3600000;
8
8
  export declare const DEFAULT_MAX_TOOL_CALLS = 4000;
9
9
  export declare const DEFAULT_CIRCUIT_BREAKER_CONSECUTIVE_THRESHOLD = 20;
10
- export declare const DEFAULT_CIRCUIT_BREAKER_ENABLED = false;
10
+ export declare const DEFAULT_CIRCUIT_BREAKER_ENABLED = true;
11
11
  export declare const MIN_RUNTIME_BEFORE_STALE_MS = 30000;
12
12
  export declare const MIN_IDLE_TIME_MS = 5000;
13
13
  export declare const POLLING_INTERVAL_MS = 3000;
@@ -1,3 +1,4 @@
1
1
  export * from "./types";
2
2
  export * from "./constants";
3
3
  export * from "./storage";
4
+ export * from "./top-level-task";
@@ -3,12 +3,21 @@
3
3
  *
4
4
  * Handles reading/writing boulder.json for active plan tracking.
5
5
  */
6
- import type { BoulderState, PlanProgress } from "./types";
6
+ import type { BoulderState, PlanProgress, TaskSessionState } from "./types";
7
7
  export declare function getBoulderFilePath(directory: string): string;
8
8
  export declare function readBoulderState(directory: string): BoulderState | null;
9
9
  export declare function writeBoulderState(directory: string, state: BoulderState): boolean;
10
10
  export declare function appendSessionId(directory: string, sessionId: string): BoulderState | null;
11
11
  export declare function clearBoulderState(directory: string): boolean;
12
+ export declare function getTaskSessionState(directory: string, taskKey: string): TaskSessionState | null;
13
+ export declare function upsertTaskSessionState(directory: string, input: {
14
+ taskKey: string;
15
+ taskLabel: string;
16
+ taskTitle: string;
17
+ sessionId: string;
18
+ agent?: string;
19
+ category?: string;
20
+ }): BoulderState | null;
12
21
  /**
13
22
  * Find Prometheus plan files for this project.
14
23
  * Prometheus stores plans at: {project}/.sisyphus/plans/{name}.md
@@ -0,0 +1,2 @@
1
+ import type { TopLevelTaskRef } from "./types";
2
+ export declare function readCurrentTopLevelTask(planPath: string): TopLevelTaskRef | null;
@@ -17,6 +17,8 @@ export interface BoulderState {
17
17
  agent?: string;
18
18
  /** Absolute path to the git worktree root where work happens */
19
19
  worktree_path?: string;
20
+ /** Preferred reusable subagent sessions keyed by current top-level plan task */
21
+ task_sessions?: Record<string, TaskSessionState>;
20
22
  }
21
23
  export interface PlanProgress {
22
24
  /** Total number of checkboxes */
@@ -26,3 +28,29 @@ export interface PlanProgress {
26
28
  /** Whether all tasks are done */
27
29
  isComplete: boolean;
28
30
  }
31
+ export interface TaskSessionState {
32
+ /** Stable identifier for the current top-level plan task (e.g. todo:1 / final-wave:F1) */
33
+ task_key: string;
34
+ /** Original task label from the plan file */
35
+ task_label: string;
36
+ /** Full task title from the plan file */
37
+ task_title: string;
38
+ /** Preferred reusable subagent session */
39
+ session_id: string;
40
+ /** Agent associated with the task session, when known */
41
+ agent?: string;
42
+ /** Category associated with the task session, when known */
43
+ category?: string;
44
+ /** Last update timestamp */
45
+ updated_at: string;
46
+ }
47
+ export interface TopLevelTaskRef {
48
+ /** Stable identifier for the current top-level plan task */
49
+ key: string;
50
+ /** Task section in the Prometheus plan */
51
+ section: "todo" | "final-wave";
52
+ /** Original label token (e.g. 1 / F1) */
53
+ label: string;
54
+ /** Full task title extracted from the checkbox line */
55
+ title: string;
56
+ }
@@ -9,6 +9,8 @@ export declare function injectBoulderContinuation(input: {
9
9
  total: number;
10
10
  agent?: string;
11
11
  worktreePath?: string;
12
+ preferredTaskSessionId?: string;
13
+ preferredTaskTitle?: string;
12
14
  backgroundManager?: BackgroundManager;
13
15
  sessionState: SessionState;
14
16
  }): Promise<void>;
@@ -1 +1,7 @@
1
- export declare function extractSessionIdFromOutput(output: string): string;
1
+ import type { PluginInput } from "@opencode-ai/plugin";
2
+ export declare function extractSessionIdFromOutput(output: string): string | undefined;
3
+ export declare function validateSubagentSessionId(input: {
4
+ client: PluginInput["client"];
5
+ sessionID?: string;
6
+ lineageSessionIDs: string[];
7
+ }): Promise<string | undefined>;
@@ -1,9 +1,10 @@
1
1
  import type { PluginInput } from "@opencode-ai/plugin";
2
- import type { SessionState } from "./types";
2
+ import type { PendingTaskRef, SessionState } from "./types";
3
3
  import type { ToolExecuteAfterInput, ToolExecuteAfterOutput } from "./types";
4
4
  export declare function createToolExecuteAfterHandler(input: {
5
5
  ctx: PluginInput;
6
6
  pendingFilePaths: Map<string, string>;
7
+ pendingTaskRefs: Map<string, PendingTaskRef>;
7
8
  autoCommit: boolean;
8
9
  getState: (sessionID: string) => SessionState;
9
10
  }): (toolInput: ToolExecuteAfterInput, toolOutput: ToolExecuteAfterOutput) => Promise<void>;
@@ -1,7 +1,9 @@
1
1
  import type { PluginInput } from "@opencode-ai/plugin";
2
+ import type { PendingTaskRef } from "./types";
2
3
  export declare function createToolExecuteBeforeHandler(input: {
3
4
  ctx: PluginInput;
4
5
  pendingFilePaths: Map<string, string>;
6
+ pendingTaskRefs: Map<string, PendingTaskRef>;
5
7
  }): (toolInput: {
6
8
  tool: string;
7
9
  sessionID?: string;
@@ -1,5 +1,6 @@
1
1
  import type { AgentOverrides } from "../../config";
2
2
  import type { BackgroundManager } from "../../features/background-agent";
3
+ import type { TopLevelTaskRef } from "../../features/boulder-state";
3
4
  export type ModelInfo = {
4
5
  providerID: string;
5
6
  modelID: string;
@@ -8,7 +9,6 @@ export interface AtlasHookOptions {
8
9
  directory: string;
9
10
  backgroundManager?: BackgroundManager;
10
11
  isContinuationStopped?: (sessionID: string) => boolean;
11
- shouldSkipContinuation?: (sessionID: string) => boolean;
12
12
  agentOverrides?: AgentOverrides;
13
13
  /** Enable auto-commit after each atomic task completion (default: true) */
14
14
  autoCommit?: boolean;
@@ -23,6 +23,18 @@ export interface ToolExecuteAfterOutput {
23
23
  output: string;
24
24
  metadata: Record<string, unknown>;
25
25
  }
26
+ export type TrackedTopLevelTaskRef = Pick<TopLevelTaskRef, "key" | "label" | "title">;
27
+ export type PendingTaskRef = {
28
+ kind: "track";
29
+ task: TrackedTopLevelTaskRef;
30
+ } | {
31
+ kind: "skip";
32
+ reason: "explicit_resume";
33
+ } | {
34
+ kind: "skip";
35
+ reason: "ambiguous_task_key";
36
+ task: TrackedTopLevelTaskRef;
37
+ };
26
38
  export interface SessionState {
27
39
  lastEventWasAbortError?: boolean;
28
40
  lastContinuationInjectedAt?: number;
@@ -27,7 +27,6 @@ export { createCategorySkillReminderHook } from "./category-skill-reminder";
27
27
  export { createRalphLoopHook, type RalphLoopHook } from "./ralph-loop";
28
28
  export { createNoSisyphusGptHook } from "./no-sisyphus-gpt";
29
29
  export { createNoHephaestusNonGptHook } from "./no-hephaestus-non-gpt";
30
- export { createGptPermissionContinuationHook, type GptPermissionContinuationHook } from "./gpt-permission-continuation";
31
30
  export { createAutoSlashCommandHook } from "./auto-slash-command";
32
31
  export { createEditErrorRecoveryHook } from "./edit-error-recovery";
33
32
  export { createPrometheusMdOnlyHook } from "./prometheus-md-only";
@@ -49,3 +48,4 @@ export { createHashlineReadEnhancerHook } from "./hashline-read-enhancer";
49
48
  export { createJsonErrorRecoveryHook, JSON_ERROR_TOOL_EXCLUDE_LIST, JSON_ERROR_PATTERNS, JSON_ERROR_REMINDER } from "./json-error-recovery";
50
49
  export { createReadImageResizerHook } from "./read-image-resizer";
51
50
  export { createTodoDescriptionOverrideHook } from "./todo-description-override";
51
+ export { createWebFetchRedirectGuardHook } from "./webfetch-redirect-guard";
@@ -1,6 +1,6 @@
1
1
  export declare const CODE_BLOCK_PATTERN: RegExp;
2
2
  export declare const INLINE_CODE_PATTERN: RegExp;
3
- export { isPlannerAgent, getUltraworkMessage } from "./ultrawork";
3
+ export { isPlannerAgent, isNonOmoAgent, getUltraworkMessage } from "./ultrawork";
4
4
  export { SEARCH_PATTERN, SEARCH_MESSAGE } from "./search";
5
5
  export { ANALYZE_PATTERN, ANALYZE_MESSAGE } from "./analyze";
6
6
  export type KeywordDetector = {