@aui.io/apollo 0.1.21 → 0.1.25

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 (110) hide show
  1. package/README.md +183 -0
  2. package/node_modules/@aui.io/apollo-cli/dist/src/commands/bundles.js +34 -9
  3. package/node_modules/@aui.io/apollo-cli/dist/src/commands/bundles.js.map +1 -1
  4. package/node_modules/@aui.io/apollo-cli/dist/src/commands/curl.d.ts +10 -0
  5. package/node_modules/@aui.io/apollo-cli/dist/src/commands/curl.js +63 -0
  6. package/node_modules/@aui.io/apollo-cli/dist/src/commands/curl.js.map +1 -0
  7. package/node_modules/@aui.io/apollo-cli/dist/src/commands/doctor.d.ts +13 -0
  8. package/node_modules/@aui.io/apollo-cli/dist/src/commands/doctor.js +89 -0
  9. package/node_modules/@aui.io/apollo-cli/dist/src/commands/doctor.js.map +1 -0
  10. package/node_modules/@aui.io/apollo-cli/dist/src/commands/hierarchy.js +24 -7
  11. package/node_modules/@aui.io/apollo-cli/dist/src/commands/hierarchy.js.map +1 -1
  12. package/node_modules/@aui.io/apollo-cli/dist/src/commands/runtime-version.d.ts +10 -0
  13. package/node_modules/@aui.io/apollo-cli/dist/src/commands/runtime-version.js +116 -0
  14. package/node_modules/@aui.io/apollo-cli/dist/src/commands/runtime-version.js.map +1 -0
  15. package/node_modules/@aui.io/apollo-cli/dist/src/commands/scenarios.js +3 -3
  16. package/node_modules/@aui.io/apollo-cli/dist/src/commands/scenarios.js.map +1 -1
  17. package/node_modules/@aui.io/apollo-cli/dist/src/commands/status.js +1 -0
  18. package/node_modules/@aui.io/apollo-cli/dist/src/commands/status.js.map +1 -1
  19. package/node_modules/@aui.io/apollo-cli/dist/src/index.d.ts +1 -0
  20. package/node_modules/@aui.io/apollo-cli/dist/src/index.js +26 -1
  21. package/node_modules/@aui.io/apollo-cli/dist/src/index.js.map +1 -1
  22. package/node_modules/@aui.io/apollo-cli/package.json +3 -3
  23. package/node_modules/@aui.io/apollo-core/dist/src/api/agent-settings.d.ts +166 -26
  24. package/node_modules/@aui.io/apollo-core/dist/src/api/agent-settings.js +106 -20
  25. package/node_modules/@aui.io/apollo-core/dist/src/api/agent-settings.js.map +1 -1
  26. package/node_modules/@aui.io/apollo-core/dist/src/api/capture.d.ts +22 -0
  27. package/node_modules/@aui.io/apollo-core/dist/src/api/capture.js +75 -0
  28. package/node_modules/@aui.io/apollo-core/dist/src/api/capture.js.map +1 -0
  29. package/node_modules/@aui.io/apollo-core/dist/src/api/management.d.ts +0 -1
  30. package/node_modules/@aui.io/apollo-core/dist/src/api/management.js +0 -6
  31. package/node_modules/@aui.io/apollo-core/dist/src/api/management.js.map +1 -1
  32. package/node_modules/@aui.io/apollo-core/dist/src/api/network.d.ts +19 -0
  33. package/node_modules/@aui.io/apollo-core/dist/src/api/network.js +53 -0
  34. package/node_modules/@aui.io/apollo-core/dist/src/api/network.js.map +1 -0
  35. package/node_modules/@aui.io/apollo-core/dist/src/api/transport.d.ts +14 -2
  36. package/node_modules/@aui.io/apollo-core/dist/src/api/transport.js +15 -28
  37. package/node_modules/@aui.io/apollo-core/dist/src/api/transport.js.map +1 -1
  38. package/node_modules/@aui.io/apollo-core/dist/src/config/index.d.ts +1 -1
  39. package/node_modules/@aui.io/apollo-core/dist/src/config/index.js +16 -1
  40. package/node_modules/@aui.io/apollo-core/dist/src/config/index.js.map +1 -1
  41. package/node_modules/@aui.io/apollo-core/dist/src/config/store.d.ts +10 -0
  42. package/node_modules/@aui.io/apollo-core/dist/src/config/store.js +24 -0
  43. package/node_modules/@aui.io/apollo-core/dist/src/config/store.js.map +1 -1
  44. package/node_modules/@aui.io/apollo-core/dist/src/config/types.d.ts +18 -1
  45. package/node_modules/@aui.io/apollo-core/dist/src/index.d.ts +10 -5
  46. package/node_modules/@aui.io/apollo-core/dist/src/index.js +9 -4
  47. package/node_modules/@aui.io/apollo-core/dist/src/index.js.map +1 -1
  48. package/node_modules/@aui.io/apollo-core/dist/src/runtime-version/index.d.ts +72 -0
  49. package/node_modules/@aui.io/apollo-core/dist/src/runtime-version/index.js +114 -0
  50. package/node_modules/@aui.io/apollo-core/dist/src/runtime-version/index.js.map +1 -0
  51. package/node_modules/@aui.io/apollo-core/dist/src/services/bundles.d.ts +47 -1
  52. package/node_modules/@aui.io/apollo-core/dist/src/services/bundles.js +60 -6
  53. package/node_modules/@aui.io/apollo-core/dist/src/services/bundles.js.map +1 -1
  54. package/node_modules/@aui.io/apollo-core/dist/src/services/clients.d.ts +4 -1
  55. package/node_modules/@aui.io/apollo-core/dist/src/services/clients.js +19 -0
  56. package/node_modules/@aui.io/apollo-core/dist/src/services/clients.js.map +1 -1
  57. package/node_modules/@aui.io/apollo-core/dist/src/services/doctor.d.ts +39 -0
  58. package/node_modules/@aui.io/apollo-core/dist/src/services/doctor.js +586 -0
  59. package/node_modules/@aui.io/apollo-core/dist/src/services/doctor.js.map +1 -0
  60. package/node_modules/@aui.io/apollo-core/dist/src/services/hierarchy.d.ts +78 -2
  61. package/node_modules/@aui.io/apollo-core/dist/src/services/hierarchy.js +177 -17
  62. package/node_modules/@aui.io/apollo-core/dist/src/services/hierarchy.js.map +1 -1
  63. package/node_modules/@aui.io/apollo-core/dist/src/services/requests.d.ts +22 -0
  64. package/node_modules/@aui.io/apollo-core/dist/src/services/requests.js +73 -0
  65. package/node_modules/@aui.io/apollo-core/dist/src/services/requests.js.map +1 -0
  66. package/node_modules/@aui.io/apollo-core/dist/src/services/scenarios.d.ts +15 -8
  67. package/node_modules/@aui.io/apollo-core/dist/src/services/scenarios.js +80 -58
  68. package/node_modules/@aui.io/apollo-core/dist/src/services/scenarios.js.map +1 -1
  69. package/node_modules/@aui.io/apollo-core/dist/src/services/status.service.d.ts +2 -0
  70. package/node_modules/@aui.io/apollo-core/dist/src/services/status.service.js +10 -2
  71. package/node_modules/@aui.io/apollo-core/dist/src/services/status.service.js.map +1 -1
  72. package/node_modules/@aui.io/apollo-core/package.json +1 -1
  73. package/node_modules/@aui.io/apollo-tui/dist/src/actions/registry.js +16 -2
  74. package/node_modules/@aui.io/apollo-tui/dist/src/actions/registry.js.map +1 -1
  75. package/node_modules/@aui.io/apollo-tui/dist/src/activity/ActivityDrawer.js +31 -16
  76. package/node_modules/@aui.io/apollo-tui/dist/src/activity/ActivityDrawer.js.map +1 -1
  77. package/node_modules/@aui.io/apollo-tui/dist/src/activity/requests.d.ts +19 -0
  78. package/node_modules/@aui.io/apollo-tui/dist/src/activity/requests.js +29 -0
  79. package/node_modules/@aui.io/apollo-tui/dist/src/activity/requests.js.map +1 -0
  80. package/node_modules/@aui.io/apollo-tui/dist/src/author/AuthorHome.d.ts +3 -1
  81. package/node_modules/@aui.io/apollo-tui/dist/src/author/AuthorHome.js +6 -18
  82. package/node_modules/@aui.io/apollo-tui/dist/src/author/AuthorHome.js.map +1 -1
  83. package/node_modules/@aui.io/apollo-tui/dist/src/author/ResourcesView.js +26 -4
  84. package/node_modules/@aui.io/apollo-tui/dist/src/author/ResourcesView.js.map +1 -1
  85. package/node_modules/@aui.io/apollo-tui/dist/src/context/ContextSwitcher.js +6 -2
  86. package/node_modules/@aui.io/apollo-tui/dist/src/context/ContextSwitcher.js.map +1 -1
  87. package/node_modules/@aui.io/apollo-tui/dist/src/lib/actions.js +95 -16
  88. package/node_modules/@aui.io/apollo-tui/dist/src/lib/actions.js.map +1 -1
  89. package/node_modules/@aui.io/apollo-tui/dist/src/lib/commands.d.ts +1 -1
  90. package/node_modules/@aui.io/apollo-tui/dist/src/lib/commands.js +20 -0
  91. package/node_modules/@aui.io/apollo-tui/dist/src/lib/commands.js.map +1 -1
  92. package/node_modules/@aui.io/apollo-tui/dist/src/lib/diagnostics.d.ts +8 -0
  93. package/node_modules/@aui.io/apollo-tui/dist/src/lib/diagnostics.js +109 -0
  94. package/node_modules/@aui.io/apollo-tui/dist/src/lib/diagnostics.js.map +1 -0
  95. package/node_modules/@aui.io/apollo-tui/dist/src/lib/scope.d.ts +2 -0
  96. package/node_modules/@aui.io/apollo-tui/dist/src/lib/scope.js +1 -0
  97. package/node_modules/@aui.io/apollo-tui/dist/src/lib/scope.js.map +1 -1
  98. package/node_modules/@aui.io/apollo-tui/dist/src/opentui-app.js +2 -2
  99. package/node_modules/@aui.io/apollo-tui/dist/src/opentui-app.js.map +1 -1
  100. package/node_modules/@aui.io/apollo-tui/dist/src/shell/Breadcrumb.d.ts +4 -2
  101. package/node_modules/@aui.io/apollo-tui/dist/src/shell/Breadcrumb.js +5 -3
  102. package/node_modules/@aui.io/apollo-tui/dist/src/shell/Breadcrumb.js.map +1 -1
  103. package/node_modules/@aui.io/apollo-tui/dist/src/ui/SplashCard.d.ts +5 -0
  104. package/node_modules/@aui.io/apollo-tui/dist/src/ui/SplashCard.js +56 -0
  105. package/node_modules/@aui.io/apollo-tui/dist/src/ui/SplashCard.js.map +1 -0
  106. package/node_modules/@aui.io/apollo-tui/dist/src/ui/wordmark.d.ts +73 -0
  107. package/node_modules/@aui.io/apollo-tui/dist/src/ui/wordmark.js +488 -0
  108. package/node_modules/@aui.io/apollo-tui/dist/src/ui/wordmark.js.map +1 -0
  109. package/node_modules/@aui.io/apollo-tui/package.json +2 -2
  110. package/package.json +4 -4
