@agentdocumentformat/cli 0.8.0 → 0.8.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 (34) hide show
  1. package/dist/adf.mjs +6 -6
  2. package/dist/chunks/{App-A5GUFCFJ.mjs → App-4AZZJNN2.mjs} +511 -406
  3. package/dist/chunks/{adf-schema-YJSGLMA4.mjs → adf-schema-AIPBQTR2.mjs} +9 -3
  4. package/dist/chunks/{chunk-AZYOXXVL.mjs → chunk-2Z7X3UUR.mjs} +11 -198
  5. package/dist/chunks/{chunk-4OGZFUKA.mjs → chunk-7JZXMDDF.mjs} +33 -1
  6. package/dist/chunks/{chunk-V2T6NZX2.mjs → chunk-AEAJDCVK.mjs} +1 -1
  7. package/dist/chunks/{chunk-NZO5O4VN.mjs → chunk-BR3AD5QZ.mjs} +7 -1
  8. package/dist/chunks/{chunk-WVTPPOKK.mjs → chunk-BS3USVEA.mjs} +14 -3
  9. package/dist/chunks/{chunk-JVPZIMXW.mjs → chunk-D7A77SNL.mjs} +1 -1
  10. package/dist/chunks/{chunk-LCMANRYY.mjs → chunk-E7LC6SHP.mjs} +1 -1
  11. package/dist/chunks/{chunk-LGL6ML37.mjs → chunk-F3WSCAJD.mjs} +1 -1
  12. package/dist/chunks/{chunk-6XQZGYMK.mjs → chunk-IMVMSU3A.mjs} +6 -2
  13. package/dist/chunks/{chunk-C4GA5SI4.mjs → chunk-KCIRFUZH.mjs} +2 -2
  14. package/dist/chunks/{chunk-YRMKSHW3.mjs → chunk-LVF2DRBR.mjs} +25 -12
  15. package/dist/chunks/{chunk-PRPTKMQW.mjs → chunk-RHBGCOS3.mjs} +2 -2
  16. package/dist/chunks/{chunk-WX6QCUWI.mjs → chunk-RJDOVMM4.mjs} +95 -12
  17. package/dist/chunks/{chunk-G6NBFYG5.mjs → chunk-SOSPQPEN.mjs} +189 -0
  18. package/dist/chunks/chunk-VENQBMOA.mjs +62 -0
  19. package/dist/chunks/{chunk-XT2BJUFC.mjs → chunk-YRBFIDLB.mjs} +33 -6
  20. package/dist/chunks/{claude-subscription-33BMZB6I.mjs → claude-subscription-EB4LAAVV.mjs} +3 -3
  21. package/dist/chunks/{cli-I47IFDHJ.mjs → cli-PCVFB6B4.mjs} +5 -5
  22. package/dist/chunks/{commands-E4EQUHE5.mjs → commands-KOMPXJZS.mjs} +3 -3
  23. package/dist/chunks/{daemon-FQ5BV3AP.mjs → daemon-BVDB565V.mjs} +729 -111
  24. package/dist/chunks/{daemon-control-L3CLG63P.mjs → daemon-control-MKN7G5M3.mjs} +4 -4
  25. package/dist/chunks/{layout-EPJQNFAI.mjs → layout-ECWGJF6M.mjs} +2 -2
  26. package/dist/chunks/{open-TLGS2Z3Q.mjs → open-3OR6WT4T.mjs} +4 -4
  27. package/dist/chunks/{pipeline-executor-FD4FBWQA.mjs → pipeline-executor-DRYEEFDR.mjs} +4 -4
  28. package/dist/chunks/{remote-access-cli-XXAPQWH6.mjs → remote-access-cli-GLEEP7DI.mjs} +2 -2
  29. package/dist/chunks/sdk-OJOAF4DP.mjs +30014 -0
  30. package/dist/chunks/{store-ZRN2WCFB.mjs → store-55CQSAOX.mjs} +3 -2
  31. package/dist/chunks/{tui-SPSPDADM.mjs → tui-RAUVFOYY.mjs} +11 -11
  32. package/package.json +1 -1
  33. package/dist/chunks/sdk-5FD2ZP7N.mjs +0 -28422
  34. package/dist/chunks/{chunk-APRU6PHC.mjs → chunk-JZ7AQNPM.mjs} +3 -3
@@ -6,6 +6,8 @@ const __filename = __adfFileURLToPath(import.meta.url);
6
6
  const __dirname = __adfDirname(__filename);
