@humwick/runner 0.130.5 → 0.130.6

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 (211) hide show
  1. package/agent-bin/humwick +2 -2
  2. package/agent-bin/humwick-browser +4 -0
  3. package/hooks/fff-search-redirect/fff-search-redirect.cjs +1 -1
  4. package/hooks/web-tools-redirect/web-tools-redirect.cjs +2 -2
  5. package/package.json +7 -10
  6. package/plugins/browser/skills/playwright-cli/SKILL.md +8 -6
  7. package/plugins/claude/.claude-plugin/plugin.json +3 -3
  8. package/plugins/claude/claude-statusline-probe.cjs +26 -16
  9. package/plugins/claude/hooks/gate-run-guard.provisioned.mjs +47 -17
  10. package/plugins/claude/hooks/gate-run-guard.sh +3 -3
  11. package/plugins/claude/hooks/gate-run-guard.ts +5 -5
  12. package/plugins/claude/hooks/kill-guard.sh +4 -4
  13. package/plugins/claude/hooks/kill-guard.ts +1 -1
  14. package/plugins/claude/hooks/permission-request.sh +1 -1
  15. package/plugins/claude/hooks/post-compact.sh +1 -1
  16. package/plugins/claude/hooks/post-tool-use.sh +3 -3
  17. package/plugins/claude/hooks/pre-compact.sh +2 -2
  18. package/plugins/claude/hooks/read-only-bash-guard.sh +4 -4
  19. package/plugins/claude/hooks/relay-status.sh +32 -32
  20. package/plugins/claude/hooks/session-end.sh +2 -2
  21. package/plugins/claude/hooks/session-start.sh +3 -3
  22. package/plugins/claude/hooks/shell-trust.ts +1 -1
  23. package/plugins/claude/hooks/stop-failure.sh +2 -2
  24. package/plugins/claude/hooks/stop.sh +6 -6
  25. package/plugins/claude/hooks/subagent-skill-policy.cjs +8 -6
  26. package/plugins/claude/hooks/subagent-stop.sh +3 -3
  27. package/plugins/claude/hooks/user-prompt-submit.sh +1 -1
  28. package/plugins/claude/hooks/wait-loop-guard.ts +3 -3
  29. package/plugins/claude/monitors/monitors.json +2 -2
  30. package/plugins/claude/monitors/relay-monitor.provisioned.mjs +96 -62
  31. package/plugins/claude/monitors/relay-monitor.ts +5 -5
  32. package/plugins/claude/skills/label/SKILL.md +3 -3
  33. package/plugins/claude/skills/message/SKILL.md +5 -5
  34. package/plugins/claude/skills/react/SKILL.md +1 -1
  35. package/plugins/claude/skills/read-message/SKILL.md +4 -4
  36. package/plugins/claude/skills/reply/SKILL.md +5 -5
  37. package/plugins/claude/skills/send-claimable/SKILL.md +5 -5
  38. package/plugins/claude/skills/slice-first/SKILL.md +5 -3
  39. package/plugins/claude/skills/slice-first/references/plan-recipe.md +30 -29
  40. package/plugins/claude/skills/status/SKILL.md +1 -1
  41. package/plugins/claude/skills/tags/SKILL.md +5 -5
  42. package/plugins/claude/skills/task/SKILL.md +10 -10
  43. package/plugins/claude-output-style/.claude-plugin/plugin.json +1 -1
  44. package/plugins/claude-output-style/output-styles/{agent-relay.md → humwick.md} +1 -1
  45. package/plugins/codex/skills/guide/SKILL.md +1 -1
  46. package/plugins/codex/skills/label/SKILL.md +3 -3
  47. package/plugins/codex/skills/message/SKILL.md +5 -5
  48. package/plugins/codex/skills/react/SKILL.md +1 -1
  49. package/plugins/codex/skills/read-message/SKILL.md +4 -4
  50. package/plugins/codex/skills/reply/SKILL.md +5 -5
  51. package/plugins/codex/skills/send-claimable/SKILL.md +5 -5
  52. package/plugins/codex/skills/slice-first/SKILL.md +5 -3
  53. package/plugins/codex/skills/slice-first/references/plan-recipe.md +30 -29
  54. package/plugins/codex/skills/status/SKILL.md +1 -1
  55. package/plugins/codex/skills/tags/SKILL.md +5 -5
  56. package/plugins/codex/skills/task/SKILL.md +11 -10
  57. package/src/adapter.ts +95 -92
  58. package/src/adapters/claude-api.ts +8 -11
  59. package/src/adapters/claude-context-command.ts +1 -1
  60. package/src/adapters/claude-credentials.ts +7 -3
  61. package/src/adapters/claude-delivery-lanes.ts +2 -2
  62. package/src/adapters/claude-delivery.ts +16 -16
  63. package/src/adapters/claude-effort.ts +2 -2
  64. package/src/adapters/claude-exit.ts +2 -2
  65. package/src/adapters/claude-headless-mirror.ts +18 -2
  66. package/src/adapters/claude-headless-refusal.ts +3 -3
  67. package/src/adapters/claude-headless.ts +11 -10
  68. package/src/adapters/claude-launch-exit.ts +1 -1
  69. package/src/adapters/claude-monitor-delivery-plan.ts +36 -16
  70. package/src/adapters/claude-permission.ts +5 -5
  71. package/src/adapters/claude-prompt-gates.ts +9 -9
  72. package/src/adapters/claude-prompt-hook.ts +2 -2
  73. package/src/adapters/claude-session-capture.ts +6 -6
  74. package/src/adapters/claude-session-probe.ts +25 -25
  75. package/src/adapters/claude-shutdown.ts +11 -11
  76. package/src/adapters/claude-status-detectors.ts +31 -31
  77. package/src/adapters/claude-subagents.ts +7 -7
  78. package/src/adapters/claude-submit-confirmation.ts +6 -6
  79. package/src/adapters/claude-tmux.ts +43 -43
  80. package/src/adapters/claude-token-usage-capture.ts +5 -5
  81. package/src/adapters/claude-tool-policy.ts +7 -7
  82. package/src/adapters/claude-transcript.ts +24 -24
  83. package/src/adapters/claude.ts +100 -100
  84. package/src/adapters/codex-agent-message-capture.ts +26 -63
  85. package/src/adapters/codex-app-server.ts +1 -1
  86. package/src/adapters/codex-client.ts +9 -9
  87. package/src/adapters/codex-effective-config.ts +1 -1
  88. package/src/adapters/codex-launch-config.ts +5 -5
  89. package/src/adapters/codex-rollout-context.ts +2 -2
  90. package/src/adapters/codex-skill-discovery.ts +1 -1
  91. package/src/adapters/codex-token-usage-capture.ts +16 -16
  92. package/src/adapters/codex-tool-output.ts +4 -4
  93. package/src/adapters/codex-version.ts +3 -3
  94. package/src/adapters/codex.ts +64 -64
  95. package/src/adapters/opencode-api.ts +1 -1
  96. package/src/adapters/opencode-context.ts +20 -22
  97. package/src/adapters/opencode-model-registry.ts +7 -7
  98. package/src/adapters/opencode-provider.ts +8 -8
  99. package/src/adapters/opencode-provisioning.ts +30 -0
  100. package/src/adapters/opencode-server-retry.ts +1 -1
  101. package/src/adapters/opencode-soft-steer.ts +5 -5
  102. package/src/adapters/opencode-spawn.ts +18 -14
  103. package/src/adapters/opencode-token-usage-capture.ts +12 -12
  104. package/src/adapters/opencode-tool-events.ts +15 -15
  105. package/src/adapters/opencode.ts +232 -232
  106. package/src/adapters/project-shell.ts +11 -11
  107. package/src/adapters/service-access.ts +6 -6
  108. package/src/adapters/tmux-offload.ts +9 -9
  109. package/src/adapters/tool-summary.ts +5 -5
  110. package/src/agent-redact.ts +1 -1
  111. package/src/agent-runner/commands/dispatch.ts +10 -10
  112. package/src/agent-runner/commands/lifecycle.ts +2 -2
  113. package/src/agent-runner/commands/prompt.ts +19 -19
  114. package/src/agent-runner/credentials.ts +5 -5
  115. package/src/agent-runner/inbox.ts +1 -1
  116. package/src/agent-runner/lifecycle-milestones.ts +3 -3
  117. package/src/agent-runner/lifecycle-phase.ts +2 -2
  118. package/src/agent-runner/liveness-exchange.ts +4 -10
  119. package/src/agent-runner/registration.ts +8 -8
  120. package/src/agent-runner/runner-context.ts +9 -14
  121. package/src/agent-runner/session-mirror.ts +12 -12
  122. package/src/agent-runner/task-claims.ts +2 -2
  123. package/src/agent-runner/token-usage-coverage.ts +1 -1
  124. package/src/agent-runner/turn-report.ts +12 -12
  125. package/src/api-budget-accounting.ts +3 -3
  126. package/src/area-memory.ts +6 -6
  127. package/src/artifact-path-materialize.ts +1 -1
  128. package/src/async-guard.ts +5 -5
  129. package/src/attachment-cache.ts +17 -22
  130. package/src/background-script-reconcile.ts +6 -6
  131. package/src/bounded-log.ts +1 -1
  132. package/src/busy-reconciler.ts +22 -22
  133. package/src/claim-tracker.ts +3 -3
  134. package/src/claude-settings.ts +8 -8
  135. package/src/claude-system-prompt.ts +1 -1
  136. package/src/claude-workspace-trust.ts +1 -1
  137. package/src/config.ts +62 -61
  138. package/src/context-boundary.ts +5 -5
  139. package/src/context-command.ts +3 -3
  140. package/src/control-server.ts +32 -32
  141. package/src/delivery-result.ts +2 -2
  142. package/src/effort-command.ts +2 -2
  143. package/src/empty-turn.ts +22 -14
  144. package/src/free-port.ts +1 -1
  145. package/src/gate-run-config.ts +3 -3
  146. package/src/host-asset-plan.ts +24 -17
  147. package/src/host-claude-config-worker.ts +2 -2
  148. package/src/host-sources.ts +2 -2
  149. package/src/index.ts +16 -16
  150. package/src/launch-assembly.ts +94 -96
  151. package/src/liveness.ts +15 -15
  152. package/src/logger.ts +3 -3
  153. package/src/mcp-outbox.ts +3 -3
  154. package/src/mcp-preflight.ts +2 -2
  155. package/src/mcp-source-selection.ts +2 -2
  156. package/src/mcp-tool-deferral.ts +1 -1
  157. package/src/mcp-vault-env.ts +2 -2
  158. package/src/message-body-config/config.ts +4 -4
  159. package/src/mid-turn-delivery.ts +2 -2
  160. package/src/native-memory-lever.ts +8 -8
  161. package/src/outbox.ts +15 -15
  162. package/src/pending-permission-store.ts +1 -1
  163. package/src/profile-home.ts +19 -19
  164. package/src/profile-projection.ts +26 -24
  165. package/src/project-instructions.ts +5 -5
  166. package/src/provider-auth-warning.ts +17 -0
  167. package/src/provider-double.ts +1 -1
  168. package/src/provider-hold.ts +3 -3
  169. package/src/provider-home-marker.ts +1 -1
  170. package/src/provider-home-tombstone.ts +1 -1
  171. package/src/provider-input-queue.ts +2 -2
  172. package/src/provider-integration.ts +15 -13
  173. package/src/provider-setup.ts +15 -3
  174. package/src/providers.ts +1 -1
  175. package/src/provisioning.ts +37 -40
  176. package/src/question-decision.ts +2 -2
  177. package/src/quota.ts +0 -6
  178. package/src/rate-limit.ts +24 -13
  179. package/src/refused-prompt-store.ts +2 -2
  180. package/src/relay-injection-events.ts +2 -2
  181. package/src/relay-instructions.ts +5 -5
  182. package/src/relay-mcp-proxy.long-turn-e2e.ts +13 -13
  183. package/src/relay-mcp-proxy.ts +57 -58
  184. package/src/relay-mcp.ts +55 -69
  185. package/src/reply-obligation-cache.ts +9 -9
  186. package/src/response-capture-report.ts +9 -9
  187. package/src/response-routing.ts +1 -1
  188. package/src/runner-core.ts +209 -222
  189. package/src/runner-exit.ts +1 -1
  190. package/src/runner-helpers.ts +10 -10
  191. package/src/runner-insights.ts +4 -2
  192. package/src/runner-mcp-proxy.ts +3 -3
  193. package/src/runner-spawn-config.ts +3 -3
  194. package/src/runtime-token-file.ts +1 -1
  195. package/src/runtime-token-remint.ts +1 -1
  196. package/src/service-access.ts +2 -2
  197. package/src/session-destroy.ts +1 -1
  198. package/src/session-insights.ts +1 -1
  199. package/src/session-scratch.ts +24 -37
  200. package/src/spawn-input.ts +6 -6
  201. package/src/startup-config-fetch.ts +4 -4
  202. package/src/subreaper.ts +3 -5
  203. package/src/test-run-dedup.ts +13 -13
  204. package/src/transcript-context.ts +2 -2
  205. package/src/transport-errors.ts +1 -1
  206. package/src/turn-opener.ts +1 -1
  207. package/src/turn-reconcile-event.ts +2 -2
  208. package/src/vault-proxy-hop.ts +2 -2
  209. package/src/web-tools.ts +2 -2
  210. package/agent-bin/agent-relay-browser +0 -10
  211. package/src/adapters/provider-quota-harvest.ts +0 -76
