@ory/argus 0.13.8 → 0.14.0

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 (69) hide show
  1. package/README.md +2 -1
  2. package/assets/commands/dashboard.md +34 -0
  3. package/assets/skills/ory-build-agent/SKILL.md +11 -13
  4. package/assets/skills/ory-e2b-sandbox/SKILL.md +0 -1
  5. package/assets/skills/ory-temporal-worker/SKILL.md +8 -10
  6. package/assets/skills/permissions-onboarding/SKILL.md +3 -3
  7. package/dist/adapters.d.ts +27 -4
  8. package/dist/adapters.js +132 -32
  9. package/dist/agent-auth.d.ts +34 -3
  10. package/dist/agent-auth.js +58 -8
  11. package/dist/auth.d.ts +7 -0
  12. package/dist/auth.js +90 -5
  13. package/dist/branding.d.ts +67 -0
  14. package/dist/branding.js +81 -0
  15. package/dist/build-info.json +4 -4
  16. package/dist/cli.d.ts +3 -3
  17. package/dist/cli.js +13 -52
  18. package/dist/client.d.ts +31 -0
  19. package/dist/client.js +58 -0
  20. package/dist/config.d.ts +48 -19
  21. package/dist/config.js +31 -26
  22. package/dist/contract-suite.d.ts +5 -3
  23. package/dist/contract-suite.js +13 -22
  24. package/dist/dashboard-cli.d.ts +8 -0
  25. package/dist/dashboard-cli.js +70 -0
  26. package/dist/dev.js +3 -4
  27. package/dist/index.d.ts +12 -5
  28. package/dist/index.js +41 -3
  29. package/dist/interactive-setup.d.ts +144 -23
  30. package/dist/interactive-setup.js +412 -224
  31. package/dist/local/health.d.ts +14 -0
  32. package/dist/local/health.js +46 -0
  33. package/dist/local/manager.js +1 -3
  34. package/dist/local/seed.d.ts +9 -20
  35. package/dist/local/seed.js +26 -18
  36. package/dist/permissions-cli.js +12 -4
  37. package/dist/project-api-key.d.ts +69 -0
  38. package/dist/project-api-key.js +147 -0
  39. package/dist/registry/manager.js +62 -18
  40. package/dist/setup-actions.d.ts +232 -0
  41. package/dist/setup-actions.js +507 -0
  42. package/dist/setup.d.ts +19 -0
  43. package/dist/setup.js +44 -14
  44. package/dist/skills.js +7 -0
  45. package/dist/status-cli.d.ts +2 -2
  46. package/dist/status-cli.js +4 -30
  47. package/dist/status-data.d.ts +96 -0
  48. package/dist/status-data.js +250 -0
  49. package/dist/status-system.d.ts +24 -0
  50. package/dist/status-system.js +56 -0
  51. package/dist/testing.d.ts +8 -0
  52. package/dist/testing.js +20 -1
  53. package/dist/uninstall.d.ts +33 -15
  54. package/dist/uninstall.js +65 -22
  55. package/dist/user-login.d.ts +16 -9
  56. package/dist/user-login.js +18 -28
  57. package/dist/web/api.d.ts +33 -0
  58. package/dist/web/api.js +294 -0
  59. package/dist/web/launch.d.ts +11 -0
  60. package/dist/web/launch.js +96 -0
  61. package/dist/web/server.d.ts +20 -0
  62. package/dist/web/server.js +233 -0
  63. package/dist/web/types.d.ts +65 -0
  64. package/dist/web/types.js +2 -0
  65. package/dist/webapp/assets/index-Wucl4SZs.css +1 -0
  66. package/dist/webapp/assets/index-m-GtEdq0.js +49 -0
  67. package/dist/webapp/favicon.ico +0 -0
  68. package/dist/webapp/index.html +15 -0
  69. package/package.json +17 -2