7
7
  import {
8
8
  AdapterInstanceConfigSchema,
9
+ AgentCommandSchema,
10
+ AgentCommandsSchema,
9
11
  AgentConfigSchema,
10
12
  BindOptionsSchema,
11
13
  LOOP_GOAL_MAX_CHARS,
@@ -14,7 +16,6 @@ import {
14
16
  LOOP_TOOLS_MAX,
15
17
  LoopConfigSchema,
16
18
  LoopsConfigSchema,
17
- MAX_SIDE_LOOPS,
18
19
  ModelConfigSchema,
19
20
  PreLlmHookConfigSchema,
20
21
  ServingApiRouteSchema,
@@ -29,13 +30,18 @@ import {
29
30
  TriggersConfigV3Schema,
30
31
  UmbilicalFilterSchema,
31
32
  WsConnectionConfigSchema
32
- } from "./chunk-XT2BJUFC.mjs";
33
- import "./chunk-NZO5O4VN.mjs";
33
+ } from "./chunk-YRBFIDLB.mjs";
34
+ import "./chunk-VENQBMOA.mjs";
35
+ import {
36
+ MAX_SIDE_LOOPS
37
+ } from "./chunk-BR3AD5QZ.mjs";
34
38
  import "./chunk-ZJKXHM4Q.mjs";
35
39
  import "./chunk-RIX34QHC.mjs";
36
40
  import "./chunk-M2RX3S2T.mjs";
37
41
  export {
38
42
  AdapterInstanceConfigSchema,
43
+ AgentCommandSchema,
44
+ AgentCommandsSchema,
39
45
  AgentConfigSchema,
40
46
  BindOptionsSchema,
41
47
  LOOP_GOAL_MAX_CHARS,
@@ -4,19 +4,14 @@ import { dirname as __adfDirname } from 'node:path';
4
4
  const require = __adfCreateRequire(import.meta.url);
5
5
  const __filename = __adfFileURLToPath(import.meta.url);
6
6
  const __dirname = __adfDirname(__filename);
7
- import {
8
- require_jsx_runtime
9
- } from "./chunk-7CV2SA3H.mjs";
10
- import {
11
- cjs
12
- } from "./chunk-SGUTYISF.mjs";
13
7
  import {
14
8
  WELCOME_OVERLAY
15
9
  } from "./chunk-O7XKQ6CH.mjs";
16
10
  import {
17
11
  mcp_config_exports,
18
- mcp_registry_exports
19
- } from "./chunk-G6NBFYG5.mjs";
12
+ mcp_registry_exports,
13
+ provider_catalog_exports
14
+ } from "./chunk-SOSPQPEN.mjs";
20
15
  import {
21
16
  Box_default,
22
17
  Text
@@ -24,6 +19,12 @@ import {
24
19
  import {
25
20
  useTheme
26
21
  } from "./chunk-NZLEPJ5M.mjs";
22
+ import {
23
+ require_jsx_runtime
24
+ } from "./chunk-7CV2SA3H.mjs";
25
+ import {
26
+ cjs
27
+ } from "./chunk-SGUTYISF.mjs";
27
28
  import {
28
29
  require_react
29
30
  } from "./chunk-6GJ4QHRI.mjs";
@@ -31,7 +32,6 @@ import {
31
32
  adapter_registry_exports
32
33
  } from "./chunk-UYY5M2PB.mjs";
33
34
  import {
34
- __export,
35
35
  __toESM
36
36
  } from "./chunk-M2RX3S2T.mjs";
37
37
 
@@ -383,202 +383,15 @@ function configuredChannels(config) {
383
383
  return Object.keys(config?.adapters ?? {});
384
384
  }
385
385
 
386
- // src/shared/constants/provider-catalog.ts
387
- var provider_catalog_exports = {};
388
- __export(provider_catalog_exports, {
389
- PROVIDER_CATALOG: () => PROVIDER_CATALOG,
390
- PROVIDER_CATALOG_GROUPS: () => PROVIDER_CATALOG_GROUPS,
391
- catalogEntryForProvider: () => catalogEntryForProvider,
392
- findCatalogEntry: () => findCatalogEntry,
393
- isSubscriptionType: () => isSubscriptionType,
394
- nextProviderName: () => nextProviderName,
395
- providerTypeHint: () => providerTypeHint
396
- });
397
- var PROVIDER_CATALOG_GROUPS = [
398
- { id: "subscription", label: "Subscriptions", hint: "Sign in with an existing consumer plan. No API key." },
399
- { id: "api", label: "APIs", hint: "Pay-as-you-go endpoints. Paste an API key." },
400
- { id: "local", label: "Local", hint: "Servers running on this machine. Usually no key." },
401
- { id: "other", label: "Other", hint: "Anything that speaks the OpenAI API." }
402
- ], oc = (key, label, baseUrl, description, extra = {}) => ({
403
- key,
404
- label,
405
- type: "openai-compatible",
406
- group: "api",
407
- baseUrl,
408
- description,
409
- keyPlaceholder: "API key",
410
- modelPlaceholder: "model id",
411
- ...extra
412
- }), local = (key, label, baseUrl, description, extra = {}) => ({
413
- key,
414
- label,
415
- type: "openai-compatible",
416
- group: "local",
417
- baseUrl,
418
- description,
419
- keyPlaceholder: "Usually not needed",
420
- modelPlaceholder: "loaded model id",
421
- keyOptional: !0,
422
- ...extra
423
- }), PROVIDER_CATALOG = [
424
- // ---- Subscriptions --------------------------------------------------------
425
- {
426
- key: "chatgpt-subscription",
427
- label: "ChatGPT",
428
- type: "chatgpt-subscription",
429
- group: "subscription",
430
- description: "Use your ChatGPT Plus / Pro plan. Sign in with your OpenAI account.",
431
- modelPlaceholder: "e.g. gpt-5.6-sol",
432
- iconKey: "openai"
433
- },
434
- {
435
- key: "grok-subscription",
436
- label: "Grok",
437
- type: "grok-subscription",
438
- group: "subscription",
439
- description: "Use your SuperGrok or X Premium plan. Sign in with xAI.",
440
- modelPlaceholder: "e.g. grok-4.5",
441
- iconKey: "x"
442
- },
443
- {
444
- key: "claude-subscription",
445
- label: "Claude",
446
- type: "claude-subscription",
447
- group: "subscription",
448
- description: "Use your Claude Pro or Max plan, via Claude Code.",
449
- modelPlaceholder: "e.g. claude-sonnet-5-5",
450
- iconKey: "anthropic"
451
- },
452
- // ---- First-party APIs -----------------------------------------------------
453
- {
454
- key: "anthropic",
455
- label: "Anthropic",
456
- type: "anthropic",
457
- group: "api",
458
- description: "Claude models via the Anthropic API.",
459
- keyPlaceholder: "sk-ant-...",
460
- modelPlaceholder: "e.g. claude-sonnet-4-5",
461
- iconKey: "anthropic",
462
- keysUrl: "https://console.anthropic.com/settings/keys"
463
- },
464
- {
465
- key: "openai",
466
- label: "OpenAI",
467
- type: "openai",
468
- group: "api",
469
- description: "GPT and o-series models via the OpenAI API.",
470
- keyPlaceholder: "sk-...",
471
- modelPlaceholder: "e.g. gpt-4o, o3-mini",
472
- iconKey: "openai",
473
- keysUrl: "https://platform.openai.com/api-keys"
474
- },
475
- {
476
- key: "openrouter",
477
- label: "OpenRouter",
478
- type: "openrouter",
479
- group: "api",
480
- description: "One key for hundreds of models across providers.",
481
- keyPlaceholder: "sk-or-...",
482
- modelPlaceholder: "e.g. anthropic/claude-sonnet-4",
483
- iconKey: "openrouter",
484
- keysUrl: "https://openrouter.ai/keys"
485
- },
486
- // ---- OpenAI-compatible hosted APIs ---------------------------------------
487
- oc("gemini", "Google Gemini", "https://generativelanguage.googleapis.com/v1beta/openai", "Gemini models through the OpenAI-compatible endpoint.", { iconKey: "gemini", keysUrl: "https://aistudio.google.com/apikey", modelPlaceholder: "e.g. gemini-2.5-pro" }),
488
- oc("xai", "xAI", "https://api.x.ai/v1", "Grok models via the xAI API.", { iconKey: "x", keysUrl: "https://console.x.ai", modelPlaceholder: "e.g. grok-4" }),
489
- oc("mistral", "Mistral", "https://api.mistral.ai/v1", "Mistral and Codestral models.", { iconKey: "mistral", keysUrl: "https://console.mistral.ai/api-keys", modelPlaceholder: "e.g. mistral-large-latest" }),
490
- oc("deepseek", "DeepSeek", "https://api.deepseek.com/v1", "DeepSeek chat and reasoner models.", { iconKey: "deepseek", keysUrl: "https://platform.deepseek.com/api_keys", modelPlaceholder: "e.g. deepseek-chat" }),
491
- oc("groq", "Groq", "https://api.groq.com/openai/v1", "Fast inference for open models on LPUs.", { keysUrl: "https://console.groq.com/keys", modelPlaceholder: "e.g. llama-3.3-70b-versatile" }),
492
- oc("cerebras", "Cerebras", "https://api.cerebras.ai/v1", "Very fast inference for open models.", { keysUrl: "https://cloud.cerebras.ai", modelPlaceholder: "e.g. llama-3.3-70b" }),
493
- oc("together", "Together AI", "https://api.together.xyz/v1", "Open models, fine-tunes, and dedicated endpoints.", { keysUrl: "https://api.together.ai/settings/api-keys", modelPlaceholder: "e.g. meta-llama/Llama-3.3-70B-Instruct-Turbo" }),
494
- oc("fireworks", "Fireworks AI", "https://api.fireworks.ai/inference/v1", "Fast serverless inference for open models.", { keysUrl: "https://fireworks.ai/account/api-keys", modelPlaceholder: "e.g. accounts/fireworks/models/llama-v3p3-70b-instruct" }),
495
- oc("perplexity", "Perplexity", "https://api.perplexity.ai", "Sonar models with built-in web search.", { iconKey: "perplexity", keysUrl: "https://www.perplexity.ai/settings/api", modelPlaceholder: "e.g. sonar-pro" }),
496
- oc("cohere", "Cohere", "https://api.cohere.ai/compatibility/v1", "Command models through the compatibility API.", { keysUrl: "https://dashboard.cohere.com/api-keys", modelPlaceholder: "e.g. command-a-03-2025" }),
497
- oc("huggingface", "Hugging Face", "https://router.huggingface.co/v1", "Inference Providers router. Uses your HF token.", { iconKey: "huggingface", keysUrl: "https://huggingface.co/settings/tokens", keyPlaceholder: "hf_...", modelPlaceholder: "e.g. meta-llama/Llama-3.3-70B-Instruct" }),
498
- oc("nvidia", "NVIDIA NIM", "https://integrate.api.nvidia.com/v1", "Hosted NIM endpoints on build.nvidia.com.", { iconKey: "nvidia", keysUrl: "https://build.nvidia.com", keyPlaceholder: "nvapi-...", modelPlaceholder: "e.g. meta/llama-3.3-70b-instruct" }),
499
- oc("vercel-ai-gateway", "Vercel AI Gateway", "https://ai-gateway.vercel.sh/v1", "Route to many providers through one Vercel key.", { iconKey: "vercel", keysUrl: "https://vercel.com/dashboard/ai-gateway", modelPlaceholder: "e.g. anthropic/claude-sonnet-4" }),
500
- oc("cloudflare", "Cloudflare Workers AI", "https://api.cloudflare.com/client/v4/accounts/YOUR_ACCOUNT_ID/ai/v1", "Open models at the edge. Replace YOUR_ACCOUNT_ID in the base URL.", { iconKey: "cloudflare", keysUrl: "https://dash.cloudflare.com/profile/api-tokens", modelPlaceholder: "e.g. @cf/meta/llama-3.3-70b-instruct-fp8-fast" }),
501
- oc("azure-openai", "Azure OpenAI", "https://YOUR_RESOURCE.openai.azure.com/openai/v1", "Azure-hosted OpenAI models. Replace YOUR_RESOURCE in the base URL.", { keysUrl: "https://portal.azure.com", modelPlaceholder: "your deployment name" }),
502
- oc("deepinfra", "DeepInfra", "https://api.deepinfra.com/v1/openai", "Low-cost hosting for open models.", { keysUrl: "https://deepinfra.com/dash/api_keys", modelPlaceholder: "e.g. meta-llama/Llama-3.3-70B-Instruct" }),
503
- oc("sambanova", "SambaNova", "https://api.sambanova.ai/v1", "Fast inference on SambaNova RDUs.", { keysUrl: "https://cloud.sambanova.ai/apis", modelPlaceholder: "e.g. Meta-Llama-3.3-70B-Instruct" }),
504
- oc("nebius", "Nebius", "https://api.studio.nebius.com/v1", "Nebius AI Studio open-model endpoints.", { keysUrl: "https://studio.nebius.com/settings/api-keys", modelPlaceholder: "e.g. meta-llama/Llama-3.3-70B-Instruct" }),
505
- oc("hyperbolic", "Hyperbolic", "https://api.hyperbolic.xyz/v1", "Open models on decentralized GPU capacity.", { keysUrl: "https://app.hyperbolic.xyz/settings", modelPlaceholder: "e.g. meta-llama/Llama-3.3-70B-Instruct" }),
506
- oc("novita", "Novita AI", "https://api.novita.ai/v3/openai", "Serverless open-model inference.", { keysUrl: "https://novita.ai/settings/key-management", modelPlaceholder: "e.g. meta-llama/llama-3.3-70b-instruct" }),
507
- oc("baseten", "Baseten", "https://inference.baseten.co/v1", "Model APIs and dedicated deployments.", { keysUrl: "https://app.baseten.co/settings/api_keys", modelPlaceholder: "e.g. deepseek-ai/DeepSeek-V3-0324" }),
508
- oc("scaleway", "Scaleway", "https://api.scaleway.ai/v1", "EU-hosted generative APIs.", { iconKey: "scaleway", keysUrl: "https://console.scaleway.com/iam/api-keys", modelPlaceholder: "e.g. llama-3.3-70b-instruct" }),
509
- oc("venice", "Venice", "https://api.venice.ai/api/v1", "Private, uncensored open-model inference.", { keysUrl: "https://venice.ai/settings/api", modelPlaceholder: "e.g. llama-3.3-70b" }),
510
- oc("kluster", "kluster.ai", "https://api.kluster.ai/v1", "Open-model inference with batch pricing.", { keysUrl: "https://platform.kluster.ai/apikeys", modelPlaceholder: "e.g. deepseek-ai/DeepSeek-V3-0324" }),
511
- oc("moonshot", "Moonshot (Kimi)", "https://api.moonshot.ai/v1", "Kimi models from Moonshot AI.", { iconKey: "kimi", keysUrl: "https://platform.moonshot.ai/console/api-keys", modelPlaceholder: "e.g. kimi-k2-0711-preview" }),
512
- oc("zai", "Z.ai (GLM)", "https://api.z.ai/api/paas/v4", "GLM models from Zhipu / Z.ai.", { keysUrl: "https://z.ai/manage-apikey/apikey-list", modelPlaceholder: "e.g. glm-4.5" }),
513
- oc("qwen", "Qwen (Alibaba)", "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", "Qwen models via Model Studio (international).", { iconKey: "qwen", keysUrl: "https://modelstudio.console.alibabacloud.com/?tab=playground#/api-key", modelPlaceholder: "e.g. qwen-plus" }),
514
- oc("minimax", "MiniMax", "https://api.minimax.io/v1", "MiniMax text models.", { iconKey: "minimax", keysUrl: "https://platform.minimax.io/user-center/basic-information/interface-key", modelPlaceholder: "e.g. MiniMax-M1" }),
515
- oc("inception", "Inception", "https://api.inceptionlabs.ai/v1", "Mercury diffusion language models.", { keysUrl: "https://platform.inceptionlabs.ai", modelPlaceholder: "e.g. mercury-coder" }),
516
- // ---- Local servers ---------------------------------------------------------
517
- local("lmstudio", "LM Studio", "http://localhost:1234/v1", "Local server from the LM Studio app.", { iconKey: "lmstudio" }),
518
- local("ollama", "Ollama", "http://localhost:11434/v1", "Local models served by Ollama.", { iconKey: "ollama", modelPlaceholder: "e.g. llama3.3" }),
519
- local("vllm", "vLLM", "http://localhost:8000/v1", "vLLM OpenAI-compatible server.", { iconKey: "vllm" }),
520
- local("llamacpp", "llama.cpp", "http://localhost:8080/v1", "llama-server from llama.cpp."),
521
- local("litellm", "LiteLLM", "http://localhost:4000/v1", "LiteLLM proxy in front of any provider.", { keyOptional: !1, keyPlaceholder: "Proxy key, if set" }),
522
- local("jan", "Jan", "http://localhost:1337/v1", "Local server from the Jan app."),
523
- local("localai", "LocalAI", "http://localhost:8080/v1", "LocalAI drop-in OpenAI server."),
524
- local("tgwui", "text-generation-webui", "http://localhost:5000/v1", "oobabooga OpenAI extension."),
525
- // ---- Other -----------------------------------------------------------------
526
- {
527
- key: "openai-compatible",
528
- label: "OpenAI-compatible",
529
- type: "openai-compatible",
530
- group: "other",
531
- description: "Any endpoint that speaks the OpenAI chat API. Enter the base URL.",
532
- keyPlaceholder: "Optional",
533
- modelPlaceholder: "model id"
534
- }
535
- ], BY_KEY = new Map(PROVIDER_CATALOG.map((e) => [e.key, e]));
536
- function findCatalogEntry(key) {
537
- return key ? BY_KEY.get(key) : void 0;
538
- }
539
- function catalogEntryForProvider(p) {
540
- return findCatalogEntry(p.preset) ?? findCatalogEntry(p.type);
541
- }
542
- function nextProviderName(label, existing) {
543
- let taken = new Set(existing.map((p) => p.name.trim().toLowerCase()));
544
- if (!taken.has(label.toLowerCase())) return label;
545
- for (let n = 2; n < 1e3; n++) {
546
- let candidate = `${label} ${n}`;
547
- if (!taken.has(candidate.toLowerCase())) return candidate;
548
- }
549
- return `${label} ${Date.now()}`;
550
- }
551
- function providerTypeHint(type) {
552
- switch (type) {
553
- case "anthropic":
554
- return "Anthropic API";
555
- case "openai":
556
- return "OpenAI API";
557
- case "openrouter":
558
- return "OpenRouter API";
559
- case "openai-compatible":
560
- return "OpenAI-compatible API";
561
- case "chatgpt-subscription":
562
- return "ChatGPT subscription (OAuth)";
563
- case "grok-subscription":
564
- return "Grok subscription (OAuth)";
565
- case "claude-subscription":
566
- return "Claude subscription (via Claude Code)";
567
- }
568
- }
569
- function isSubscriptionType(type) {
570
- return type === "chatgpt-subscription" || type === "grok-subscription" || type === "claude-subscription";
571
- }
572
-
573
386
  // src/main/tui/setup/provider.ts
574
- var { PROVIDER_CATALOG: PROVIDER_CATALOG2 } = cjs(provider_catalog_exports), PROVIDER_OVERLAY = "provider.add", API_TYPES = /* @__PURE__ */ new Set(["anthropic", "openai", "openrouter", "openai-compatible"]), SIGN_IN = {
387
+ var { PROVIDER_CATALOG } = cjs(provider_catalog_exports), PROVIDER_OVERLAY = "provider.add", API_TYPES = /* @__PURE__ */ new Set(["anthropic", "openai", "openrouter", "openai-compatible"]), SIGN_IN = {
575
388
  "chatgpt-subscription": "chatgpt",
576
389
  "grok-subscription": "grok",
577
390
  "claude-subscription": "claude"
578
391
  };
579
392
  function providerRows() {
580
393
  let order = { subscription: 0, api: 1, local: 2, other: 3 };
581
- return [...PROVIDER_CATALOG2].filter((e) => e.group === "subscription" || API_TYPES.has(e.type)).sort((a, b) => (order[a.group] ?? 9) - (order[b.group] ?? 9)).map((entry) => ({
394
+ return [...PROVIDER_CATALOG].filter((e) => e.group === "subscription" || API_TYPES.has(e.type)).sort((a, b) => (order[a.group] ?? 9) - (order[b.group] ?? 9)).map((entry) => ({
582
395
  entry,
583
396
  ...SIGN_IN[entry.type] ? { signIn: SIGN_IN[entry.type] } : {}
584
397
  }));
@@ -14,6 +14,34 @@ import {
14
14
  __export
15
15
  } from "./chunk-M2RX3S2T.mjs";
16
16
 
17
+ // src/shared/utils/owner-command-row.ts
18
+ var owner_command_row_exports = {};
19
+ __export(owner_command_row_exports, {
20
+ OWNER_COMMAND_MARKER: () => OWNER_COMMAND_MARKER,
21
+ formatOwnerCommandRow: () => formatOwnerCommandRow,
22
+ isOwnerCommandRow: () => isOwnerCommandRow,
23
+ parseOwnerCommandRow: () => parseOwnerCommandRow
24
+ });
25
+ var OWNER_COMMAND_MARKER = "[Owner command] ";
26
+ function formatOwnerCommandRow(header, body) {
27
+ return `${OWNER_COMMAND_MARKER}${JSON.stringify(header)}
28
+ ${body}`;
29
+ }
30
+ function parseOwnerCommandRow(text) {
31
+ if (!text.startsWith(OWNER_COMMAND_MARKER)) return null;
32
+ let newline = text.indexOf(`
33
+ `);
34
+ try {
35
+ let header = JSON.parse(text.slice(OWNER_COMMAND_MARKER.length, newline < 0 ? void 0 : newline));
36
+ return !header || header.v !== 1 || typeof header.id != "string" || typeof header.command != "string" || typeof header.lambda != "string" || typeof header.authorized != "boolean" || typeof header.duration_ms != "number" || !Number.isFinite(header.duration_ms) || header.duration_ms < 0 || !["ok", "error", "denied"].includes(header.status) ? null : { header, body: newline < 0 ? "" : text.slice(newline + 1) };
37
+ } catch {
38
+ return null;
39
+ }
40
+ }
41
+ function isOwnerCommandRow(text) {
42
+ return parseOwnerCommandRow(text) !== null;
43
+ }
44
+
17
45
  // src/shared/utils/loop-parser.ts
18
46
  var loop_parser_exports = {};
19
47
  __export(loop_parser_exports, {
@@ -67,12 +95,14 @@ function isRuntimeNotice(text) {
67
95
  return RUNTIME_NOTICE_PREFIXES.some((prefix) => text.startsWith(prefix));
68
96
  }
69
97
  function isNoticeCategory(category) {
70
- return category === "runtime" || category === "status";
98
+ return category === "owner_command" || category === "runtime" || category === "status";
71
99
  }
72
100
  function providerContextCategory(addedBy) {
73
101
  return `provider_context | from=${addedBy.replace(/[\]|\n]/g, " ")}`;
74
102
  }
75
103
  function classifyInjectedText(text) {
104
+ let ownerCommand = parseOwnerCommandRow(text);
105
+ if (ownerCommand) return { content: ownerCommand.body, metadata: { category: "owner_command", ownerCommand: ownerCommand.header } };
76
106
  let context = text.match(/^\[Context: ([^\]]+)\] ?([\s\S]*)$/);
77
107
  if (context) {
78
108
  let [name, ...fields] = context[1].split(" | "), field = (key) => fields.find((f) => f.startsWith(`${key}=`))?.slice(key.length + 1), content = context[2];
@@ -418,6 +448,8 @@ function loopToLLMMessages(entries) {
418
448
  }
419
449
 
420
450
  export {
451
+ formatOwnerCommandRow,
452
+ owner_command_row_exports,
421
453
  formatTurnErrorRow,
422
454
  providerContextCategory,
423
455
  parseLoopToDisplay,
@@ -9,7 +9,7 @@ import {
9
9
  openKeychainBackend,
10
10
  readLocalProof,
11
11
  testSeamsAllowed
12
- } from "./chunk-WVTPPOKK.mjs";
12
+ } from "./chunk-BS3USVEA.mjs";
13
13
  import {
14
14
  daemonSettingsDir,
15
15
  readDaemonToken
@@ -37,7 +37,11 @@ var START_IN_STATES = ["active", "idle", "hibernate"];
37
37
  function resolveStartInState(config) {
38
38
  return config.start_in_state ?? "active";
39
39
  }
40
- var DEFAULT_NEW_LOOP_TOOLS = ["loop_send", "loop_list", "sys_set_state"], LOOP_PROHIBITED_TOOLS = ["sys_update_config", "loop_manage", "sys_create_adf"];
40
+ var DEFAULT_NEW_LOOP_TOOLS = ["loop_send", "loop_list", "sys_set_state"], MAX_SIDE_LOOPS = 16;
41
+ function hasLoopGoal(loop) {
42
+ return !!loop.goal?.trim();
43
+ }
44
+ var LOOP_PROHIBITED_TOOLS = ["sys_update_config", "loop_manage", "sys_create_adf"];
41
45
  var META_PROTECTION_LEVELS = ["none", "readonly", "increment"], FILE_PROTECTION_LEVELS = ["read_only", "no_delete", "none"];
42
46
  var DEFAULT_TOOLS = [
43
47
  { name: "fs_read", enabled: !0, visible: !0 },
@@ -287,6 +291,8 @@ export {
287
291
  START_IN_STATES,
288
292
  resolveStartInState,
289
293
  DEFAULT_NEW_LOOP_TOOLS,
294
+ MAX_SIDE_LOOPS,
295
+ hasLoopGoal,
290
296
  LOOP_PROHIBITED_TOOLS,
291
297
  META_PROTECTION_LEVELS,
292
298
  FILE_PROTECTION_LEVELS,
@@ -150,18 +150,29 @@ var KeychainSecretBackend = class {
150
150
  return !0;
151
151
  }
152
152
  get(account) {
153
- return this.entry(account).getPassword() ?? null;
153
+ let read = prereadValue(this.service, account);
154
+ return read !== void 0 ? read : this.entry(account).getPassword() ?? null;
154
155
  }
155
156
  set(account, value) {
156
- this.entry(account).setPassword(value);
157
+ this.entry(account).setPassword(value), preread?.service === this.service && preread.values.set(account, value);
157
158
  }
158
159
  delete(account) {
159
160
  try {
160
161
  this.entry(account).deleteCredential();
161
162
  } catch {
162
163
  }
164
+ preread?.service === this.service && preread.values.delete(account);
163
165
  }
164
- };
166
+ }, PREREAD_TTL_MS = 6e4, preread = null;
167
+ function prereadValue(service, account) {
168
+ if (!(!preread || preread.service !== service)) {
169
+ if (Date.now() - preread.at > PREREAD_TTL_MS) {
170
+ preread = null;
171
+ return;
172
+ }
173
+ return preread.values.get(account);
174
+ }
175
+ }
165
176
  function openKeychainBackend() {
166
177
  if (process.env.ADF_KEYCHAIN === "0" || process.env.ADF_KEYCHAIN === "off") return null;
167
178
  let Entry = loadKeyring();
@@ -6,7 +6,7 @@ const __filename = __adfFileURLToPath(import.meta.url);
6
6
  const __dirname = __adfDirname(__filename);
7
7
  import {
8
8
  testSeamsAllowed
9
- } from "./chunk-WVTPPOKK.mjs";
9
+ } from "./chunk-BS3USVEA.mjs";
10
10
  import {
11
11
  getUserDataPath
12
12
  } from "./chunk-PAK5JCO2.mjs";
@@ -7,7 +7,7 @@ const __dirname = __adfDirname(__filename);
7
7
  import {
8
8
  AGENT_DEFAULTS,
9
9
  DEFAULT_TOOLS
10
- } from "./chunk-NZO5O4VN.mjs";
10
+ } from "./chunk-BR3AD5QZ.mjs";
11
11
 
12
12
  // src/shared/constants/adf-defaults.ts
13
13
  var ADF_VERSION = "0.2", DOCS_GUIDES_URL = "https://raw.githubusercontent.com/christianbalevski/adf/main/docs/guides", ADF_SKILLS_REGISTRY_URL = "https://raw.githubusercontent.com/christianbalevski/adf/main/skills/registry.json", PROVIDER_TYPES = [
@@ -21,7 +21,7 @@ import {
21
21
  getCommand,
22
22
  notifyToolCallObservers,
23
23
  shellReadFile
24
- } from "./chunk-YRMKSHW3.mjs";
24
+ } from "./chunk-LVF2DRBR.mjs";
25
25
 
26
26
  // src/main/tools/shell/executor/pipeline-executor.ts
27
27
  function vfsPath(p) {
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-SGUTYISF.mjs";
14
14
  import {
15
15
  daemon_url_exports
16
- } from "./chunk-V2T6NZX2.mjs";
16
+ } from "./chunk-AEAJDCVK.mjs";
17
17
  import {
18
18
  __export
19
19
  } from "./chunk-M2RX3S2T.mjs";
@@ -391,7 +391,7 @@ var DaemonClient = class {
391
391
  return this.origin !== null && originOf(url) === this.origin;
392
392
  }
393
393
  async request(method, path, options = {}, retried = !1) {
394
- let controller = new AbortController(), timeoutMs = options.timeoutMs ?? this.timeoutMs, timer = setTimeout(() => controller.abort(new Error("timeout")), timeoutMs), onAbort = () => controller.abort(options.signal?.reason);
394
+ let controller = new AbortController(), timeoutMs = options.timeoutMs ?? this.timeoutMs, timer = timeoutMs === 0 ? void 0 : setTimeout(() => controller.abort(new Error("timeout")), timeoutMs), onAbort = () => controller.abort(options.signal?.reason);
395
395
  options.signal?.aborted ? onAbort() : options.signal?.addEventListener("abort", onAbort, { once: !0 });
396
396
  let url = this.url(path, options.query), response, text, own = this.ownsUrl(url);
397
397
  try {
@@ -676,6 +676,10 @@ var DaemonClient = class {
676
676
  autostart(trackedDirs, maxDepth) {
677
677
  return this.post("/agents/autostart", { trackedDirs, ...maxDepth !== void 0 ? { maxDepth } : {} });
678
678
  }
679
+ /** Run an owner command. The server bounds execution; owner protection approval may take longer. */
680
+ runCommand(agentId, name, body) {
681
+ return this.request("POST", `/agents/${enc(agentId)}/commands/${enc(name)}/run`, { body, timeoutMs: 0 });
682
+ }
679
683
  /** Compact one loop's history now. 409 while that loop is mid-turn. */
680
684
  compact(agentId, loop) {
681
685
  return this.post(`/agents/${enc(agentId)}/compact`, void 0, loop && loop !== MAIN_LOOP ? { loop } : void 0);
@@ -6,7 +6,7 @@ const __filename = __adfFileURLToPath(import.meta.url);
6
6
  const __dirname = __adfDirname(__filename);
7
7
  import {
8
8
  PROVIDER_TYPES
9
- } from "./chunk-LCMANRYY.mjs";
9
+ } from "./chunk-E7LC6SHP.mjs";
10
10
  import {
11
11
  require_supports_color
12
12
  } from "./chunk-NZ7JTHEO.mjs";
@@ -12044,7 +12044,7 @@ function buildTranscript(messages, sessionId, cwd, model) {
12044
12044
  }
12045
12045
 
12046
12046
  // src/main/providers/claude-subscription/session.ts
12047
- var sdkPromise = null, loadSdk = () => sdkPromise ??= import("./sdk-5FD2ZP7N.mjs"), ClaudeProviderError = class extends Error {
12047
+ var sdkPromise = null, loadSdk = () => sdkPromise ??= import("./sdk-OJOAF4DP.mjs"), ClaudeProviderError = class extends Error {
12048
12048
  constructor(message, status, responseHeaders) {
12049
12049
  super(message);
12050
12050
  this.status = status;
@@ -7,7 +7,7 @@ const __dirname = __adfDirname(__filename);
7
7
  import {
8
8
  DEFAULT_AGENT_CONFIG,
9
9
  DOCS_GUIDES_URL
10
- } from "./chunk-LCMANRYY.mjs";
10
+ } from "./chunk-E7LC6SHP.mjs";
11
11
  import {
12
12
  nanoid
13
13
  } from "./chunk-3GNIDM53.mjs";
@@ -28,8 +28,9 @@ import {
28
28
  LOOP_PROHIBITED_TOOLS,
29
29
  META_PROTECTION_LEVELS,
30
30
  SETTABLE_STATES,
31
- getDefaultDocumentContent
32
- } from "./chunk-NZO5O4VN.mjs";
31
+ getDefaultDocumentContent,
32
+ hasLoopGoal
33
+ } from "./chunk-BR3AD5QZ.mjs";
33
34
  import {
34
35
  __esm,
35
36
  __export
@@ -1561,7 +1562,7 @@ var xargsHandler = {
1561
1562
  batchSize = n;
1562
1563
  }
1563
1564
  if (!text) return ok("");
1564
- let { parse } = await import("./parser-7GARNT5L.mjs"), { executeNode } = await import("./pipeline-executor-FD4FBWQA.mjs"), subCtx = {
1565
+ let { parse } = await import("./parser-7GARNT5L.mjs"), { executeNode } = await import("./pipeline-executor-DRYEEFDR.mjs"), subCtx = {
1565
1566
  workspace: ctx.workspace,
1566
1567
  toolRegistry: ctx.toolRegistry,
1567
1568
  config: ctx.config,
@@ -2381,7 +2382,7 @@ async function executeShellScript(path, ctx) {
2381
2382
  authorized = ctx.workspace.isFileAuthorized(path);
2382
2383
  } catch {
2383
2384
  }
2384
- let gate = { ...ctx.gate ?? {}, authorized }, base = baseRegistry(ctx.toolRegistry), toolRegistry = gate.authorized ? authorizedRegistry(base) : base, { parse } = await import("./parser-7GARNT5L.mjs"), { executeNode, MAX_SHELL_DEPTH } = await import("./pipeline-executor-FD4FBWQA.mjs"), depth = (ctx.depth ?? 0) + 1;
2385
+ let gate = { ...ctx.gate ?? {}, authorized }, base = baseRegistry(ctx.toolRegistry), toolRegistry = gate.authorized ? authorizedRegistry(base) : base, { parse } = await import("./parser-7GARNT5L.mjs"), { executeNode, MAX_SHELL_DEPTH } = await import("./pipeline-executor-DRYEEFDR.mjs"), depth = (ctx.depth ?? 0) + 1;
2385
2386
  if (depth > MAX_SHELL_DEPTH)
2386
2387
  return err(`./${path}: script nesting too deep (${MAX_SHELL_DEPTH}) \u2014 possible infinite recursion`);
2387
2388
  try {
@@ -4410,6 +4411,7 @@ CREATE INDEX IF NOT EXISTS idx_adf_logs_origin ON adf_logs(origin);
4410
4411
  messaging: { ...base.messaging, ...options.messaging },
4411
4412
  audit: { ...base.audit, ...options.audit },
4412
4413
  pre_llm_hook: options.pre_llm_hook ?? base.pre_llm_hook,
4414
+ commands: options.commands ?? base.commands,
4413
4415
  code_execution: { ...base.code_execution, ...options.code_execution },
4414
4416
  compute: { ...base.compute },
4415
4417
  logging: { ...base.logging, ...options.logging },
@@ -5231,6 +5233,17 @@ CREATE INDEX IF NOT EXISTS idx_adf_logs_origin ON adf_logs(origin);
5231
5233
  deleteAllAttestations() {
5232
5234
  this.db.prepare("DELETE FROM adf_attestations").run();
5233
5235
  }
5236
+ /**
5237
+ * Re-sign rows in place: each row whose signature is `from` takes `to`
5238
+ * (same issuer, subject and role), keeping its id and place. A row changed
5239
+ * or removed meanwhile matches nothing and is left as it is. Returns the
5240
+ * rows updated.
5241
+ */
5242
+ resignAttestations(updates) {
5243
+ let stmt = this.db.prepare("UPDATE adf_attestations SET signature = ?, raw_json = ? WHERE signature = ?"), changed = 0;
5244
+ for (let { from, to } of updates) changed += stmt.run(to.signature, JSON.stringify(to), from).changes;
5245
+ return changed;
5246
+ }
5234
5247
  deleteAllIdentity() {
5235
5248
  this.db.prepare("DELETE FROM adf_identity").run();
5236
5249
  }
@@ -6390,12 +6403,12 @@ function buildLoopPreamble(loopName, agentHandle, grantedTools = []) {
6390
6403
 
6391
6404
  ${reachParagraph}
6392
6405
 
6393
- A timer, a trigger, or a message from another loop woke you. Do that work, write tersely, and end your turn.`;
6406
+ A timer, a trigger, a message from another loop, or the human writing to you directly woke you. Do that work, write tersely, and end your turn.`;
6394
6407
  }
6395
6408
  var LOOP_GOAL_SUMMARY_CHARS = 160;
6396
6409
  function summarizeGoal(goal) {
6397
- let flat = goal.replace(/\s+/g, " ").trim();
6398
- return flat.length <= LOOP_GOAL_SUMMARY_CHARS ? flat : `${flat.slice(0, LOOP_GOAL_SUMMARY_CHARS - 1).trimEnd()}\u2026`;
6410
+ let flat = (goal ?? "").replace(/\s+/g, " ").trim();
6411
+ return flat ? flat.length <= LOOP_GOAL_SUMMARY_CHARS ? flat : `${flat.slice(0, LOOP_GOAL_SUMMARY_CHARS - 1).trimEnd()}\u2026` : "(no goal)";
6399
6412
  }
6400
6413
  var LOOP_ARCHETYPES = `Use an inner loop when a piece of thinking should run on its own stream: tending memory on a timer, a sub-task that needs your full context, reviewing a draft before you act, thinking while nothing external is happening. Name each one for what it does for you. Guide: ${DOCS_GUIDES_URL}/inner-loops.md`;
6401
6414
  function buildMainLoopsSection(loops, options) {
@@ -6501,12 +6514,12 @@ function deriveLoopConfig(parent, loop) {
6501
6514
  throw new Error("deriveLoopConfig: 'main' is the host loop \u2014 use the raw agent config");
6502
6515
  let derived = cloneJson(parent);
6503
6516
  derived.tools = deriveTools(parent, loop);
6504
- let grantedNames = derived.tools.filter((t) => t.enabled).map((t) => t.name);
6505
- return derived.instructions = `${buildLoopPreamble(loop.name, parent.handle || parent.name, grantedNames)}
6517
+ let grantedNames = derived.tools.filter((t) => t.enabled).map((t) => t.name), preamble = buildLoopPreamble(loop.name, parent.handle || parent.name, grantedNames);
6518
+ return derived.instructions = hasLoopGoal(loop) ? `${preamble}
6506
6519
 
6507
6520
  Your goal:
6508
6521
 
6509
- ${loop.goal}`, derived.model = cloneJson(loop.model ?? parent.model), derived.autonomous = loop.autonomous === !0, loop.compact_threshold != null && (derived.context = { ...derived.context, compact_threshold: loop.compact_threshold }), derived.triggers = deriveTriggers(parent, loop.name), derived.code_execution = {
6522
+ ${loop.goal}` : preamble, derived.model = cloneJson(loop.model ?? parent.model), derived.autonomous = loop.autonomous === !0, loop.compact_threshold != null && (derived.context = { ...derived.context, compact_threshold: loop.compact_threshold }), derived.triggers = deriveTriggers(parent, loop.name), derived.code_execution = {
6510
6523
  ...deriveLoopCodeExecutionFlags(parent),
6511
6524
  // No inherited packages. A pure-JS package is loaded in the sandbox worker
6512
6525
  // through a worker-scope `createRequire` with an UNRESTRICTED `require` —
@@ -8945,7 +8958,7 @@ var CATEGORY_ORDER = [
8945
8958
  resolvedTools: [],
8946
8959
  async execute(ctx) {
8947
8960
  if (ctx.args.length > 0) {
8948
- let { getCommand: getCommand2 } = await import("./commands-E4EQUHE5.mjs"), handler = getCommand2(ctx.args[0]);
8961
+ let { getCommand: getCommand2 } = await import("./commands-KOMPXJZS.mjs"), handler = getCommand2(ctx.args[0]);
8949
8962
  return handler ? ok(handler.helpText) : ok(`Unknown command: ${ctx.args[0]}`);
8950
8963
  }
8951
8964
  let commands = getAllCommands(), grouped = /* @__PURE__ */ new Map();
@@ -8,14 +8,14 @@ import {
8
8
  leaseDir,
9
9
  listRuntimeHosts,
10
10
  listStudioClients
11
- } from "./chunk-JVPZIMXW.mjs";
11
+ } from "./chunk-D7A77SNL.mjs";
12
12
  import {
13
13
  DEFAULT_DAEMON_PORT,
14
14
  DEFAULT_DAEMON_URL,
15
15
  isLocalDaemonUrl,
16
16
  localDaemonToken,
17
17
  localProofHeaders
18
- } from "./chunk-V2T6NZX2.mjs";
18
+ } from "./chunk-AEAJDCVK.mjs";
19
19
  import {
20
20
  defaultUserDataPath
21
21
  } from "./chunk-PAK5JCO2.mjs";