@inneranimalmedia/agentsam-sdk 2.6.3 → 2.6.4

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 (233) hide show
  1. package/AGENTSAM.md +6 -0
  2. package/README.md +16 -1
  3. package/bin/agentsam +16 -1
  4. package/docs/BRAND_INTELLIGENCE.md +1 -1
  5. package/docs/architecture/AGENTSAM_DISTRIBUTION_OWNERSHIP.md +176 -0
  6. package/docs/architecture/AGENTSAM_GO_RUNTIME.md +282 -0
  7. package/docs/architecture/CODEBASEINDEX_GUIDED_PATH.md +202 -0
  8. package/docs/architecture/FS_E2E_CLOSURE_RECEIPT.md +59 -0
  9. package/docs/architecture/LOCAL_FS_AUTHORITY.md +38 -0
  10. package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +28 -0
  11. package/docs/architecture/PLAN_CLI_AND_LOCAL_STUDIO_DESKTOP.md +96 -0
  12. package/docs/architecture/SAM_ACTIVITY_RECOVERY_RECEIPT.md +39 -0
  13. package/docs/architecture/SAM_DECISION_WORK_RECEIPT.md +54 -0
  14. package/docs/architecture/SAM_KERNEL.md +181 -0
  15. package/docs/architecture/SAM_MACHINE_NORMALIZATION_PRECOMMIT_REPORT.md +208 -0
  16. package/docs/architecture/SLASH_SKILLS_PORTABLE.md +116 -0
  17. package/docs/architecture/fs-e2e-receipt.latest.json +42 -0
  18. package/docs/architecture/previews/codebaseindex-guided-path/CODEBASEINDEX_GUIDED_PATH.md +202 -0
  19. package/docs/architecture/previews/codebaseindex-guided-path/index.html +321 -0
  20. package/migrations/d1/0010_portable_tickets_memory.sql +140 -0
  21. package/migrations/d1/0011_agentsam_skill_v2.sql +185 -0
  22. package/migrations/d1/0011b_agentsam_skill_v2_cutover.sql +22 -0
  23. package/migrations/d1/0011c_agentsam_skill_v2_backfill.sql +76 -0
  24. package/migrations/d1/0011d_agentsam_skill_v2_retrieval_revisions.sql +50 -0
  25. package/migrations/d1/0012_agentsam_tools_required_seed.sql +67 -0
  26. package/migrations/d1/0013_identity_oauth_states.sql +15 -0
  27. package/migrations/d1/0014_auth_event_log.sql +20 -0
  28. package/migrations/d1/0015_identity_oauth_state_app_id.sql +3 -0
  29. package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +16 -0
  30. package/migrations/sqlite/agentsam_skill_retrieval.portable.sql +42 -0
  31. package/package.json +19 -4
  32. package/packages/agentsam-contracts/src/errors.ts +16 -0
  33. package/packages/agentsam-errors/src/envelope.js +53 -0
  34. package/packages/agentsam-errors/src/index.js +1 -0
  35. package/packages/agentsam-errors/src/recovery.js +301 -0
  36. package/packages/agentsam-knowledge/src/providers/index.js +18 -6
  37. package/packages/connectors/cloudflare/src/routes.js +9 -0
  38. package/packages/connectors/cloudflare/tests/connector.test.mjs +26 -1
  39. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
  40. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +11 -2
  41. package/packages/identity/docs/PORTABLE_IDENTITY_ARCHITECTURE.md +50 -0
  42. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +31 -0
  43. package/packages/identity/migrations/sqlite/001_identity_core.sql +99 -0
  44. package/packages/identity/migrations/sqlite/002_identity_oauth_client.sql +38 -0
  45. package/packages/identity/migrations/sqlite/003_identity_oauth_server.sql +64 -0
  46. package/packages/identity/package.json +2 -2
  47. package/packages/identity/src/adapters/cloudflare-d1/index.js +122 -22
  48. package/packages/identity/src/adapters/sqlite/index.js +319 -0
  49. package/packages/identity/src/app/verify-app.js +95 -0
  50. package/packages/identity/src/contracts/identity-store.js +115 -0
  51. package/packages/identity/src/contracts/route-ids.js +30 -0
  52. package/packages/identity/src/contracts/route-projection.js +218 -0
  53. package/packages/identity/src/contracts/routes.js +11 -0
  54. package/packages/identity/src/core/browser-paths.js +4 -5
  55. package/packages/identity/src/core/constants.js +13 -8
  56. package/packages/identity/src/core/session-policy.js +32 -0
  57. package/packages/identity/src/frontend/auth-portal/pages/login.html +10 -10
  58. package/packages/identity/src/frontend/auth-portal/pages/reset.html +3 -3
  59. package/packages/identity/src/frontend/auth-portal/pages/signup.html +3 -3
  60. package/packages/identity/src/frontend/auth-portal/preview/dashboard-stub.html +1 -1
  61. package/packages/identity/src/index.js +25 -0
  62. package/packages/identity/src/oauth/README.md +10 -4
  63. package/packages/identity/src/oauth/credentials.js +20 -13
  64. package/packages/identity/src/oauth/finalize-inbound.js +1 -1
  65. package/packages/identity/src/oauth/iam-platform.js +8 -7
  66. package/packages/identity/src/oauth/redirect-paths.js +27 -36
  67. package/packages/identity/src/server/identity-service.js +30 -13
  68. package/packages/identity/src/server/mount-policy.js +30 -0
  69. package/packages/identity/src/server/post-auth.js +79 -0
  70. package/packages/identity/src/server/worker-router.js +104 -72
  71. package/packages/identity/tests/finalize-inbound-oauth.test.mjs +6 -6
  72. package/packages/identity/tests/iam-provider.test.mjs +1 -1
  73. package/packages/identity/tests/identity-service.test.mjs +36 -5
  74. package/packages/identity/tests/oauth-credentials.test.mjs +3 -1
  75. package/packages/identity/tests/portable-identity-architecture.test.mjs +157 -0
  76. package/packages/identity/tests/session-routes-policy.test.mjs +21 -0
  77. package/packages/theme-church-site/package.json +2 -1
  78. package/packages/theme-church-site/src/index.js +1 -0
  79. package/packages/theme-companions-site/package.json +2 -1
  80. package/packages/theme-companions-site/src/index.js +1 -0
  81. package/packages/theme-floors-site/package.json +2 -1
  82. package/packages/theme-floors-site/src/index.js +1 -0
  83. package/packages/theme-fuelnfree-site/package.json +2 -1
  84. package/packages/theme-fuelnfree-site/src/index.js +1 -0
  85. package/packages/theme-handyman-site/package.json +2 -1
  86. package/packages/theme-handyman-site/src/index.js +1 -0
  87. package/packages/theme-insurance-site/package.json +2 -1
  88. package/packages/theme-insurance-site/src/index.js +1 -0
  89. package/packages/theme-shinshu-site/package.json +2 -1
  90. package/packages/theme-shinshu-site/src/index.js +1 -0
  91. package/protocol/apps/agentsam.app.v1.schema.json +51 -0
  92. package/protocol/brand/brandpack.v1.schema.json +43 -0
  93. package/protocol/credentials/issue.v1.schema.json +38 -0
  94. package/protocol/database/connection.v1.schema.json +41 -0
  95. package/protocol/embeddings/embedding-profile.v1.schema.json +20 -0
  96. package/protocol/errors/error-envelope.schema.json +135 -1
  97. package/protocol/errors/recovery.v1.schema.json +50 -0
  98. package/protocol/runtime/workspace-fs.v1.schema.json +71 -0
  99. package/protocol/sam/activity.v1.schema.json +48 -0
  100. package/protocol/sam/answer.v1.schema.json +35 -0
  101. package/protocol/sam/calibration.v1.schema.json +21 -0
  102. package/protocol/sam/decision-receipt.v1.schema.json +29 -0
  103. package/protocol/sam/evaluation.v1.schema.json +19 -0
  104. package/protocol/sam/operation.schema.json +66 -0
  105. package/protocol/sam/outcome.v1.schema.json +36 -0
  106. package/protocol/sam/question.v1.schema.json +26 -0
  107. package/protocol/sam/registry.seed.json +153 -0
  108. package/protocol/sam/result.schema.json +53 -0
  109. package/protocol/sam/state.v1.schema.json +23 -0
  110. package/protocol/skills/agentsam.interaction.v1.schema.json +50 -0
  111. package/protocol/skills/agentsam.skill.v1.schema.json +57 -0
  112. package/protocol/ui/icon-registry.mjs +226 -0
  113. package/protocol/ui/icon.v1.schema.json +51 -0
  114. package/skills/README.md +22 -9
  115. package/skills/agentsam-codebaseindex/SKILL.md +225 -0
  116. package/skills/catalog.json +14 -0
  117. package/src/cli/command-catalog.js +130 -0
  118. package/src/cli/dispatch.js +48 -0
  119. package/src/cli.js +43 -1
  120. package/src/commands/api-key.js +244 -0
  121. package/src/commands/app.js +60 -28
  122. package/src/commands/brand.js +17 -19
  123. package/src/commands/codebaseindex.js +688 -0
  124. package/src/commands/env.js +152 -25
  125. package/src/commands/go.js +366 -53
  126. package/src/commands/interaction-clack.js +115 -0
  127. package/src/commands/models.js +1 -1
  128. package/src/commands/providers.js +62 -14
  129. package/src/commands/shell.js +43 -2
  130. package/src/commands/skill.js +248 -0
  131. package/src/commands/skills.js +1 -1
  132. package/src/commands/start-local.js +4 -0
  133. package/src/commands/whoami.js +90 -18
  134. package/src/go/build.js +229 -39
  135. package/src/go/cloudflare.js +506 -105
  136. package/src/go/container.js +120 -0
  137. package/src/go/contract.js +9 -4
  138. package/src/go/discover.js +149 -33
  139. package/src/go/index.js +15 -3
  140. package/src/go/native-probe-runner.mjs +119 -0
  141. package/src/go/{registry.js → official-registry.js} +64 -7
  142. package/src/go/official-release.js +10 -0
  143. package/src/go/receipts.js +77 -10
  144. package/src/go/verify.js +9 -2
  145. package/src/index.js +27 -0
  146. package/src/indexing/ingest/discover-models.js +298 -0
  147. package/src/indexing/ingest/inventory.js +243 -0
  148. package/src/indexing/ingest/job-graph.js +181 -0
  149. package/src/indexing/ingest/materials.js +210 -0
  150. package/src/lib/provider-credentials.js +63 -21
  151. package/src/lib/slash-commands.js +1 -0
  152. package/src/local-fs/capability.js +121 -0
  153. package/src/local-fs/freshness.js +75 -0
  154. package/src/local-fs/index.js +385 -0
  155. package/src/local-fs/paths.js +100 -0
  156. package/src/local-pty/server.js +295 -19
  157. package/src/mcp/client.js +2 -2
  158. package/src/models/ai-access-onboarding.js +112 -0
  159. package/src/models/discovery.js +10 -2
  160. package/src/models/inventory-core.js +9 -1
  161. package/src/sam/activity/index.js +183 -0
  162. package/src/sam/client.js +252 -0
  163. package/src/sam/decision/calibration.js +109 -0
  164. package/src/sam/decision/confidence.js +126 -0
  165. package/src/sam/decision/evaluate.js +157 -0
  166. package/src/sam/decision/evaluators/deterministic.js +341 -0
  167. package/src/sam/decision/evaluators/heuristic.js +61 -0
  168. package/src/sam/decision/evaluators/select.js +50 -0
  169. package/src/sam/decision/evaluators/semantic.js +149 -0
  170. package/src/sam/decision/hierarchical.js +61 -0
  171. package/src/sam/decision/index.js +53 -0
  172. package/src/sam/decision/policy.js +86 -0
  173. package/src/sam/decision/questions.js +120 -0
  174. package/src/sam/decision/receipt.js +148 -0
  175. package/src/sam/decision/state.js +117 -0
  176. package/src/sam/decision/types.js +22 -0
  177. package/src/sam/decision/validate.js +200 -0
  178. package/src/sam/define.js +51 -0
  179. package/src/sam/index.js +65 -0
  180. package/src/sam/operations/brand-scan.js +62 -0
  181. package/src/sam/operations/cad-blender-inspect.js +36 -0
  182. package/src/sam/operations/codebaseindex-ingest.js +49 -0
  183. package/src/sam/operations/decision-evaluate.js +59 -0
  184. package/src/sam/operations/planning-astar.js +77 -0
  185. package/src/sam/operations/planning-goap.js +60 -0
  186. package/src/sam/operations/repository-inspect.js +72 -0
  187. package/src/sam/operations/security-scan.js +33 -0
  188. package/src/sam/operations/terminal-exec.js +29 -0
  189. package/src/sam/planning/astar.js +311 -0
  190. package/src/sam/planning/goap.js +177 -0
  191. package/src/sam/planning/index.js +21 -0
  192. package/src/sam/planning/state.js +84 -0
  193. package/src/sam/registry.js +48 -0
  194. package/src/sam/result.js +77 -0
  195. package/src/sam/seed.js +44 -0
  196. package/src/sam/types.js +91 -0
  197. package/src/skills/catalog.js +64 -0
  198. package/src/skills/content-resolver.js +124 -0
  199. package/src/skills/hosted-store.js +37 -0
  200. package/src/skills/index.js +29 -64
  201. package/src/skills/interaction.js +102 -0
  202. package/src/skills/local-store.js +228 -0
  203. package/src/skills/manifest.js +104 -0
  204. package/src/skills/metrics.js +31 -0
  205. package/src/skills/registry.js +184 -0
  206. package/src/skills/runtime.js +287 -0
  207. package/src/skills/slash.js +44 -0
  208. package/src/ui/cli/help.js +94 -101
  209. package/test/cli/api-key-env-whoami.test.mjs +129 -0
  210. package/test/cli/codebaseindex-plan-ux.test.mjs +37 -0
  211. package/test/cli/go.test.mjs +62 -5
  212. package/test/cli/skill-npm-and-env.test.mjs +52 -0
  213. package/test/cli/wireframes-go-registry.test.mjs +87 -2
  214. package/test/go/build-source-identity.test.mjs +31 -0
  215. package/test/go/cloudflare-probe.test.mjs +274 -10
  216. package/test/go/distribution.test.mjs +28 -0
  217. package/test/integration/ai-access-onboarding.test.mjs +47 -0
  218. package/test/integration/cli-help.test.mjs +1 -1
  219. package/test/integration/cms-site-tenancy-contract.test.mjs +6 -6
  220. package/test/integration/codebaseindex-ingest.test.mjs +166 -0
  221. package/test/integration/icon-registry.test.mjs +67 -0
  222. package/test/integration/ingest-discover-models.test.mjs +30 -0
  223. package/test/integration/install-script.test.mjs +12 -9
  224. package/test/integration/local-fs.test.mjs +113 -0
  225. package/test/integration/provider-env-cli.test.mjs +2 -1
  226. package/test/integration/sam-activity-recovery.test.mjs +147 -0
  227. package/test/integration/sam-decision.test.mjs +584 -0
  228. package/test/integration/sam-kernel.test.mjs +99 -0
  229. package/test/integration/sam-planning-astar.test.mjs +279 -0
  230. package/test/integration/skill-runtime.test.mjs +240 -0
  231. package/test/integration/studio-fs-pty-e2e.test.mjs +294 -0
  232. package/test/models.test.mjs +14 -7
  233. package/test/shell.test.mjs +4 -4