package/dist/config.d.ts CHANGED
@@ -30,6 +30,27 @@ export interface OryUserCredentials {
30
30
  * restarts re-use the same agent identity instead of re-registering on
31
31
  * every session.
32
32
  */
33
+ /**
34
+ * The delegation edge recorded on a dynamically-registered OAuth2 client's
35
+ * `metadata` at registration time (see {@link OryAgentDynamicCredentials.delegation}).
36
+ *
37
+ * This is the **integrity anchor** for the delegation chain: it is bound to
38
+ * the OAuth2 client identity durably owned by Hydra / Ory Network and mirrored
39
+ * into local config, so the delegator can be resolved — and the derived Keto
40
+ * tuple rebuilt — even if the tuple is lost, corrupted, or never written.
41
+ */
42
+ export interface OryDelegationRecord {
43
+ /** The delegator, as a namespaced subject: `user:<sub>` or `agent:<sub>`. */
44
+ delegatedBy: string;
45
+ /** Which edge of the chain this client sits on. */
46
+ delegationType: "user-to-agent" | "agent-to-subagent";
47
+ /** Harness the delegation was established under (audit aid). */
48
+ harness?: string;
49
+ /** Sub-agent type, present only for `agent-to-subagent`. */
50
+ subAgentType?: string;
51
+ /** ISO-8601 timestamp the delegation was stamped. */
52
+ delegatedAt: string;
53
+ }
33
54
  export interface OryAgentDynamicCredentials {
34
55
  /** Issued client_id. */
35
56
  clientId: string;
@@ -45,6 +66,14 @@ export interface OryAgentDynamicCredentials {
45
66
  projectUrl: string;
46
67
  /** Harness name baked into the client_name (audit aid). */
47
68
  harness?: string;
69
+ /**
70
+ * The delegation edge recorded for this client at registration. Persisted
71
+ * here in local config only — Ory's public DCR endpoint rejects a `metadata`
72
+ * field, so it is never stored server-side. Absent when the delegator wasn't
73
+ * known at registration time (e.g. DCR bootstrapped from an out-of-band
74
+ * initial access token with no user/agent principal).
75
+ */
76
+ delegation?: OryDelegationRecord;
48
77
  }
49
78
  /** Credentials for the AI agent principal (machine identity). */
50
79
  export interface OryAgentCredentialsBlock {
@@ -88,10 +117,26 @@ export interface OryPluginConfig {
88
117
  * never be substituted for a slug when building it.
89
118
  */
90
119
  projectId?: string;
120
+ /**
121
+ * Human-readable project and workspace names, captured at install time for
122
+ * display only (e.g. the dashboard's connected-stack card). Not used to
123
+ * address any API — {@link projectUrl} / {@link projectId} do that.
124
+ */
125
+ projectName?: string;
126
+ workspaceName?: string;
91
127
  apiKey?: string;
128
+ /**
129
+ * Token id of the project API key stored in {@link apiKey}, captured when the
130
+ * installer mints the key via the Ory Console API. Ory only returns a key's
131
+ * secret at creation and deletion addresses the token by id (not by its
132
+ * secret value), so the id is persisted here purely so `uninstall` can delete
133
+ * the key server-side. Absent for keys minted before id-tracking, or supplied
134
+ * by hand via `configure --api-key`.
135
+ */
136
+ apiKeyId?: string;
92
137
  /**
93
138
  * Public OAuth2 client id used by the user PKCE browser flow when
94
- * `ORY_USER_LOGIN` is on. The client must be registered ahead of time
139
+ * the interactive user login runs (every session). The client must be registered ahead of time
95
140
  * in the Ory project with all four loopback redirect URIs
96
141
  * (`http://127.0.0.1:47823..47826/callback`) and
97
142
  * `token_endpoint_auth_method=none`. The local stack provisions one
@@ -107,14 +152,6 @@ export interface OryPluginConfig {
107
152
  * tuple set is correct. See {@link PermissionMode}.
108
153
  */
109
154
  permissionMode?: PermissionMode;
110
- /**
111
- * Whether the interactive user PKCE login runs at session start. When
112
- * true, every session runs `ensureUserAuthenticated`; when unset the
113
- * flow is a no-op. Set via `configure --user-login` / `--no-user-login`.
114
- * The `ORY_USER_LOGIN` env var overrides this when set. Requires an
115
- * OAuth2 client id ({@link oauth2ClientId}) to actually complete a login.
116
- */
117
- userLogin?: boolean;
118
155
  /**
119
156
  * Permission-check subject namespace for the human user. When set, the
120
157
  * user is addressed as a SubjectSet `<namespace>:<subject>` in permission
@@ -159,14 +196,6 @@ export declare function getConfigPath(): string;
159
196
  * does not exist or is invalid.
160
197
  */
161
198
  export declare function loadConfig(): OryPluginConfig;
162
- /**
163
- * Read `ORY_USER_LOGIN` from the environment. Returns `true`/`false` when
164
- * the var is set (any recognized truthy value enables it; anything else
165
- * disables it), or `undefined` when the var is absent/empty so callers
166
- * fall back to the config file. Centralized here so the user gate, status
167
- * CLI, and configure command resolve it identically.
168
- */
169
- export declare function parseUserLoginEnv(): boolean | undefined;
170
199
  /**
171
200
  * Save config to the config file. Merges with existing values — only
172
201
  * provided fields are overwritten. Concurrent processes serialize via a
@@ -209,13 +238,13 @@ export declare function looksLikeProjectId(value: string): boolean;
209
238
  export declare function resolveConfig(): {
210
239
  projectUrl?: string;
211
240
  projectId?: string;
241
+ projectName?: string;
242
+ workspaceName?: string;
212
243
  apiKey?: string;
213
244
  oauth2ClientId?: string;
214
245
  auditOnly: boolean;
215
246
  permissionMode: PermissionMode;
216
247
  permissionModeSource: "env" | "config" | "default";
217
- userLogin: boolean;
218
- userLoginSource: "env" | "config" | "default";
219
248
  userSubjectNamespace?: string;
220
249
  userSubjectNamespaceSource: "env" | "config" | "none";
221
250
  projectUrlSource: "env" | "config" | "none";
package/dist/config.js CHANGED
@@ -37,7 +37,6 @@ exports.getDataDir = getDataDir;
37
37
  exports.getHarnessDataDir = getHarnessDataDir;
38
38
  exports.getConfigPath = getConfigPath;
39
39
  exports.loadConfig = loadConfig;
40
- exports.parseUserLoginEnv = parseUserLoginEnv;
41
40
  exports.saveConfig = saveConfig;
42
41
  exports.mutateConfig = mutateConfig;
43
42
  exports.looksLikeProjectId = looksLikeProjectId;
@@ -120,11 +119,19 @@ function loadConfig() {
120
119
  projectId: typeof parsed.projectId === "string" && parsed.projectId.trim()
121
120
  ? parsed.projectId.trim()
122
121
  : undefined,
122
+ projectName: typeof parsed.projectName === "string" && parsed.projectName.trim()
123
+ ? parsed.projectName.trim()
124
+ : undefined,
125
+ workspaceName: typeof parsed.workspaceName === "string" && parsed.workspaceName.trim()
126
+ ? parsed.workspaceName.trim()
127
+ : undefined,
123
128
  apiKey: typeof parsed.apiKey === "string" ? parsed.apiKey : undefined,
129
+ apiKeyId: typeof parsed.apiKeyId === "string" && parsed.apiKeyId.trim()
130
+ ? parsed.apiKeyId.trim()
131
+ : undefined,
124
132
  oauth2ClientId: typeof parsed.oauth2ClientId === "string" ? parsed.oauth2ClientId : undefined,
125
133
  auditOnly: parsed.auditOnly === true ? true : undefined,
126
134
  permissionMode: parsePermissionMode(parsed.permissionMode),
127
- userLogin: typeof parsed.userLogin === "boolean" ? parsed.userLogin : undefined,
128
135
  userSubjectNamespace: typeof parsed.userSubjectNamespace === "string" && parsed.userSubjectNamespace.trim()
129
136
  ? parsed.userSubjectNamespace.trim()
130
137
  : undefined,
@@ -139,21 +146,6 @@ function loadConfig() {
139
146
  function parsePermissionMode(value) {
140
147
  return value === "observe" || value === "enforce" ? value : undefined;
141
148
  }
142
- /** Env values that turn the interactive user login on. */
143
- const USER_LOGIN_ENABLED_VALUES = new Set(["1", "true", "yes", "on"]);
144
- /**
145
- * Read `ORY_USER_LOGIN` from the environment. Returns `true`/`false` when
146
- * the var is set (any recognized truthy value enables it; anything else
147
- * disables it), or `undefined` when the var is absent/empty so callers
148
- * fall back to the config file. Centralized here so the user gate, status
149
- * CLI, and configure command resolve it identically.
150
- */
151
- function parseUserLoginEnv() {
152
- const raw = process.env.ORY_USER_LOGIN;
153
- if (raw === undefined || raw.trim() === "")
154
- return undefined;
155
- return USER_LOGIN_ENABLED_VALUES.has(raw.trim().toLowerCase());
156
- }
157
149
  function parseAgentCredentials(parsed) {
158
150
  const raw = parsed.agent;
159
151
  if (!raw || typeof raw !== "object")
@@ -197,6 +189,26 @@ function parseAgentDynamicCredentials(value) {
197
189
  registeredAt,
198
190
  projectUrl: v.projectUrl,
199
191
  harness: typeof v.harness === "string" ? v.harness : undefined,
192
+ ...(parseDelegationRecord(v.delegation)
193
+ ? { delegation: parseDelegationRecord(v.delegation) }
194
+ : {}),
195
+ };
196
+ }
197
+ function parseDelegationRecord(value) {
198
+ if (!value || typeof value !== "object")
199
+ return undefined;
200
+ const v = value;
201
+ if (typeof v.delegatedBy !== "string" || v.delegatedBy.length === 0)
202
+ return undefined;
203
+ if (v.delegationType !== "user-to-agent" && v.delegationType !== "agent-to-subagent") {
204
+ return undefined;
205
+ }
206
+ return {
207
+ delegatedBy: v.delegatedBy,
208
+ delegationType: v.delegationType,
209
+ ...(typeof v.harness === "string" ? { harness: v.harness } : {}),
210
+ ...(typeof v.subAgentType === "string" ? { subAgentType: v.subAgentType } : {}),
211
+ delegatedAt: typeof v.delegatedAt === "string" ? v.delegatedAt : "",
200
212
  };
201
213
  }
202
214
  function parseUserCredentials(parsed) {
@@ -411,7 +423,6 @@ function resolveConfig() {
411
423
  const envApiKey = process.env.ORY_AGENT_API_KEY ?? process.env.ORY_API_KEY;
412
424
  const envClientId = process.env.ORY_OAUTH2_CLIENT_ID;
413
425
  const envMode = parsePermissionMode(process.env.ORY_PERMISSION_MODE);
414
- const envUserLogin = parseUserLoginEnv();
415
426
  const envUserSubjectNamespace = process.env.ORY_USER_SUBJECT_NAMESPACE?.trim() || undefined;
416
427
  const permissionMode = envMode ?? file.permissionMode ?? "observe";
417
428
  const permissionModeSource = envMode
@@ -419,12 +430,6 @@ function resolveConfig() {
419
430
  : file.permissionMode
420
431
  ? "config"
421
432
  : "default";
422
- const userLogin = envUserLogin ?? file.userLogin ?? false;
423
- const userLoginSource = envUserLogin !== undefined
424
- ? "env"
425
- : file.userLogin !== undefined
426
- ? "config"
427
- : "default";
428
433
  const projectId = envProjectId ?? file.projectId;
429
434
  // The SDK URL is only ever an explicit, slug-based URL (from ORY_PROJECT_URL,
430
435
  // ORY_SDK_URL, or the config file). The project id is NOT a URL source — it
@@ -438,13 +443,13 @@ function resolveConfig() {
438
443
  return {
439
444
  projectUrl,
440
445
  projectId,
446
+ projectName: file.projectName,
447
+ workspaceName: file.workspaceName,
441
448
  apiKey: envApiKey ?? file.apiKey,
442
449
  oauth2ClientId: envClientId ?? file.oauth2ClientId,
443
450
  auditOnly: file.auditOnly === true,
444
451
  permissionMode,
445
452
  permissionModeSource,
446
- userLogin,
447
- userLoginSource,
448
453
  userSubjectNamespace: envUserSubjectNamespace ?? file.userSubjectNamespace,
449
454
  userSubjectNamespaceSource: envUserSubjectNamespace
450
455
  ? "env"
@@ -61,10 +61,12 @@ export interface HarnessContractAdapter {
61
61
  /** A real, non-interactive tool from this harness's catalog. */
62
62
  tool: string;
63
63
  /**
64
- * Whether the harness's session-start primitive can carry a hard block
65
- * (subprocess exit-code harnesses: true; in-process advisory: false).
64
+ * @deprecated Ignored. Session start is now uniformly non-blocking on every
65
+ * harness (authentication never blocks; enforcement is governed by
66
+ * `permissionMode` at tool-call time). Kept optional so existing adapters
67
+ * that still pass it type-check.
66
68
  */
67
- sessionCanBlock: boolean;
69
+ sessionCanBlock?: boolean;
68
70
  /** Whether the tool gate can hard-block. Defaults to true. */
69
71
  toolCanBlock?: boolean;
70
72
  /** Set false when the plugin has no legacy OAuth2-token session path. */
@@ -36,12 +36,12 @@ exports.runHarnessContractSuite = runHarnessContractSuite;
36
36
  const vitest_1 = require("vitest");
37
37
  const config_js_1 = require("./config.js");
38
38
  const testing_js_1 = require("./testing.js");
39
- const DISABLED_DECISION = {
39
+ const DEFAULT_DECISION = {
40
40
  proceed: true,
41
- mode: "disabled",
42
- reason: "ORY_USER_LOGIN not enabled",
41
+ mode: "skipped",
42
+ reason: "no cached user identity in contract suite",
43
43
  };
44
- function makeGates(userDecision = DISABLED_DECISION) {
44
+ function makeGates(userDecision = DEFAULT_DECISION) {
45
45
  return {
46
46
  userLogin: vitest_1.vi.fn(async () => userDecision),
47
47
  agentGate: vitest_1.vi.fn(async () => ({
@@ -125,42 +125,33 @@ function runHarnessContractSuite(adapter) {
125
125
  (0, vitest_1.expect)(outcome.blocked).toBe(false);
126
126
  });
127
127
  });
128
- // ── User-login gate translation ────────────────────────────────
128
+ // ── User-login gate is advisory (never blocks the session) ─────
129
129
  (0, vitest_1.describe)("user-login gate", () => {
130
130
  const declined = {
131
131
  proceed: false,
132
132
  mode: "declined",
133
133
  reason: "User declined the OAuth2 consent screen",
134
134
  };
135
- (0, vitest_1.it)(adapter.sessionCanBlock
136
- ? "translates a declined login into the native session block"
137
- : "treats a declined login as advisory (no session block channel)", async () => {
135
+ (0, vitest_1.it)("never blocks the session even when the user login declines", async () => {
136
+ // Authentication is non-blocking on every harness; enforcement is
137
+ // governed by permissionMode at tool-call time, not here.
138
138
  const gates = makeGates(declined);
139
139
  const outcome = await adapter.sessionStart(ctx(gates));
140
- (0, vitest_1.expect)(outcome.blocked).toBe(adapter.sessionCanBlock);
141
- if (adapter.sessionCanBlock) {
142
- (0, vitest_1.expect)(outcome.reason).toBeTruthy();
143
- }
140
+ (0, vitest_1.expect)(outcome.blocked).toBe(false);
144
141
  });
145
142
  (0, vitest_1.it)("runs the agent gate even when the user gate declines", async () => {
146
143
  const gates = makeGates(declined);
147
144
  await adapter.sessionStart(ctx(gates));
148
145
  (0, vitest_1.expect)(gates.agentGate).toHaveBeenCalledOnce();
149
146
  });
150
- (0, vitest_1.it)("proceeds without legacy verification when the gate handled auth", async () => {
147
+ (0, vitest_1.it)("never runs a legacy session-token verification path", async () => {
148
+ // The user gate owns authentication; there is no separate legacy
149
+ // verify/introspect fall-through any longer.
151
150
  process.env.ORY_SESSION_TOKEN = "should-not-be-verified";
152
151
  const verify = (0, testing_js_1.stubSessionSuccess)(client);
153
- const gates = makeGates({ proceed: true, mode: "ok", reason: "logged in" });
154
- const outcome = await adapter.sessionStart(ctx(gates));
155
- (0, vitest_1.expect)(outcome.blocked).toBe(false);
156
- (0, vitest_1.expect)(verify).not.toHaveBeenCalled();
157
- });
158
- (0, vitest_1.it)("falls through to legacy verification when the gate is disabled", async () => {
159
- process.env.ORY_SESSION_TOKEN = "legacy-token";
160
- const verify = (0, testing_js_1.stubSessionSuccess)(client);
161
152
  const outcome = await adapter.sessionStart(ctx());
162
153
  (0, vitest_1.expect)(outcome.blocked).toBe(false);
163
- (0, vitest_1.expect)(verify).toHaveBeenCalled();
154
+ (0, vitest_1.expect)(verify).not.toHaveBeenCalled();
164
155
  });
165
156
  });
166
157
  // ── Tool gate translation ──────────────────────────────────────
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Entry point invoked by each harness CLI's `dashboard` case. Returns the
3
+ * intended process exit code; never throws. With `--json` (or when no browser
4
+ * can be opened) it prints the report and resolves immediately; otherwise it
5
+ * opens the web app in `status` mode and resolves when the SPA requests
6
+ * shutdown or the user interrupts (Ctrl+C).
7
+ */
8
+ export declare function runDashboardCommand(binName: string, harness: string, args: string[]): Promise<number>;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runDashboardCommand = runDashboardCommand;
4
+ /**
5
+ * Shared `dashboard` CLI implementation. Each harness's `cli/main.ts`
6
+ * delegates `<bin> dashboard` here.
7
+ *
8
+ * The dashboard is the live status view of the plugin, and one of the two
9
+ * surfaces of the Ory Agent web app (the other being the guided installer): it
10
+ * opens that app in `status` mode via {@link file://./web/launch.ts}'s
11
+ * `launchWebDashboard`, reusing the same loopback server + React SPA. The data
12
+ * it renders is the shared {@link file://./status-data.ts} `StatusReport`,
13
+ * which the dashboard extends with a "System information" section — the health
14
+ * of the core Ory services (Kratos, Hydra, Keto) from
15
+ * {@link file://./status-system.ts}.
16
+ *
17
+ * Besides reading status, the dashboard exposes a "Change stack" action that
18
+ * hands off to the same guided wizard the installer uses (embedded, starting on
19
+ * the stack chooser) so the user can reconfigure which Ory stack the plugin runs
20
+ * against — Ory Network, the local stack, or audit-only — without leaving the
21
+ * browser. It reuses the shared install API and reloads status on return.
22
+ *
23
+ * Flags:
24
+ * --json Print the status report as JSON and exit (no server). Also the
25
+ * automatic fallback when a browser can't be opened (headless / CI).
26
+ */
27
+ const launch_js_1 = require("./web/launch.js");
28
+ const status_data_js_1 = require("./status-data.js");
29
+ const cli_invocation_js_1 = require("./cli-invocation.js");
30
+ function printDashboardHelp(binName) {
31
+ console.log(`Usage: ${binName} dashboard [options]`);
32
+ console.log("");
33
+ console.log("Open the Ory Agent dashboard in your browser — a live view of the");
34
+ console.log("plugin's configuration and the health of the core Ory services (Kratos,");
35
+ console.log("Hydra, Keto), refreshing live. It is the status surface of the same web");
36
+ console.log("app that powers the guided installer, and its \"Change stack\" action lets");
37
+ console.log("you reconfigure which Ory stack the plugin runs against.");
38
+ console.log("");
39
+ console.log("Options:");
40
+ console.log(" --json Print the status report as JSON and exit (no server)");
41
+ console.log("");
42
+ console.log(` ${(0, cli_invocation_js_1.oryNpx)(binName)} dashboard`);
43
+ }
44
+ /**
45
+ * Entry point invoked by each harness CLI's `dashboard` case. Returns the
46
+ * intended process exit code; never throws. With `--json` (or when no browser
47
+ * can be opened) it prints the report and resolves immediately; otherwise it
48
+ * opens the web app in `status` mode and resolves when the SPA requests
49
+ * shutdown or the user interrupts (Ctrl+C).
50
+ */
51
+ async function runDashboardCommand(binName, harness, args) {
52
+ if (args.includes("--help") || args.includes("-h")) {
53
+ printDashboardHelp(binName);
54
+ return 0;
55
+ }
56
+ // `--json`, or any environment where we can't open a browser (CI, no TTY,
57
+ // no display), falls back to the machine-readable report on stdout.
58
+ if (args.includes("--json") || !(0, launch_js_1.canLaunchBrowser)()) {
59
+ const report = await (0, status_data_js_1.collectStatusReport)(harness);
60
+ console.log(JSON.stringify(report, null, 2));
61
+ return 0;
62
+ }
63
+ const launched = await (0, launch_js_1.launchWebDashboard)(binName, harness);
64
+ if (!launched) {
65
+ console.error("Could not start the dashboard server.");
66
+ console.error(`Use "${(0, cli_invocation_js_1.oryNpx)(binName)} dashboard --json" for the raw report instead.`);
67
+ return 1;
68
+ }
69
+ return 0;
70
+ }
package/dist/dev.js CHANGED
@@ -417,9 +417,8 @@ function buildLocalOryEnv(gatewayUrl, seed) {
417
417
  return {
418
418
  ORY_PROJECT_URL: gatewayUrl,
419
419
  ORY_PERMISSION_NAMESPACE: seed.permissions.namespace,
420
- // User login always on in local dev so the launcher demonstrates
421
- // the interactive PKCE login UX end-to-end every session.
422
- ORY_USER_LOGIN: "true",
420
+ // User login runs every session (always on); no flag needed. The launcher
421
+ // demonstrates the interactive PKCE login UX end-to-end.
423
422
  // Agent identity — the harness self-registers via DCR on first run
424
423
  // using the user's bearer as the initial access token. No static
425
424
  // client_credentials are seeded; explicitly clear them so a leaking
@@ -498,7 +497,7 @@ async function bootstrapLocalOry(localDir) {
498
497
  console.warn(`[ory-dev] Local Ory: seed failed (${msg}). Continuing without local Ory.`);
499
498
  return { active: false };
500
499
  }
501
- console.log(`[ory-dev] Local Ory: agent ${seed.agent.identity.email}, user ${seed.user.identity.email}, ` +
500
+ console.log(`[ory-dev] Local Ory: user ${seed.user.identity.email}, ` +
502
501
  `${seed.permissions.tuples} permissions in '${namespace}' for ${seed.permissions.subject}.`);
503
502
  return { active: true, gatewayUrl, seed };
504
503
  }
package/dist/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  export { OryAgentClient, type OryAgentConfig, type PrincipalIdentity, } from "./client.js";
2
2
  export { DebugLogger, redactLogData, withQuietStderr, type LogEntry, type LogLevel, } from "./logger.js";
3
3
  export { Tracer, ActiveSpan, deriveTraceId, formatSpan, watchTraceFile, type TraceEvent, type SpanStatus, type TraceSpan, type SpanOptions, type TracerOptions, type TracerContext, type SpanAttributeEnricher, } from "./tracer.js";
4
- export { loadConfig, saveConfig, resolveConfig, mutateConfig, getConfigPath, getDataDir, getHarnessDataDir, type OryPluginConfig, type OryOAuth2Tokens, type OryUserCredentials, type OryAgentCredentialsBlock, type OryAgentDynamicCredentials, type PermissionMode, } from "./config.js";
4
+ export { loadConfig, saveConfig, resolveConfig, mutateConfig, getConfigPath, getDataDir, getHarnessDataDir, type OryPluginConfig, type OryOAuth2Tokens, type OryUserCredentials, type OryAgentCredentialsBlock, type OryAgentDynamicCredentials, type OryDelegationRecord, type PermissionMode, } from "./config.js";
5
5
  export { pkceLogin, refreshAccessToken, detectHeadless, generateCodeVerifier, sha256Base64Url, buildAuthorizeUrl, LOOPBACK_PORTS, DEFAULT_LOGIN_TIMEOUT_MS, type PkceLoginOptions, type PkceLoginOutcome, type PkceDeclineReason, } from "./auth.js";
6
6
  export { loadTokens, saveTokens, clearTokens, isExpired, refreshAndSave, tryAcquirePkceFlightLock, clearPkceFlightLock, waitForPeerTokens, waitForPeerTokensSync, TOKEN_EXPIRY_SKEW_SEC, type PkceFlightLock, } from "./auth-store.js";
7
7
  export { ensureUserAuthenticated, ensureAuthenticated, type UserLoginDecision, type UserLoginMode, type UserLoginOptions, } from "./user-login.js";
8
- export { resolveAgentCredentials, ensureAgentIdentity, ensureSubAgentIdentity, fetchClientCredentialsToken, registerAgentClient, loadAgentDynamicCredentials, saveAgentDynamicCredentials, clearAgentDynamicCredentials, loadSubAgentDynamicCredentials, saveSubAgentDynamicCredentials, clearSubAgentDynamicCredentials, revokeAgentDynamicClient, AGENT_TOKEN_EXPIRY_SKEW_SEC, type AgentCredentials, type AgentCredentialKind, type ResolveAgentCredentialsOptions, type EnsureAgentIdentityOptions, type RegisterAgentClientArgs, type RevokeAgentClientResult, type SubAgentIdentity, type EnsureSubAgentIdentityOptions, } from "./agent-auth.js";
8
+ export { resolveAgentCredentials, ensureAgentIdentity, ensureSubAgentIdentity, fetchClientCredentialsToken, registerAgentClient, loadAgentDynamicCredentials, saveAgentDynamicCredentials, clearAgentDynamicCredentials, loadSubAgentDynamicCredentials, saveSubAgentDynamicCredentials, clearSubAgentDynamicCredentials, revokeAgentDynamicClient, AGENT_TOKEN_EXPIRY_SKEW_SEC, type AgentCredentials, type AgentCredentialKind, type ResolveAgentCredentialsOptions, type EnsureAgentIdentityOptions, type RegisterAgentClientArgs, type DelegationInput, type RevokeAgentClientResult, type SubAgentIdentity, type EnsureSubAgentIdentityOptions, } from "./agent-auth.js";
9
9
  export { clearCredentialsForUninstall, type ClearCredentialsOptions, type ClearCredentialsResult, } from "./uninstall.js";
10
10
  export { type SessionInfo, type OAuth2TokenInfo, type PermissionCheck, type PermissionResult, type BatchPermissionResult, type OryError, type OryErrorCode, } from "./types.js";
11
11
  export { runConfigureCommand, runAgentCommand, printOryConfig, printEnvironment, printLogTail, printEnvHelp, printTraceTail, runWatchCommand, isTtyAvailable, promptOnTty, promptForProjectUrl, interactiveConfigPrompt, } from "./cli.js";
@@ -13,12 +13,17 @@ export { oryNpx } from "./cli-invocation.js";
13
13
  export { runPermissionsCommand, isUserIdentityCached, maybeAutoBootstrap, printPermissionsOnboardingHelp, } from "./permissions-cli.js";
14
14
  export { runInteractiveSetup, runPostInstall, projectUrlFromSlug, LOOPBACK_REDIRECT_URIS, type OryCliRunner, type OryExecResult, type InteractiveSetupDeps, type InteractiveSetupOutcome, type InteractiveSetupResult, } from "./interactive-setup.js";
15
15
  export { runStatusCommand, printUserIdentitySection, printAgentIdentitySection, printPermissionsSection, type StatusCommandOptions, } from "./status-cli.js";
16
+ export { collectStatusReport, probePermissionsCoverage, type StatusReport, type StatusConfigSection, type StatusUserSection, type StatusAgentSection, type StatusPermissionsSection, type StatusActivitySection, type PermissionsCoverage, } from "./status-data.js";
17
+ export { ensureOryCli, isSignedIn, listWorkspaces, createWorkspace, createProject, resolveProjectUrl, getDcrState, enableDcrAction, provisionOAuth2Client, saveNetworkConfig, runFullSetup, inspectPermissions, provisionPermissions, grantToolPermissions, provisionProjectApiKey, configureAuditOnly, configureLocalStack, type SetupActionDeps, type LocalStackResult, type FullSetupResult, } from "./setup-actions.js";
18
+ export { canLaunchBrowser, launchWebInstaller, launchWebDashboard, } from "./web/launch.js";
19
+ export { startServer, type RunningServer } from "./web/server.js";
20
+ export type { WebAppMode, BootstrapPayload } from "./web/types.js";
16
21
  export { runVersionCommand, collectVersionInfo, resolveBuildInfo, type BuildInfo, type VersionInfo, type VersionCommandOptions, } from "./version-cli.js";
17
- export { parseSetupArgs, readJsonFile, writeJsonFile, isOryHookCommand, resolveHookCommand, matcherHookEntry, mergeMatcherHooks, removeMatcherHooks, flatHookEntry, mergeFlatHooks, removeFlatHooks, printSetupHelp, printNextSteps, nextStepsSink, beginDeferNextSteps, emitDeferredNextSteps, resolveMcpServerCommand, mcpServerEntry, mergeMcpServer, removeMcpServer, registerPlugin, unregisterPlugin, type SetupArgs, type HookCommand, type MatcherEntry, } from "./setup.js";
22
+ export { parseSetupArgs, readJsonFile, writeJsonFile, isOryHookCommand, resolveHookCommand, pinHookToLocalRegistry, matcherHookEntry, mergeMatcherHooks, removeMatcherHooks, flatHookEntry, mergeFlatHooks, removeFlatHooks, printSetupHelp, printNextSteps, nextStepsSink, beginDeferNextSteps, emitDeferredNextSteps, resolveMcpServerCommand, mcpServerEntry, mergeMcpServer, removeMcpServer, registerPlugin, unregisterPlugin, type SetupArgs, type HookCommand, type MatcherEntry, } from "./setup.js";
18
23
  export { runDevLauncher, type DevLauncherConfig, type InstallContext, } from "./dev.js";
19
24
  export { renderOrySkills, renderOryCommands, commandToSkill, commandToToml, commandToFrontmatterMarkdown, commandToPlainMarkdown, toSkillMarkdown, writeSkillTree, removeSkillDirs, ORY_SKILL_NAMES, ORY_COMMAND_SKILL_NAMES, ORY_COMMAND_SLUGS, type RenderedSkill, type RenderedCommand, type RenderProfileOptions, } from "./skills.js";
20
25
  export { runLocalCommand, ensureDevJaeger, stopDevJaeger, DEV_JAEGER_CONTAINER, type EnsureDevJaegerResult, type StopDevJaegerResult, } from "./local/index.js";
21
- export { runRegistryCommand } from "./registry/index.js";
26
+ export { runRegistryCommand, REGISTRY_URL } from "./registry/index.js";
22
27
  export { checkAndDecide, applyPermissionMode, gateToolCall, type PermissionDecision, type ModeDecision, type DecisionSpanAttributes, type CheckAndDecideOptions, type ApplyPermissionModeContext, type GateToolCallArgs, type ToolGateOutcome, } from "./permissions.js";
23
28
  export { HARNESS_TOOL_CATALOG, KNOWN_HARNESSES, ALL_TOOLS, getToolCatalog, INTERACTIVE_TOOL_CATALOG, getInteractiveToolCatalog, isInteractiveTool, type KnownHarness, } from "./tool-catalog.js";
24
29
  export { classifyLifecycle, isUserFacingPhase, isToolExecutionPhase, HARNESS_LIFECYCLE_MAP, USER_FACING_PHASES, TOOL_EXECUTION_PHASES, type LifecyclePhase, } from "./lifecycle.js";
@@ -27,4 +32,6 @@ export { resolveUserSubject, runWithUserSubject, subjectLabel, type UserSubjectR
27
32
  export { formatDenialMessage, formatDenialSummary, formatAlertMessage, formatAlertSummary, alertAttributes, OryDenialError, type DenialContext, type AlertAttributes, } from "./denial.js";
28
33
  export { summarizeToolInput, summarizeToolOutput, type ToolInputSummary, type ToolOutputSummary, } from "./tool-metadata.js";
29
34
  export { OtlpExporter, otlpExporterFromEnv, parseKeyValueList, type SpanExporter, type OtlpExporterOptions, type OtlpProtocol, } from "./otel/index.js";
30
- export { resolveNamespace, sessionStart, gate, complete, registerSubagent, wrapTool, type SessionStartResult, type SessionStartOptions, type RegisterSubagentOptions, type GateResult, type GateOptions, type WrapToolOptions, } from "./adapters.js";
35
+ export { resolveNamespace, sessionStart, gate, complete, registerSubagent, writeUserDelegatesAgent, writeAgentDelegatesSubagent, wrapTool, type SessionStartResult, type SessionStartOptions, type RegisterSubagentOptions, type GateResult, type GateOptions, type WrapToolOptions, } from "./adapters.js";
36
+ export { collectSystemServices, type StatusSystemSection, type StatusSystemService, } from "./status-system.js";
37
+ export { runDashboardCommand } from "./dashboard-cli.js";
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.clearCredentialsForUninstall = exports.AGENT_TOKEN_EXPIRY_SKEW_SEC = exports.revokeAgentDynamicClient = exports.clearSubAgentDynamicCredentials = exports.saveSubAgentDynamicCredentials = exports.loadSubAgentDynamicCredentials = exports.clearAgentDynamicCredentials = exports.saveAgentDynamicCredentials = exports.loadAgentDynamicCredentials = exports.registerAgentClient = exports.fetchClientCredentialsToken = exports.ensureSubAgentIdentity = exports.ensureAgentIdentity = exports.resolveAgentCredentials = exports.ensureAuthenticated = exports.ensureUserAuthenticated = exports.TOKEN_EXPIRY_SKEW_SEC = exports.waitForPeerTokensSync = exports.waitForPeerTokens = exports.clearPkceFlightLock = exports.tryAcquirePkceFlightLock = exports.refreshAndSave = exports.isExpired = exports.clearTokens = exports.saveTokens = exports.loadTokens = exports.DEFAULT_LOGIN_TIMEOUT_MS = exports.LOOPBACK_PORTS = exports.buildAuthorizeUrl = exports.sha256Base64Url = exports.generateCodeVerifier = exports.detectHeadless = exports.refreshAccessToken = exports.pkceLogin = exports.getHarnessDataDir = exports.getDataDir = exports.getConfigPath = exports.mutateConfig = exports.resolveConfig = exports.saveConfig = exports.loadConfig = exports.watchTraceFile = exports.formatSpan = exports.deriveTraceId = exports.ActiveSpan = exports.Tracer = exports.withQuietStderr = exports.redactLogData = exports.DebugLogger = exports.OryAgentClient = void 0;
4
- exports.unregisterPlugin = exports.registerPlugin = exports.removeMcpServer = exports.mergeMcpServer = exports.mcpServerEntry = exports.resolveMcpServerCommand = exports.emitDeferredNextSteps = exports.beginDeferNextSteps = exports.nextStepsSink = exports.printNextSteps = exports.printSetupHelp = exports.removeFlatHooks = exports.mergeFlatHooks = exports.flatHookEntry = exports.removeMatcherHooks = exports.mergeMatcherHooks = exports.matcherHookEntry = exports.resolveHookCommand = exports.isOryHookCommand = exports.writeJsonFile = exports.readJsonFile = exports.parseSetupArgs = exports.resolveBuildInfo = exports.collectVersionInfo = exports.runVersionCommand = exports.printPermissionsSection = exports.printAgentIdentitySection = exports.printUserIdentitySection = exports.runStatusCommand = exports.LOOPBACK_REDIRECT_URIS = exports.projectUrlFromSlug = exports.runPostInstall = exports.runInteractiveSetup = exports.printPermissionsOnboardingHelp = exports.maybeAutoBootstrap = exports.isUserIdentityCached = exports.runPermissionsCommand = exports.oryNpx = exports.interactiveConfigPrompt = exports.promptForProjectUrl = exports.promptOnTty = exports.isTtyAvailable = exports.runWatchCommand = exports.printTraceTail = exports.printEnvHelp = exports.printLogTail = exports.printEnvironment = exports.printOryConfig = exports.runAgentCommand = exports.runConfigureCommand = void 0;
5
- exports.OtlpExporter = exports.summarizeToolOutput = exports.summarizeToolInput = exports.OryDenialError = exports.alertAttributes = exports.formatAlertSummary = exports.formatAlertMessage = exports.formatDenialSummary = exports.formatDenialMessage = exports.subjectLabel = exports.runWithUserSubject = exports.resolveUserSubject = exports.checkMcpPermission = exports.parseMcpToolGeneric = exports.parseGeminiMcpTool = exports.parseClaudeCodeMcpTool = exports.TOOL_EXECUTION_PHASES = exports.USER_FACING_PHASES = exports.HARNESS_LIFECYCLE_MAP = exports.isToolExecutionPhase = exports.isUserFacingPhase = exports.classifyLifecycle = exports.isInteractiveTool = exports.getInteractiveToolCatalog = exports.INTERACTIVE_TOOL_CATALOG = exports.getToolCatalog = exports.ALL_TOOLS = exports.KNOWN_HARNESSES = exports.HARNESS_TOOL_CATALOG = exports.gateToolCall = exports.applyPermissionMode = exports.checkAndDecide = exports.runRegistryCommand = exports.DEV_JAEGER_CONTAINER = exports.stopDevJaeger = exports.ensureDevJaeger = exports.runLocalCommand = exports.ORY_COMMAND_SLUGS = exports.ORY_COMMAND_SKILL_NAMES = exports.ORY_SKILL_NAMES = exports.removeSkillDirs = exports.writeSkillTree = exports.toSkillMarkdown = exports.commandToPlainMarkdown = exports.commandToFrontmatterMarkdown = exports.commandToToml = exports.commandToSkill = exports.renderOryCommands = exports.renderOrySkills = exports.runDevLauncher = void 0;
6
- exports.wrapTool = exports.registerSubagent = exports.complete = exports.gate = exports.sessionStart = exports.resolveNamespace = exports.parseKeyValueList = exports.otlpExporterFromEnv = void 0;
4
+ exports.collectVersionInfo = exports.runVersionCommand = exports.startServer = exports.launchWebDashboard = exports.launchWebInstaller = exports.canLaunchBrowser = exports.configureLocalStack = exports.configureAuditOnly = exports.provisionProjectApiKey = exports.grantToolPermissions = exports.provisionPermissions = exports.inspectPermissions = exports.runFullSetup = exports.saveNetworkConfig = exports.provisionOAuth2Client = exports.enableDcrAction = exports.getDcrState = exports.resolveProjectUrl = exports.createProject = exports.createWorkspace = exports.listWorkspaces = exports.isSignedIn = exports.ensureOryCli = exports.probePermissionsCoverage = exports.collectStatusReport = exports.printPermissionsSection = exports.printAgentIdentitySection = exports.printUserIdentitySection = exports.runStatusCommand = exports.LOOPBACK_REDIRECT_URIS = exports.projectUrlFromSlug = exports.runPostInstall = exports.runInteractiveSetup = exports.printPermissionsOnboardingHelp = exports.maybeAutoBootstrap = exports.isUserIdentityCached = exports.runPermissionsCommand = exports.oryNpx = exports.interactiveConfigPrompt = exports.promptForProjectUrl = exports.promptOnTty = exports.isTtyAvailable = exports.runWatchCommand = exports.printTraceTail = exports.printEnvHelp = exports.printLogTail = exports.printEnvironment = exports.printOryConfig = exports.runAgentCommand = exports.runConfigureCommand = void 0;
5
+ exports.getToolCatalog = exports.ALL_TOOLS = exports.KNOWN_HARNESSES = exports.HARNESS_TOOL_CATALOG = exports.gateToolCall = exports.applyPermissionMode = exports.checkAndDecide = exports.REGISTRY_URL = exports.runRegistryCommand = exports.DEV_JAEGER_CONTAINER = exports.stopDevJaeger = exports.ensureDevJaeger = exports.runLocalCommand = exports.ORY_COMMAND_SLUGS = exports.ORY_COMMAND_SKILL_NAMES = exports.ORY_SKILL_NAMES = exports.removeSkillDirs = exports.writeSkillTree = exports.toSkillMarkdown = exports.commandToPlainMarkdown = exports.commandToFrontmatterMarkdown = exports.commandToToml = exports.commandToSkill = exports.renderOryCommands = exports.renderOrySkills = exports.runDevLauncher = exports.unregisterPlugin = exports.registerPlugin = exports.removeMcpServer = exports.mergeMcpServer = exports.mcpServerEntry = exports.resolveMcpServerCommand = exports.emitDeferredNextSteps = exports.beginDeferNextSteps = exports.nextStepsSink = exports.printNextSteps = exports.printSetupHelp = exports.removeFlatHooks = exports.mergeFlatHooks = exports.flatHookEntry = exports.removeMatcherHooks = exports.mergeMatcherHooks = exports.matcherHookEntry = exports.pinHookToLocalRegistry = exports.resolveHookCommand = exports.isOryHookCommand = exports.writeJsonFile = exports.readJsonFile = exports.parseSetupArgs = exports.resolveBuildInfo = void 0;
6
+ exports.runDashboardCommand = exports.collectSystemServices = exports.wrapTool = exports.writeAgentDelegatesSubagent = exports.writeUserDelegatesAgent = exports.registerSubagent = exports.complete = exports.gate = exports.sessionStart = exports.resolveNamespace = exports.parseKeyValueList = exports.otlpExporterFromEnv = exports.OtlpExporter = exports.summarizeToolOutput = exports.summarizeToolInput = exports.OryDenialError = exports.alertAttributes = exports.formatAlertSummary = exports.formatAlertMessage = exports.formatDenialSummary = exports.formatDenialMessage = exports.subjectLabel = exports.runWithUserSubject = exports.resolveUserSubject = exports.checkMcpPermission = exports.parseMcpToolGeneric = exports.parseGeminiMcpTool = exports.parseClaudeCodeMcpTool = exports.TOOL_EXECUTION_PHASES = exports.USER_FACING_PHASES = exports.HARNESS_LIFECYCLE_MAP = exports.isToolExecutionPhase = exports.isUserFacingPhase = exports.classifyLifecycle = exports.isInteractiveTool = exports.getInteractiveToolCatalog = exports.INTERACTIVE_TOOL_CATALOG = void 0;
7
7
  var client_js_1 = require("./client.js");
8
8
  Object.defineProperty(exports, "OryAgentClient", { enumerable: true, get: function () { return client_js_1.OryAgentClient; } });
9
9
  var logger_js_1 = require("./logger.js");
@@ -93,6 +93,33 @@ Object.defineProperty(exports, "runStatusCommand", { enumerable: true, get: func
93
93
  Object.defineProperty(exports, "printUserIdentitySection", { enumerable: true, get: function () { return status_cli_js_1.printUserIdentitySection; } });
94
94
  Object.defineProperty(exports, "printAgentIdentitySection", { enumerable: true, get: function () { return status_cli_js_1.printAgentIdentitySection; } });
95
95
  Object.defineProperty(exports, "printPermissionsSection", { enumerable: true, get: function () { return status_cli_js_1.printPermissionsSection; } });
96
+ var status_data_js_1 = require("./status-data.js");
97
+ Object.defineProperty(exports, "collectStatusReport", { enumerable: true, get: function () { return status_data_js_1.collectStatusReport; } });
98
+ Object.defineProperty(exports, "probePermissionsCoverage", { enumerable: true, get: function () { return status_data_js_1.probePermissionsCoverage; } });
99
+ var setup_actions_js_1 = require("./setup-actions.js");
100
+ Object.defineProperty(exports, "ensureOryCli", { enumerable: true, get: function () { return setup_actions_js_1.ensureOryCli; } });
101
+ Object.defineProperty(exports, "isSignedIn", { enumerable: true, get: function () { return setup_actions_js_1.isSignedIn; } });
102
+ Object.defineProperty(exports, "listWorkspaces", { enumerable: true, get: function () { return setup_actions_js_1.listWorkspaces; } });
103
+ Object.defineProperty(exports, "createWorkspace", { enumerable: true, get: function () { return setup_actions_js_1.createWorkspace; } });
104
+ Object.defineProperty(exports, "createProject", { enumerable: true, get: function () { return setup_actions_js_1.createProject; } });
105
+ Object.defineProperty(exports, "resolveProjectUrl", { enumerable: true, get: function () { return setup_actions_js_1.resolveProjectUrl; } });
106
+ Object.defineProperty(exports, "getDcrState", { enumerable: true, get: function () { return setup_actions_js_1.getDcrState; } });
107
+ Object.defineProperty(exports, "enableDcrAction", { enumerable: true, get: function () { return setup_actions_js_1.enableDcrAction; } });
108
+ Object.defineProperty(exports, "provisionOAuth2Client", { enumerable: true, get: function () { return setup_actions_js_1.provisionOAuth2Client; } });
109
+ Object.defineProperty(exports, "saveNetworkConfig", { enumerable: true, get: function () { return setup_actions_js_1.saveNetworkConfig; } });
110
+ Object.defineProperty(exports, "runFullSetup", { enumerable: true, get: function () { return setup_actions_js_1.runFullSetup; } });
111
+ Object.defineProperty(exports, "inspectPermissions", { enumerable: true, get: function () { return setup_actions_js_1.inspectPermissions; } });
112
+ Object.defineProperty(exports, "provisionPermissions", { enumerable: true, get: function () { return setup_actions_js_1.provisionPermissions; } });
113
+ Object.defineProperty(exports, "grantToolPermissions", { enumerable: true, get: function () { return setup_actions_js_1.grantToolPermissions; } });
114
+ Object.defineProperty(exports, "provisionProjectApiKey", { enumerable: true, get: function () { return setup_actions_js_1.provisionProjectApiKey; } });
115
+ Object.defineProperty(exports, "configureAuditOnly", { enumerable: true, get: function () { return setup_actions_js_1.configureAuditOnly; } });
116
+ Object.defineProperty(exports, "configureLocalStack", { enumerable: true, get: function () { return setup_actions_js_1.configureLocalStack; } });
117
+ var launch_js_1 = require("./web/launch.js");
118
+ Object.defineProperty(exports, "canLaunchBrowser", { enumerable: true, get: function () { return launch_js_1.canLaunchBrowser; } });
119
+ Object.defineProperty(exports, "launchWebInstaller", { enumerable: true, get: function () { return launch_js_1.launchWebInstaller; } });
120
+ Object.defineProperty(exports, "launchWebDashboard", { enumerable: true, get: function () { return launch_js_1.launchWebDashboard; } });
121
+ var server_js_1 = require("./web/server.js");
122
+ Object.defineProperty(exports, "startServer", { enumerable: true, get: function () { return server_js_1.startServer; } });
96
123
  var version_cli_js_1 = require("./version-cli.js");
97
124
  Object.defineProperty(exports, "runVersionCommand", { enumerable: true, get: function () { return version_cli_js_1.runVersionCommand; } });
98
125
  Object.defineProperty(exports, "collectVersionInfo", { enumerable: true, get: function () { return version_cli_js_1.collectVersionInfo; } });
@@ -103,6 +130,7 @@ Object.defineProperty(exports, "readJsonFile", { enumerable: true, get: function
103
130
  Object.defineProperty(exports, "writeJsonFile", { enumerable: true, get: function () { return setup_js_1.writeJsonFile; } });
104
131
  Object.defineProperty(exports, "isOryHookCommand", { enumerable: true, get: function () { return setup_js_1.isOryHookCommand; } });
105
132
  Object.defineProperty(exports, "resolveHookCommand", { enumerable: true, get: function () { return setup_js_1.resolveHookCommand; } });
133
+ Object.defineProperty(exports, "pinHookToLocalRegistry", { enumerable: true, get: function () { return setup_js_1.pinHookToLocalRegistry; } });
106
134
  Object.defineProperty(exports, "matcherHookEntry", { enumerable: true, get: function () { return setup_js_1.matcherHookEntry; } });
107
135
  Object.defineProperty(exports, "mergeMatcherHooks", { enumerable: true, get: function () { return setup_js_1.mergeMatcherHooks; } });
108
136
  Object.defineProperty(exports, "removeMatcherHooks", { enumerable: true, get: function () { return setup_js_1.removeMatcherHooks; } });
@@ -142,6 +170,7 @@ Object.defineProperty(exports, "stopDevJaeger", { enumerable: true, get: functio
142
170
  Object.defineProperty(exports, "DEV_JAEGER_CONTAINER", { enumerable: true, get: function () { return index_js_1.DEV_JAEGER_CONTAINER; } });
143
171
  var index_js_2 = require("./registry/index.js");
144
172
  Object.defineProperty(exports, "runRegistryCommand", { enumerable: true, get: function () { return index_js_2.runRegistryCommand; } });
173
+ Object.defineProperty(exports, "REGISTRY_URL", { enumerable: true, get: function () { return index_js_2.REGISTRY_URL; } });
145
174
  var permissions_js_1 = require("./permissions.js");
146
175
  Object.defineProperty(exports, "checkAndDecide", { enumerable: true, get: function () { return permissions_js_1.checkAndDecide; } });
147
176
  Object.defineProperty(exports, "applyPermissionMode", { enumerable: true, get: function () { return permissions_js_1.applyPermissionMode; } });
@@ -190,4 +219,13 @@ Object.defineProperty(exports, "sessionStart", { enumerable: true, get: function
190
219
  Object.defineProperty(exports, "gate", { enumerable: true, get: function () { return adapters_js_1.gate; } });
191
220
  Object.defineProperty(exports, "complete", { enumerable: true, get: function () { return adapters_js_1.complete; } });
192
221
  Object.defineProperty(exports, "registerSubagent", { enumerable: true, get: function () { return adapters_js_1.registerSubagent; } });
222
+ Object.defineProperty(exports, "writeUserDelegatesAgent", { enumerable: true, get: function () { return adapters_js_1.writeUserDelegatesAgent; } });
223
+ Object.defineProperty(exports, "writeAgentDelegatesSubagent", { enumerable: true, get: function () { return adapters_js_1.writeAgentDelegatesSubagent; } });
193
224
  Object.defineProperty(exports, "wrapTool", { enumerable: true, get: function () { return adapters_js_1.wrapTool; } });
225
+ // ─── Dashboard (status surface of the web app) ──────────────────────────────
226
+ // Appended at EOF (outside the web-installer branch's edit region) so the two
227
+ // branches merge without an index.ts conflict.
228
+ var status_system_js_1 = require("./status-system.js");
229
+ Object.defineProperty(exports, "collectSystemServices", { enumerable: true, get: function () { return status_system_js_1.collectSystemServices; } });
230
+ var dashboard_cli_js_1 = require("./dashboard-cli.js");
231
+ Object.defineProperty(exports, "runDashboardCommand", { enumerable: true, get: function () { return dashboard_cli_js_1.runDashboardCommand; } });