@@ -1,5 +1,7 @@
1
+ import type { AgentSettingsClient } from "../api/agent-settings.js";
1
2
  import type { IdentityClient, Organization } from "../api/identity.js";
2
3
  import { type Agent, type AgentVersion, type ManagementClient, type Project } from "../api/management.js";
4
+ import type { NetworkClient } from "../api/network.js";
3
5
  import { type Context, type ProjectBinding } from "../config/index.js";
4
6
  export declare function listOrganizations(identity: IdentityClient): Promise<Organization[]>;
5
7
  export declare function useOrganization(context: Context, identity: IdentityClient, organizationId: string): Promise<{
@@ -20,8 +22,46 @@ export declare function createProject(context: Context, management: ManagementCl
20
22
  export declare function listAgents(context: Context, management: ManagementClient, name?: string): Promise<{
21
23
  results: Agent[];
22
24
  }>;
23
- export declare function createAgent(context: Context, management: ManagementClient, name: string): Promise<Agent>;
24
- export declare function bindAgent(context: Context, agent: Agent, cwd: string, versionTag?: string): Promise<ProjectBinding>;
25
+ /**
26
+ * The template a new agent is cloned from — "General Runtime-v2", a published,
27
+ * blob-mode `template`-kind agent in agent-settings. Apollo's own create
28
+ * endpoint picks a template by category, i.e. whatever the environment's
29
+ * default `GENERAL` category holds, so the console names the runtime-v2 one
30
+ * outright instead. Override per create with `agent create --template <id>`.
31
+ */
32
+ export declare const TEMPLATE_AGENT_ID = "6a63896e1bd618f292ba6684";
33
+ /** The two services `createAgent` drives, in the order it touches them. */
34
+ export interface AgentCreateClients {
35
+ agentSettings: AgentSettingsClient;
36
+ network: NetworkClient;
37
+ }
38
+ /**
39
+ * Create an agent by running the clone-from-template sequence the console
40
+ * needs, against agent-settings and the network service directly. It is
41
+ * step-for-step what apollo-api's create endpoint does internally — the only
42
+ * difference is that the template is named here rather than resolved from a
43
+ * category:
44
+ *
45
+ * 1. read the template — its category scopes the new agent, its metadata
46
+ * seeds the record, and it must already have an active version;
47
+ * 2. allocate the network the agent is scoped to (agent-settings requires a
48
+ * network id for a `regular` agent, and one network hosts one agent);
49
+ * 3. create the agent root (`regular`, blob mode);
50
+ * 4. draft from the template — the load-bearing step: agent-settings clones
51
+ * the bundle, the build bundle and the evaluation scores into the agent;
52
+ * 5. publish that draft and activate it, so the agent answers immediately;
53
+ * 6. draft again off the published version — the mutable copy authoring
54
+ * edits, and the tag a fresh checkout binds.
55
+ *
56
+ * The sequence is not transactional. Everything checkable is checked before
57
+ * the first write; past that, a failure leaves the agent behind and says so,
58
+ * because a blind re-run would allocate a second network and a second agent.
59
+ */
60
+ export declare function createAgent(context: Context, clients: AgentCreateClients, name: string, templateAgentId?: string): Promise<Agent>;
61
+ export declare function bindAgent(context: Context, agent: Agent, cwd: string, options?: {
62
+ versionTag?: string;
63
+ runtimeVersion?: string;
64
+ }): Promise<ProjectBinding>;
25
65
  /**
26
66
  * The tag a fresh `agent create` checkout should bind so the authoring loop
27
67
  * completes from the first push (REPORTS-26 defect 1): the server seeds a
@@ -33,6 +73,42 @@ export declare function bindAgent(context: Context, agent: Agent, cwd: string, v
33
73
  * already succeeded remotely — `version use` recovers.
34
74
  */
35
75
  export declare function initialVersionTag(management: ManagementClient, agent: Agent): Promise<string | undefined>;
76
+ /**
77
+ * The engine build a fresh checkout pins — the runtime half of what
78
+ * `initialVersionTag` does for the agent's own version. Create and import
79
+ * answer this differently on purpose, so there are two functions rather than
80
+ * one with a mode.
81
+ *
82
+ * Both are best-effort, like `initialVersionTag`: `undefined` leaves the
83
+ * checkout unpinned rather than failing a create or import that already
84
+ * succeeded remotely, and an unpinned checkout is exactly what every checkout
85
+ * was before pinning existed. `apollo runtime use` recovers.
86
+ */
87
+ /**
88
+ * What a NEW agent starts on: the newest PUBLISHED runtime in the catalog.
89
+ * A fresh agent has no history to honour, so it should begin on the current
90
+ * engine. Custom entries are bespoke deployments and the legacy 1.x family
91
+ * cannot run a schema-2 bundle, so neither is ever chosen here.
92
+ */
93
+ export declare function latestPublishedRuntimeVersion(clients: {
94
+ agentSettings: AgentSettingsClient;
95
+ }): Promise<string | undefined>;
96
+ /**
97
+ * What an EXISTING agent already runs on: the value the agent record itself
98
+ * carries (`active_blob_stats.runtime_version` — agent-settings only, since
99
+ * apollo's projection drops it).
100
+ *
101
+ * Taken VERBATIM, including families the catalog has since hidden. Importing
102
+ * is meant to reproduce the agent as it is; resolving through the catalog
103
+ * would silently move an agent onto a runtime it was never run on, which is
104
+ * a decision for `apollo runtime use` to make explicitly.
105
+ *
106
+ * An agent with nothing pushed yet (or an unreadable record) has no runtime
107
+ * of its own, so it starts where a new agent would.
108
+ */
109
+ export declare function agentRuntimeVersion(clients: {
110
+ agentSettings: AgentSettingsClient;
111
+ }, agentId: string): Promise<string | undefined>;
36
112
  /**
37
113
  * Bind a version tag in the current checkout — the push base / pull default.
38
114
  * The missing leg of selection symmetry (org/project/agent had `use`,
@@ -1,32 +1,28 @@
1
1
  import { homedir } from "node:os";
2
2
  import path from "node:path";
3
3
  import { findLiveVersion, } from "../api/management.js";
4
- import { setDefaultProject, writeBinding, } from "../config/index.js";
5
- import { ConfigError } from "../errors/index.js";
4
+ import { patchBinding, setDefaultProject, writeBinding, } from "../config/index.js";
5
+ import { AuthError, CliError, ConfigError } from "../errors/index.js";
6
+ import { resolveRuntimeVersion } from "../runtime-version/index.js";
6
7
  /**
7
8
  * Patch the checkout's existing `.apollorc`. Bindings are never invented in
8
9
  * arbitrary directories — outside a checkout, selection goes to the
9
10
  * account-level default project instead.
11
+ *
12
+ * Fields the patch does not mention survive untouched; a field set to
13
+ * `undefined` is deleted (how `agent unlink` clears the agent and tag).
10
14
  */
11
15
  async function updateBinding(context, patch) {
12
16
  if (!context.bindingPath) {
13
17
  throw new ConfigError("No agent checkout here (.apollorc not found).");
14
18
  }
15
- const binding = {
16
- config_version: 1,
19
+ return patchBinding(context.bindingPath, {
17
20
  ...(context.orgId ? { org_id: context.orgId } : {}),
18
21
  ...(context.projectId ? { project_id: context.projectId } : {}),
19
22
  ...(context.agentId ? { agent_id: context.agentId } : {}),
20
23
  ...(context.versionTag ? { version_tag: context.versionTag } : {}),
21
24
  ...patch,
22
- };
23
- for (const [key, value] of Object.entries(binding)) {
24
- if (value === undefined) {
25
- delete binding[key];
26
- }
27
- }
28
- await writeBinding(context.bindingPath, binding);
29
- return binding;
25
+ });
30
26
  }
31
27
  async function selectProject(context, project, homeDir) {
32
28
  // Inside a checkout the .apollorc is the selection; keep agent identity
@@ -83,18 +79,137 @@ export async function listAgents(context, management, name) {
83
79
  // Unlike /projects, the agents endpoint filters by name server-side.
84
80
  return management.listAgents(context.projectId, name);
85
81
  }
86
- export async function createAgent(context, management, name) {
87
- if (!context.projectId)
82
+ /**
83
+ * The template a new agent is cloned from — "General Runtime-v2", a published,
84
+ * blob-mode `template`-kind agent in agent-settings. Apollo's own create
85
+ * endpoint picks a template by category, i.e. whatever the environment's
86
+ * default `GENERAL` category holds, so the console names the runtime-v2 one
87
+ * outright instead. Override per create with `agent create --template <id>`.
88
+ */
89
+ export const TEMPLATE_AGENT_ID = "6a63896e1bd618f292ba6684";
90
+ /**
91
+ * Project an agent-settings record onto the published agent shape, the same
92
+ * way apollo-api does: the id is the record's own, `project_id` is the scope's
93
+ * account and `live_version_id` carries the active *tag* (REPORTS-26).
94
+ */
95
+ function agentFromRecord(record, projectId) {
96
+ return {
97
+ id: record.id,
98
+ project_id: record.scope.account_id ?? projectId,
99
+ name: record.name,
100
+ ...(record.active_version_tag === undefined
101
+ ? {}
102
+ : { live_version_id: record.active_version_tag }),
103
+ created_at: record.created_at,
104
+ updated_at: record.updated_at,
105
+ };
106
+ }
107
+ /**
108
+ * Create an agent by running the clone-from-template sequence the console
109
+ * needs, against agent-settings and the network service directly. It is
110
+ * step-for-step what apollo-api's create endpoint does internally — the only
111
+ * difference is that the template is named here rather than resolved from a
112
+ * category:
113
+ *
114
+ * 1. read the template — its category scopes the new agent, its metadata
115
+ * seeds the record, and it must already have an active version;
116
+ * 2. allocate the network the agent is scoped to (agent-settings requires a
117
+ * network id for a `regular` agent, and one network hosts one agent);
118
+ * 3. create the agent root (`regular`, blob mode);
119
+ * 4. draft from the template — the load-bearing step: agent-settings clones
120
+ * the bundle, the build bundle and the evaluation scores into the agent;
121
+ * 5. publish that draft and activate it, so the agent answers immediately;
122
+ * 6. draft again off the published version — the mutable copy authoring
123
+ * edits, and the tag a fresh checkout binds.
124
+ *
125
+ * The sequence is not transactional. Everything checkable is checked before
126
+ * the first write; past that, a failure leaves the agent behind and says so,
127
+ * because a blind re-run would allocate a second network and a second agent.
128
+ */
129
+ export async function createAgent(context, clients, name, templateAgentId = TEMPLATE_AGENT_ID) {
130
+ const projectId = context.projectId;
131
+ if (!projectId)
88
132
  throw new ConfigError("Select a project first.");
89
- return management.createAgent(context.projectId, name);
133
+ const organizationId = context.orgId;
134
+ if (!organizationId) {
135
+ throw new ConfigError("Select an organization first.", "Run `apollo org use` and try again.");
136
+ }
137
+ // Stamped as created_by/published_by on every record the sequence writes.
138
+ const userId = context.userId;
139
+ if (!userId) {
140
+ throw new AuthError("The stored credential has no user id.", "Run `apollo login` again to refresh it.");
141
+ }
142
+ // Everything below is checked here rather than left to the server: past the
143
+ // network call these would each fail with an agent already created.
144
+ const template = await clients.agentSettings.getAgent(templateAgentId);
145
+ if (template.kind !== "template") {
146
+ throw new ConfigError(`Agent ${templateAgentId} is not a template (kind=${template.kind}).`, "Pass a template agent's id with --template.");
147
+ }
148
+ const categoryId = template.scope.network_category_id;
149
+ if (!categoryId) {
150
+ throw new ConfigError(`Template ${template.name} has no category scope to create the agent in.`, "Pass a different template agent's id with --template.");
151
+ }
152
+ // The clone reads the template's *active* version, not its latest.
153
+ if (!template.active_version_id) {
154
+ throw new ConfigError(`Template ${template.name} has no active version to clone.`, "Publish and activate a version on the template, or pass --template <id>.");
155
+ }
156
+ const network = await clients.network.create({
157
+ name,
158
+ organizationId,
159
+ accountId: projectId,
160
+ categoryId,
161
+ });
162
+ const created = await clients.agentSettings.createAgent({
163
+ name,
164
+ scope: {
165
+ type: "NETWORK",
166
+ network_id: network.id,
167
+ account_id: projectId,
168
+ organization_id: organizationId,
169
+ network_category_id: categoryId,
170
+ },
171
+ kind: "regular",
172
+ bundleMode: true,
173
+ createdBy: userId,
174
+ agentMetadata: template.agent_metadata ?? {},
175
+ });
176
+ try {
177
+ const imported = await clients.agentSettings.createDraft(created.id, {
178
+ source: "template",
179
+ fromTemplate: template.id,
180
+ label: "Template Import",
181
+ notes: `Imported from template ${template.name}`,
182
+ createdBy: userId,
183
+ });
184
+ await clients.agentSettings.publishVersion(created.id, imported.id, userId);
185
+ const live = await clients.agentSettings.activateVersion(created.id, imported.id);
186
+ await clients.agentSettings.createDraft(created.id, {
187
+ source: "version",
188
+ fromVersion: imported.id,
189
+ label: "Initial Version",
190
+ notes: "Initial Version",
191
+ createdBy: userId,
192
+ });
193
+ return agentFromRecord(live, projectId);
194
+ }
195
+ catch (error) {
196
+ throw new CliError(`Agent ${created.name} (${created.id}) was created, but seeding its first version from ${template.name} failed: ${error instanceof Error ? error.message : String(error)}`, {
197
+ code: "AGENT_SEED_FAILED",
198
+ cause: error,
199
+ suggestion: `Do not re-run create — it would allocate a second agent. Recover with \`apollo agent import ${created.id}\` or seed a version with \`apollo version create --template ${template.id}\`.`,
200
+ });
201
+ }
90
202
  }
91
- export async function bindAgent(context, agent, cwd, versionTag) {
203
+ export async function bindAgent(context, agent, cwd, options = {}) {
92
204
  const binding = {
93
205
  config_version: 1,
94
206
  ...(context.orgId ? { org_id: context.orgId } : {}),
95
207
  project_id: agent.project_id,
96
208
  agent_id: agent.id,
97
- ...(versionTag ? { version_tag: versionTag } : {}),
209
+ ...(options.versionTag ? { version_tag: options.versionTag } : {}),
210
+ ...(options.runtimeVersion
211
+ ? { runtime_version: options.runtimeVersion }
212
+ : {}),
98
213
  };
99
214
  await writeBinding(path.join(cwd, ".apollorc"), binding);
100
215
  return binding;
@@ -121,6 +236,51 @@ export async function initialVersionTag(management, agent) {
121
236
  return undefined;
122
237
  }
123
238
  }
239
+ /**
240
+ * The engine build a fresh checkout pins — the runtime half of what
241
+ * `initialVersionTag` does for the agent's own version. Create and import
242
+ * answer this differently on purpose, so there are two functions rather than
243
+ * one with a mode.
244
+ *
245
+ * Both are best-effort, like `initialVersionTag`: `undefined` leaves the
246
+ * checkout unpinned rather than failing a create or import that already
247
+ * succeeded remotely, and an unpinned checkout is exactly what every checkout
248
+ * was before pinning existed. `apollo runtime use` recovers.
249
+ */
250
+ /**
251
+ * What a NEW agent starts on: the newest PUBLISHED runtime in the catalog.
252
+ * A fresh agent has no history to honour, so it should begin on the current
253
+ * engine. Custom entries are bespoke deployments and the legacy 1.x family
254
+ * cannot run a schema-2 bundle, so neither is ever chosen here.
255
+ */
256
+ export async function latestPublishedRuntimeVersion(clients) {
257
+ return (await resolveRuntimeVersion(clients.agentSettings)).version;
258
+ }
259
+ /**
260
+ * What an EXISTING agent already runs on: the value the agent record itself
261
+ * carries (`active_blob_stats.runtime_version` — agent-settings only, since
262
+ * apollo's projection drops it).
263
+ *
264
+ * Taken VERBATIM, including families the catalog has since hidden. Importing
265
+ * is meant to reproduce the agent as it is; resolving through the catalog
266
+ * would silently move an agent onto a runtime it was never run on, which is
267
+ * a decision for `apollo runtime use` to make explicitly.
268
+ *
269
+ * An agent with nothing pushed yet (or an unreadable record) has no runtime
270
+ * of its own, so it starts where a new agent would.
271
+ */
272
+ export async function agentRuntimeVersion(clients, agentId) {
273
+ try {
274
+ const record = await clients.agentSettings.getAgent(agentId);
275
+ const recorded = record.active_blob_stats?.runtime_version?.trim();
276
+ if (recorded)
277
+ return recorded;
278
+ }
279
+ catch {
280
+ // Not readable through agent-settings — fall through to the catalog.
281
+ }
282
+ return latestPublishedRuntimeVersion(clients);
283
+ }
124
284
  /**
125
285
  * Bind a version tag in the current checkout — the push base / pull default.
126
286
  * The missing leg of selection symmetry (org/project/agent had `use`,
@@ -1 +1 @@
1
- {"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../../../src/services/hierarchy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../../../src/services/hierarchy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { RequestCapture } from "../api/transport.js";
2
+ export interface CaptureFilters {
3
+ /** Keep only requests with HTTP status ≥ 400 or no response at all. */
4
+ failed?: boolean;
5
+ /** Keep only this HTTP method (case-insensitive). */
6
+ method?: string;
7
+ /** Keep only URLs containing this substring (case-insensitive). */
8
+ search?: string;
9
+ /** After other filters, keep only the most recent n entries. */
10
+ last?: number;
11
+ }
12
+ /** A request failed if the server said ≥ 400 — or never answered. */
13
+ export declare function captureFailed(entry: RequestCapture): boolean;
14
+ /** Read the persisted capture file; missing or malformed → empty list. */
15
+ export declare function readCapturedRequests(filePath?: string): Promise<RequestCapture[]>;
16
+ export declare function filterCaptures(entries: readonly RequestCapture[], filters: CaptureFilters): RequestCapture[];
17
+ /**
18
+ * One capture as a runnable curl command. Redacted (`***`) auth-ish header
19
+ * values become `$APOLLO_TOKEN` inside double quotes so the shell expands
20
+ * them at paste time; every other redacted value stays `***` verbatim.
21
+ */
22
+ export declare function formatCurl(entry: RequestCapture): string;
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Captured-request reading and curl formatting — the read side of the
3
+ * capture pipeline (api/capture.ts), consumed by `apollo curl` and the TUI.
4
+ *
5
+ * Everything here works on redacted entries: secrets never reach the disk
6
+ * (transport.ts redacts before capture), so replay output substitutes
7
+ * `$APOLLO_TOKEN` for redacted auth-ish headers instead of pretending the
8
+ * real value exists.
9
+ */
10
+ import { readFile } from "node:fs/promises";
11
+ import { defaultCapturePath } from "../api/capture.js";
12
+ /** A request failed if the server said ≥ 400 — or never answered. */
13
+ export function captureFailed(entry) {
14
+ return entry.status === undefined || entry.status >= 400;
15
+ }
16
+ /** Read the persisted capture file; missing or malformed → empty list. */
17
+ export async function readCapturedRequests(filePath = defaultCapturePath()) {
18
+ let raw;
19
+ try {
20
+ raw = await readFile(filePath, "utf8");
21
+ }
22
+ catch {
23
+ return [];
24
+ }
25
+ try {
26
+ const parsed = JSON.parse(raw);
27
+ return Array.isArray(parsed) ? parsed : [];
28
+ }
29
+ catch {
30
+ return [];
31
+ }
32
+ }
33
+ export function filterCaptures(entries, filters) {
34
+ let result = [...entries];
35
+ if (filters.failed === true)
36
+ result = result.filter(captureFailed);
37
+ if (filters.method !== undefined) {
38
+ const method = filters.method.toUpperCase();
39
+ result = result.filter((entry) => entry.method.toUpperCase() === method);
40
+ }
41
+ if (filters.search !== undefined && filters.search !== "") {
42
+ const needle = filters.search.toLowerCase();
43
+ result = result.filter((entry) => entry.url.toLowerCase().includes(needle));
44
+ }
45
+ if (filters.last !== undefined && filters.last > 0) {
46
+ result = result.slice(-filters.last);
47
+ }
48
+ return result;
49
+ }
50
+ const shellQuote = (value) => `'${value.replaceAll("'", `'\\''`)}'`;
51
+ /**
52
+ * One capture as a runnable curl command. Redacted (`***`) auth-ish header
53
+ * values become `$APOLLO_TOKEN` inside double quotes so the shell expands
54
+ * them at paste time; every other redacted value stays `***` verbatim.
55
+ */
56
+ export function formatCurl(entry) {
57
+ const lines = [`curl -X ${entry.method} ${shellQuote(entry.url)}`];
58
+ for (const [name, value] of Object.entries(entry.headers)) {
59
+ if (value === "***" && /authorization|token/i.test(name)) {
60
+ const replacement = name.toLowerCase() === "authorization"
61
+ ? "Bearer $APOLLO_TOKEN"
62
+ : "$APOLLO_TOKEN";
63
+ lines.push(` -H "${name}: ${replacement}"`);
64
+ continue;
65
+ }
66
+ lines.push(` -H ${shellQuote(`${name}: ${value}`)}`);
67
+ }
68
+ if (entry.body !== undefined) {
69
+ lines.push(` --data ${shellQuote(JSON.stringify(entry.body))}`);
70
+ }
71
+ return lines.join(" \\\n");
72
+ }
73
+ //# sourceMappingURL=requests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requests.js","sourceRoot":"","sources":["../../../src/services/requests.ts"],"names":[],"mappings":"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"}
@@ -49,28 +49,33 @@ export declare function readLocalScores(checkoutRoot: string): Promise<LocalScor
49
49
  export declare function writeLocalScores(checkoutRoot: string, data: LocalScores): Promise<void>;
50
50
  /** Absolute paths of every file directly under `scenarios/intent/`. */
51
51
  export declare function listIntentFiles(checkoutRoot: string): Promise<string[]>;
52
+ /** Every file under `scenarios/` except `scores.json`, as relative POSIX paths. */
53
+ export declare function listBundleFiles(checkoutRoot: string): Promise<{
54
+ rel: string;
55
+ abs: string;
56
+ }[]>;
52
57
  /**
53
58
  * Pre-flight the suite against the server contract so a push fails here
54
59
  * with a clear message instead of a remote 422. Returns the scenarios.
55
60
  */
56
61
  export declare function validateScenariosFile(file: ScenariosFile): LocalScenario[];
57
62
  export interface AssembledBundle {
58
- scenariosJson: string;
59
- intents: BundleUploadFile[];
63
+ files: BundleUploadFile[];
60
64
  scenariosCount: number;
61
65
  }
62
66
  /**
63
67
  * Assemble a bundle push from the checkout: the validated suite plus every
64
- * flat file under `scenarios/intent/`. Throws with a clear message when the
65
- * suite is missing/invalid or an intent file is empty / too large.
68
+ * other file under `scenarios/` except `scores.json`. Throws when the suite
69
+ * is missing/invalid or a file is too large.
66
70
  */
67
71
  export declare function assembleBundleUpload(checkoutRoot: string): Promise<AssembledBundle>;
68
72
  export interface PushBundleResult {
69
73
  version: number;
70
74
  scenariosCount: number;
75
+ filesCount: number;
71
76
  intentsCount: number;
72
77
  }
73
- /** Push the checkout's suite + intents as a new bundle version. */
78
+ /** Push the checkout's scenarios tree as a new bundle version. */
74
79
  export declare function pushScenarioBundle(context: Context, params?: {
75
80
  notes?: string;
76
81
  }, options?: ScenariosServiceOptions): Promise<PushBundleResult>;
@@ -102,12 +107,13 @@ export interface PullScenariosResult {
102
107
  found: boolean;
103
108
  version?: number;
104
109
  scenariosCount?: number;
110
+ filesCount?: number;
105
111
  intentsCount?: number;
106
112
  }
107
113
  /**
108
- * Pull the latest (or a specific) bundle into `scenarios/`: writes the
109
- * suite and downloads every intent file via its signed URL. `found: false`
110
- * (no throw) when the agent has no bundle yet.
114
+ * Pull the latest (or a specific) bundle into `scenarios/`: downloads every
115
+ * file via its signed URL. `found: false` (no throw) when the agent has no
116
+ * bundle yet.
111
117
  */
112
118
  export declare function pullScenarios(context: Context, params?: {
113
119
  bundleVersion?: number;
@@ -129,6 +135,7 @@ export interface SyncScenariosResult {
129
135
  found: boolean;
130
136
  version?: number;
131
137
  scenariosCount?: number;
138
+ filesCount?: number;
132
139
  intentsCount?: number;
133
140
  scoresFound?: boolean;
134
141
  /** Set when the pull failed; callers note it but do NOT fail. */