@@ -1,9 +1,43 @@
1
1
  import { spawnSync } from 'node:child_process';
2
- import { describeProviderCredential, ensureProviderEnvProfile, providerCredentialSpec } from '../lib/provider-credentials.js';
2
+ import {
3
+ describeProviderCredential,
4
+ ensureProviderEnvProfile,
5
+ exportProviderEnvProfile,
6
+ providerCredentialSpec,
7
+ listProviderCredentialStatus,
8
+ ensureAgentEnvLoader,
9
+ agentEnvLoaderPath,
10
+ renderEnvShellExports,
11
+ } from '../lib/provider-credentials.js';
3
12
 
4
- const PROVIDERS = Object.freeze(['openai', 'anthropic', 'gemini', 'grok', 'cloudflare']);
13
+ const PROVIDERS = Object.freeze([
14
+ 'openai',
15
+ 'anthropic',
16
+ 'gemini',
17
+ 'grok',
18
+ 'xai',
19
+ 'cursor',
20
+ 'cloudflare',
21
+ 'inneranimalmedia',
22
+ ]);
5
23
 
6
- function writeLine(write, value = '') { write(`${value}\n`); }
24
+ const PROVIDER_ALIASES = Object.freeze({
25
+ grok: 'xai',
26
+ iam: 'inneranimalmedia',
27
+ agentsam: 'inneranimalmedia',
28
+ 'agentsam-api': 'inneranimalmedia',
29
+ });
30
+
31
+ function writeLine(write, value = '') {
32
+ write(`${value}\n`);
33
+ }
34
+
35
+ function normalizeEnvProvider(raw) {
36
+ const id = String(raw || '')
37
+ .trim()
38
+ .toLowerCase();
39
+ return PROVIDER_ALIASES[id] || id;
40
+ }
7
41
 