@@ -19,7 +19,7 @@ function basic(user: string, password: string): string {
19
19
  }
20
20
 
21
21
  /**
22
- * #3577: a running provider cannot take a new proxy URL, and Agent Vault sessions cannot be extended.
22
+ * a running provider cannot take a new proxy URL, and Agent Vault sessions cannot be extended.
23
23
  * The provider therefore talks to this loopback hop, which forwards each request to the Vault proxy with
24
24
  * the current session token. Agent Vault authenticates at CONNECT, so rotation never touches open tunnels.
25
25
  */
@@ -36,7 +36,7 @@ export async function startVaultProxyHop(upstreamUrl: string, vault: string, tok
36
36
  const [requestLine = "", ...headers] = head.split("\r\n");
37
37
  const presented = Buffer.from(headers.find((line) => /^proxy-authorization:/i.test(line))?.slice(20).trim() ?? "");
38
38
  if (presented.length !== expected.length || !timingSafeEqual(presented, expected)) {
39
- client.end("HTTP/1.1 407 Proxy Authentication Required\r\nProxy-Authenticate: Basic realm=\"agent-relay\"\r\nContent-Length: 0\r\nConnection: close\r\n\r\n");
39
+ client.end("HTTP/1.1 407 Proxy Authentication Required\r\nProxy-Authenticate: Basic realm=\"humwick\"\r\nContent-Length: 0\r\nConnection: close\r\n\r\n");
40
40
  return;
41
41
  }
42
42
  const tunnel = /^CONNECT\s/i.test(requestLine);
package/src/web-tools.ts CHANGED
@@ -32,7 +32,7 @@ export function claudeWebToolsSteer(config: WebToolsConfig): string {
32
32
 
33
33
  /** Always set, so a launch never inherits a parent agent's list. */
34
34
  export function webToolsEnv(config: WebToolsConfig): Record<string, string> {
35
- return writeChildEnv({}, { [WEB_TOOLS_ENV]: launchWebTools(config).join(","), AGENT_RELAY_WEB_SEARCH: webSearchEnabledFromEnv() ? "1" : "0" });
35
+ return writeChildEnv({}, { [WEB_TOOLS_ENV]: launchWebTools(config).join(","), HUMWICK_WEB_SEARCH: webSearchEnabledFromEnv() ? "1" : "0" }, []);
36
36
  }
37
37
 
38
38
  /** Codex hides switched-off tools on the flat bridge with its native per-server denylist. */
@@ -47,7 +47,7 @@ export function openCodeWebToolsConfig(config: WebToolsConfig): { tools?: Record
47
47
  return disabled.length ? { tools: Object.fromEntries(disabled.map((tool) => [`${SHARED_MCP_SERVER_NAME}_${tool}`, false])) } : {};
48
48
  }
49
49
 
50
- /** #3250: Codex's one web_search tool also owns open/find; it cannot disable search and fetch separately. */
50
+ /** Codex's one web_search tool also owns open/find; it cannot disable search and fetch separately. */
51
51
  export function codexWebToolsConfigArgs(config: WebToolsConfig): string[] {
52
52
  return launchWebTools(config).length ? ["-c", 'web_search="disabled"'] : [];
53
53
  }
@@ -1,10 +0,0 @@
1
- #!/bin/sh
2
- # Humwick #3489: `humwick browser` from the release this agent's runner belongs to, never an older
3
- # install a login shell puts first on PATH. Checkout: <root>/runner/agent-bin -> <root>/src;
4
- # npm: node_modules/@humwick/runner/agent-bin -> node_modules/@humwick/server/src.
5
- here=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P) || exit 1
6
- for cli in "$here/../../src/index.ts" "$here/../../server/src/index.ts"; do
7
- if [ -f "$cli" ]; then exec "${AGENT_RELAY_BUN_BIN:-bun}" run --no-env-file "$cli" browser "$@"; fi
8
- done
9
- echo "agent-relay-browser: no Humwick CLI next to $here" >&2
10
- exit 127
@@ -1,76 +0,0 @@
1
- import { writeChildEnv } from "@humwick/sdk/env";
2
- import type { QuotaState, HeartbeatReport, HeartbeatResult } from "@humwick/sdk";
3
- import { getManifest } from "@humwick/providers";
4
- import { quotaStateFromProbeMetrics } from "@humwick/sdk/context-probe";
5
- import { claudeQuotaGeneration, claudeQuotaUnavailableWindows } from "@humwick/sdk/provider-quota-order";
6
- import { readRunnerContextProbeState } from "../context-probe-state";
7
- import { providerHostConfigHome } from "../profile-home";
8
- import { resolveClaudeStatuslineQuotaIdentity, type ProviderQuotaIdentity } from "../quota";
9
-
10
- const PASSIVE_QUOTA_SAMPLE_STALE_MS = 10 * 60_000;
11
-
12
- interface ProviderQuotaHarvestOptions {
13
- agentId: string;
14
- provider: string;
15
- /** The runner's per-provider config env (central provider-config values), read lazily each publish. */
16
- providerConfigEnv: () => Record<string, string>;
17
- }
18
-
19
- export class ProviderQuotaHarvest {
20
- private lastReportedObservedAt?: number;
21
- private nextAttemptAt = 0;
22
- private lease?: { accountKey: string; leaseToken: string };
23
-
24
- constructor(private readonly options: ProviderQuotaHarvestOptions) {}
25
-
26
- async sample(): Promise<Pick<HeartbeatReport, "providerQuota" | "quotaLeaseToken"> | undefined> {
27
- if (getManifest(this.options.provider)?.shim?.kind !== "claude-relay" || Date.now() < this.nextAttemptAt) return;
28
- const metrics = readRunnerContextProbeState(this.options.agentId);
29
- const quota = metrics ? freshQuotaFromProbeMetrics(metrics, Date.now()) : undefined;
30
- if (!quota || (this.lastReportedObservedAt !== undefined && quota.updatedAt <= this.lastReportedObservedAt)) return;
31
- const identity = await this.resolveIdentity();
32
- if (!identity) return;
33
- return {
34
- providerQuota: { provider: this.options.provider, accountKey: identity.accountKey, quota,
35
- unavailableWindows: claudeQuotaUnavailableWindows(quota), lastAttemptAt: Date.now(), sourceAgentId: this.options.agentId },
36
- ...(this.lease?.accountKey === identity.accountKey ? { quotaLeaseToken: this.lease.leaseToken } : {}),
37
- };
38
- }
39
-
40
- accept(report: HeartbeatReport, result: HeartbeatResult["providerQuota"]): void {
41
- if (!result || !report.providerQuota) return;
42
- this.nextAttemptAt = Date.now() + result.retryAfterMs;
43
- if (result.reported) this.lastReportedObservedAt = report.providerQuota.quota?.updatedAt;
44
- if (result.leaseToken) this.lease = { accountKey: report.providerQuota.accountKey, leaseToken: result.leaseToken };
45
- }
46
-
47
- // #2514 — quota identity resolves exactly as the LAUNCH authenticates. The primary claude
48
- // runner keeps the historical ambient-env read byte-for-byte. A claude-family provider with
49
- // its own subscription (claude-b) must never inherit the ambient primary credential env
50
- // (CLAUDE_CODE_OAUTH_TOKEN outranks the file credential, so the B quota would be keyed — and
51
- // folded — under the A account): its identity comes from its OWN dedicated home plus its
52
- // provider-scoped config env, mirroring the adapter launch scrub and the orchestrator's
53
- // providerCredentialProbeEnv precedence.
54
- private async resolveIdentity(): Promise<ProviderQuotaIdentity | undefined> {
55
- if (this.options.provider === "claude") {
56
- return resolveClaudeStatuslineQuotaIdentity({ env: process.env });
57
- }
58
- const providerEnv = this.options.providerConfigEnv();
59
- return resolveClaudeStatuslineQuotaIdentity({
60
- provider: this.options.provider,
61
- env: writeChildEnv({}, { CLAUDE_CODE_OAUTH_TOKEN: providerEnv.CLAUDE_CODE_OAUTH_TOKEN }),
62
- configDir: providerHostConfigHome(this.options.provider),
63
- });
64
- }
65
-
66
- }
67
-
68
- function freshQuotaFromProbeMetrics(metrics: NonNullable<ReturnType<typeof readRunnerContextProbeState>>, now: number): QuotaState | undefined {
69
- if (now - (metrics.quotaObservedAt ?? metrics.timestamp) > PASSIVE_QUOTA_SAMPLE_STALE_MS) return undefined;
70
- const quota = quotaStateFromProbeMetrics(metrics);
71
- if (!quota) return undefined;
72
- const windows = quota.windows.filter((window) => window.resetsAt === undefined || window.resetsAt > now);
73
- const live: QuotaState = { ...quota, windows };
74
- // Do not turn an expired cached 5h reading into a fresh weekly-only observation (#3087).
75
- return windows.length > 0 && (claudeQuotaGeneration(live) !== undefined || claudeQuotaUnavailableWindows(quota).length > 0) ? live : undefined;
76
- }