8
42
  export function detectCloudflareAccounts(options = {}) {
9
43
  const env = options.env || process.env;
@@ -11,14 +45,28 @@ export function detectCloudflareAccounts(options = {}) {
11
45
  if (explicit) return { accounts: [{ id: explicit, name: null }], source: 'environment' };
12
46
  const spawn = options.spawnSyncImpl || spawnSync;
13
47
  const npxBin = process.platform === 'win32' ? 'npx.cmd' : 'npx';
14
- const result = spawn(npxBin, ['--no-install', 'wrangler', 'whoami', '--json'], { cwd: options.cwd || process.cwd(), env, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'], shell: process.platform === 'win32' });
15
- if (result?.status !== 0) return { accounts: [], source: 'wrangler', error: String(result?.stderr || '').trim() || `wrangler exited ${result?.status ?? 'unknown'}` };
48
+ const result = spawn(npxBin, ['--no-install', 'wrangler', 'whoami', '--json'], {
49
+ cwd: options.cwd || process.cwd(),
50
+ env,
51
+ encoding: 'utf8',
52
+ stdio: ['ignore', 'pipe', 'pipe'],
53
+ shell: process.platform === 'win32',
54
+ });
55
+ if (result?.status !== 0) {
56
+ return {
57
+ accounts: [],
58
+ source: 'wrangler',
59
+ error: String(result?.stderr || '').trim() || `wrangler exited ${result?.status ?? 'unknown'}`,
60
+ };
61
+ }
16
62
  try {
17
63
  const parsed = JSON.parse(String(result.stdout || '{}'));
18
- const accounts = (Array.isArray(parsed?.accounts) ? parsed.accounts : []).map((row) => ({
19
- id: String(row?.id || row?.account_id || '').trim(),
20
- name: String(row?.name || row?.account_name || '').trim() || null,
21
- })).filter((row) => row.id);
64
+ const accounts = (Array.isArray(parsed?.accounts) ? parsed.accounts : [])
65
+ .map((row) => ({
66
+ id: String(row?.id || row?.account_id || '').trim(),
67
+ name: String(row?.name || row?.account_name || '').trim() || null,
68
+ }))
69
+ .filter((row) => row.id);
22
70
  return { accounts, source: 'wrangler', error: null };
23
71
  } catch (error) {
24
72
  return { accounts: [], source: 'wrangler', error: `invalid wrangler JSON: ${error?.message || error}` };
@@ -35,25 +83,90 @@ function cloudflareGuidance(write) {
35
83
  writeLine(write, ' D1 / R2 / KV add direct product permissions only when AgentSam must read/write those resources directly');
36
84
  }
37
85
 
86
+ function agentsamApiGuidance(write) {
87
+ writeLine(write, '');
88
+ writeLine(write, ' AGENTSAM_API_KEY (aak_*)');
89
+ writeLine(write, ' Preferred:');
90
+ writeLine(write, ' agentsam api-key create --name "$(hostname)" --store keychain --activate');
91
+ writeLine(write, ' Then:');
92
+ writeLine(write, ' source ~/.agentsam/load-agent-env.sh');
93
+ writeLine(write, ' agentsam whoami');
94
+ }
95
+
96
+ function cursorGuidance(write) {
97
+ writeLine(write, '');
98
+ writeLine(write, ' CURSOR_API_KEY roll');
99
+ writeLine(write, ' 1. Create a new key in Cursor dashboard');
100
+ writeLine(write, ' 2. printf \'%s\' "$NEW" | agentsam providers add cursor --from-stdin');
101
+ writeLine(write, ' 3. source ~/.agentsam/load-agent-env.sh');
102
+ writeLine(write, ' 4. If Local Studio Worker uses the secret: wrangler secret put CURSOR_API_KEY');
103
+ writeLine(write, ' Optional: agentsam providers remove cursor --yes (before add, to force replace)');
104
+ }
105
+
38
106
  export async function runEnv(argv = [], options = {}) {
39
107
  const write = options.write || ((text) => process.stdout.write(text));
40
- const [command = 'status', providerArg] = argv;
108
+ const [command = 'status', ...args] = argv;
41
109
  let accountId = '';
42
- for (let i = 2; i < argv.length; i += 1) {
43
- if (argv[i] === '--account-id') accountId = String(argv[++i] || '').trim();
44
- else throw new Error(`unexpected env argument: ${argv[i]}`);
110
+ let profile = 'default';
111
+ const positionals = [];
112
+ for (let i = 0; i < args.length; i += 1) {
113
+ if (args[i] === '--account-id') accountId = String(args[++i] || '').trim();
114
+ else if (args[i] === '--profile') profile = String(args[++i] || 'default').trim() || 'default';
115
+ else if (String(args[i] || '').startsWith('-')) throw new Error(`unexpected env argument: ${args[i]}`);
116
+ else positionals.push(args[i]);
45
117
  }
118
+ const providerArg = positionals[0];
119
+
46
120
  if (command === '--help' || command === '-h' || command === 'help') {
47
- writeLine(write, 'agentsam env init <openai|anthropic|gemini|grok|cloudflare> [--account-id <id>]');
121
+ writeLine(write, 'agentsam env shell [--profile default] print export lines for eval (keychain/vault)');
122
+ writeLine(write, 'agentsam env init <openai|anthropic|gemini|grok|cursor|cloudflare|inneranimalmedia> [--account-id <id>]');
48
123
  writeLine(write, 'agentsam env status [provider]');
124
+ writeLine(write, 'agentsam env export <provider> write ~/.agentsam/env.d from vault (compat fallback)');
125
+ writeLine(write, 'agentsam env boot-line print: source ~/.agentsam/load-agent-env.sh');
49
126
  return;
50
127
  }
128
+
129
+ if (command === 'shell') {
130
+ ensureAgentEnvLoader(options);
131
+ const result = renderEnvShellExports({
132
+ ...options,
133
+ profile,
134
+ providers: positionals.map(normalizeEnvProvider).filter(Boolean),
135
+ });
136
+ write(result.script);
137
+ return result;
138
+ }
139
+
140
+ if (command === 'boot-line') {
141
+ ensureAgentEnvLoader(options);
142
+ writeLine(write, 'source ~/.agentsam/load-agent-env.sh');
143
+ writeLine(write, `# loader: ${agentEnvLoaderPath(options)}`);
144
+ writeLine(write, '# prefers: eval "$(agentsam env shell --profile default)"');
145
+ return { command: 'source ~/.agentsam/load-agent-env.sh' };
146
+ }
147
+
148
+ if (command === 'export') {
149
+ const provider = normalizeEnvProvider(providerArg);
150
+ if (!providerCredentialSpec(provider)) throw new Error(`unsupported_provider:${provider}`);
151
+ const result = exportProviderEnvProfile(provider, options);
152
+ writeLine(write, '');
153
+ writeLine(write, ` Exported ${provider}: ${result.file}`);
154
+ writeLine(write, ' source ~/.agentsam/load-agent-env.sh');
155
+ writeLine(write, ' (compat: plaintext env.d is opt-in; prefer keychain + env shell)');
156
+ writeLine(write, '');
157
+ return result;
158
+ }
159
+
51
160
  if (command === 'init') {
52
- const provider = String(providerArg || '').trim().toLowerCase();
53
- if (!PROVIDERS.includes(provider)) throw new Error(`env init requires one of: ${PROVIDERS.join(', ')}`);
161
+ const provider = normalizeEnvProvider(providerArg);
162
+ if (!PROVIDERS.includes(provider) && provider !== 'xai') {
163
+ throw new Error(`env init requires one of: ${PROVIDERS.join(', ')}`);
164
+ }
54
165
  let cloudflareAccounts = null;
55
166
  if (provider === 'cloudflare') {
56
- if (accountId && !/^[a-f0-9]{32}$/i.test(accountId)) throw new Error('Cloudflare --account-id must be a 32-character hexadecimal account ID');
167
+ if (accountId && !/^[a-f0-9]{32}$/i.test(accountId)) {
168
+ throw new Error('Cloudflare --account-id must be a 32-character hexadecimal account ID');
169
+ }
57
170
  cloudflareAccounts = detectCloudflareAccounts({ ...options, accountId });
58
171
  if (!accountId && cloudflareAccounts.accounts.length === 1) accountId = cloudflareAccounts.accounts[0].id;
59
172
  }
@@ -63,29 +176,43 @@ export async function runEnv(argv = [], options = {}) {
63
176
  writeLine(write, ` profile ${result.file}${result.created ? ' · created' : ' · existing'}`);
64
177
  writeLine(write, ` loader ${result.loader}`);
65
178
  writeLine(write, '');
66
- writeLine(write, ' Add the credential to the profile, then load it into this shell:');
67
- writeLine(write, ` ${result.source_command}`);
179
+ writeLine(write, ' Prefer vault/keychain storage, then:');
180
+ writeLine(write, ' source ~/.agentsam/load-agent-env.sh');
68
181
  if (provider === 'cloudflare') {
69
182
  if (accountId) writeLine(write, ` account detected/configured (${cloudflareAccounts?.source || 'explicit'})`);
70
- else if ((cloudflareAccounts?.accounts || []).length > 1) writeLine(write, ` account ${cloudflareAccounts.accounts.length} Wrangler accounts found · rerun with --account-id <id>`);
71
- else writeLine(write, ' account not detected · set CLOUDFLARE_ACCOUNT_ID in the profile or rerun with --account-id <id>');
183
+ else if ((cloudflareAccounts?.accounts || []).length > 1) {
184
+ writeLine(write, ` account ${cloudflareAccounts.accounts.length} Wrangler accounts found · rerun with --account-id <id>`);
185
+ } else {
186
+ writeLine(write, ' account not detected · set CLOUDFLARE_ACCOUNT_ID in the profile or rerun with --account-id <id>');
187
+ }
72
188
  cloudflareGuidance(write);
73
189
  }
190
+ if (provider === 'inneranimalmedia') agentsamApiGuidance(write);
191
+ if (provider === 'cursor') cursorGuidance(write);
74
192
  writeLine(write, '');
75
193
  return result;
76
194
  }
195
+
77
196
  if (command === 'status') {
78
- const providers = providerArg ? [String(providerArg).trim().toLowerCase()] : PROVIDERS;
79
- for (const provider of providers) if (!providerCredentialSpec(provider)) throw new Error(`unsupported_provider:${provider}`);
197
+ const providers = providerArg
198
+ ? [normalizeEnvProvider(providerArg)]
199
+ : PROVIDERS.filter((p) => p !== 'grok');
200
+ for (const provider of providers) {
201
+ if (!providerCredentialSpec(provider)) throw new Error(`unsupported_provider:${provider}`);
202
+ }
80
203
  writeLine(write, '');
81
204
  writeLine(write, ' AgentSam · provider environments');
82
205
  for (const provider of providers) {
83
206
  const row = describeProviderCredential(provider, options);
84
207
  const extra = row.account_id ? ` · account ${row.account_id}` : '';
85
- writeLine(write, ` ${provider.padEnd(12)} ${row.configured ? 'configured' : row.error ? `blocked (${row.error})` : 'not configured'}${extra}`);
208
+ const state = row.configured ? `available · ${row.source || 'runtime'}${extra}` : row.error || 'not configured';
209
+ writeLine(write, ` ${String(row.label || provider).padEnd(22)} ${state}`);
86
210
  }
87
211
  writeLine(write, '');
88
- return;
212
+ writeLine(write, ' Load: source ~/.agentsam/load-agent-env.sh');
213
+ writeLine(write, '');
214
+ return { providers: listProviderCredentialStatus(options) };
89
215
  }
216
+
90
217
  throw new Error(`unknown env command: ${command}`);
91
218
  }