runbios-mcp 0.2.16 → 0.2.17-dev.268

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.
package/README.md CHANGED
@@ -1,23 +1,34 @@
1
1
  # Run BiOS MCP server
2
2
 
3
3
  The MCP server exposes the authenticated Run BiOS training and model-serving
4
- control planes to MCP-compatible automation clients. This build registers **107
5
- tools** when every creation surface is open; `get_platform_guide` derives its
6
- inventory from what is actually registered so its count matches the wire
7
- (`tools/list`).
4
+ control planes to MCP-compatible automation clients. This build registers **122
5
+ tools** when every surface is open; `get_platform_guide` derives its inventory
6
+ from what is actually registered so its count matches the wire (`tools/list`).
8
7
 
9
8
  PRE-LAUNCH: while the coming-soon gates are on (the default — see
10
9
  `src/config.ts`), the three creation tools (`create_training_job`,
11
- `upload_dataset`, `import_huggingface_dataset`) are not registered, so the wire
12
- count is **104** and the guide lists only live tools. Read and lifecycle tools,
13
- including dataset mapping/revalidation/source/integration maintenance, remain
14
- available. A production organization holding the training beta grant opens both
15
- creation gates for its own MCP session. Local API-key mode resolves the bound
16
- organization automatically through key introspection, so `RUNBIOS_ORG_ID` is
17
- optional; otherwise set
10
+ `upload_dataset`, `import_huggingface_dataset`) are not registered, and read and
11
+ lifecycle tools, including dataset mapping/revalidation/source/integration
12
+ maintenance, remain available. A production organization holding the training
13
+ beta grant opens both creation gates for its own MCP session. Local API-key mode
14
+ resolves the bound organization automatically through key introspection, so
15
+ `RUNBIOS_ORG_ID` is optional; otherwise set
18
16
  `RUNBIOS_TRAINING_COMING_SOON=false` / `RUNBIOS_DATASETS_COMING_SOON=false` at
19
17
  launch and the registrations return.
20
18
 
19
+ DEVELOPMENT ONLY: the Conscious Loop is offered on the development environment
20
+ alone (owner decision, 2026-09-24). While `RUNBIOS_LOOP_COMING_SOON` is anything
21
+ but `false` (the default), none of its 56 `loop_` tools is registered — reads
22
+ included — and the platform guide does not mention the loop; no organization is
23
+ admitted early, so the training beta grant does not open it. The hosted server
24
+ opens it only in its development task definition. To use the loop tools from a
25
+ local client against `https://api-dev.runbios.ai`, add
26
+ `"RUNBIOS_LOOP_COMING_SOON": "false"` to the client's `env`; anywhere else the
27
+ API refuses them (`403 LOOP_COMING_SOON`) whatever this variable says.
28
+
29
+ So the wire count is 122 with everything open, 118 with training and datasets
30
+ gated, and 63 in staging and production, where all three gates are closed.
31
+
21
32
  Set these environment variables in the MCP client configuration:
22
33
 
23
34
  ```json
@@ -1,16 +1,27 @@
1
1
  /**
2
2
  * Environment capability gates for tool discovery.
3
3
  *
4
- * Some tool families depend on a backend that is provisioned per environment
5
- * (the Conscious Loop runs on dev only today). IAM authorizes those tools by
6
- * scope, not by environment, so without this filter an agent is offered tools
7
- * that answer "is not available in this environment" on every call.
4
+ * Some tool families depend on a backend that an environment may not run at
5
+ * all. IAM authorizes those tools by scope, not by environment, so without this
6
+ * filter an agent is offered tools that answer "is not available in this
7
+ * environment" on every call.
8
8
  *
9
- * The gateway answers any route of an absent capability with 503 and code
10
- * capability_unavailable, without proxying and before any role verdict. That
11
- * answer is a stable fact about the deployment, so it is cached. Anything else
12
- * (success, 401/403, a network error) leaves the family visible: the gateway
13
- * stays the authority on every call, and a blip must never hide real tools.
9
+ * This is the SECOND of two filters, and the weaker one. The first is the
10
+ * explicit launch gate (LaunchGates in src/config.ts, applied with
11
+ * withoutLaunchGatedTools): the Conscious Loop is offered on development only,
12
+ * and that is decided by the environment's own RUNBIOS_LOOP_COMING_SOON, never
13
+ * by a probe. A probe cannot decide it on its own, because the answer depends on
14
+ * the credential: a key without loop:read is refused by the gateway
15
+ * (403 INSUFFICIENT_SCOPE) before loop-service could say it is gated, and that
16
+ * refusal says nothing about the environment.
17
+ *
18
+ * What the probe still catches is an environment where the gate reads open but
19
+ * the backend is missing or gated anyway: the gateway's 503
20
+ * capability_unavailable, or loop-service's own 403 LOOP_COMING_SOON. Both are
21
+ * stable facts about the deployment, so they are cached. Anything else
22
+ * (success, another 401/403, a network error) leaves the family visible: the
23
+ * gateway stays the authority on every call, and a blip must never hide real
24
+ * tools.
14
25
  */
15
26
  import type { BiosClient } from "./api-client.js";
16
27
  export declare const CAPABILITY_CACHE_TTL_MS: number;
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAWlD,eAAO,MAAM,uBAAuB,QAAa,CAAC;AAGlD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAqBD,kFAAkF;AAClF,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAClB,GAAG,GAAE,MAAM,MAAiB,GAC3B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAOtB"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAWlD,eAAO,MAAM,uBAAuB,QAAa,CAAC;AAGlD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAuBD,kFAAkF;AAClF,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAClB,GAAG,GAAE,MAAM,MAAiB,GAC3B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAOtB"}
@@ -8,7 +8,9 @@ export function resetCapabilityCache() {
8
8
  }
9
9
  function isCapabilityAbsent(error) {
10
10
  const text = error instanceof Error ? error.message : String(error);
11
- return /capability_unavailable/.test(text) || /is not available in this environment/.test(text);
11
+ return /capability_unavailable/.test(text)
12
+ || /\bLOOP_COMING_SOON\b/.test(text)
13
+ || /is not available in this environment/.test(text);
12
14
  }
13
15
  async function familyAbsent(client, family, now) {
14
16
  const cached = cache.get(family.prefix);
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAqBA,MAAM,QAAQ,GAAuB;IACnC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE;CAClD,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,MAAM,CAAC;AAClD,MAAM,KAAK,GAAG,IAAI,GAAG,EAA2C,CAAC;AAEjE,MAAM,UAAU,oBAAoB;IAClC,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,MAAM,IAAI,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpE,OAAO,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sCAAsC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClG,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,MAAkB,EAAE,MAAwB,EAAE,GAAW;IACnF,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,EAAE,GAAG,uBAAuB;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7C,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAkB,EAClB,KAAkB,EAClB,MAAoB,IAAI,CAAC,GAAG;IAE5B,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAAE,SAAS;QACzE,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAAE,SAAS;QAC3D,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC;YAAE,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;gBAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAgCA,MAAM,QAAQ,GAAuB;IACnC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE;CAClD,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,MAAM,CAAC;AAClD,MAAM,KAAK,GAAG,IAAI,GAAG,EAA2C,CAAC;AAEjE,MAAM,UAAU,oBAAoB;IAClC,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,MAAM,IAAI,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpE,OAAO,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;WACrC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;WACjC,sCAAsC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,MAAkB,EAAE,MAAwB,EAAE,GAAW;IACnF,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,EAAE,GAAG,uBAAuB;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7C,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAkB,EAClB,KAAkB,EAClB,MAAoB,IAAI,CAAC,GAAG;IAE5B,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAAE,SAAS;QACzE,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAAE,SAAS;QAC3D,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC;YAAE,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;gBAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
package/dist/config.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare const DEFAULT_BASE_URL = "https://api.runbios.ai";
1
+ export declare const DEFAULT_BASE_URL = "https://api-dev.runbios.ai";
2
2
  type BaseUrlEnv = Partial<Pick<NodeJS.ProcessEnv, "RUNBIOS_BASE_URL" | "BIOS_BASE_URL">>;
3
3
  /**
4
4
  * RUNBIOS_* is the canonical environment prefix; the legacy BIOS_* names keep
@@ -18,14 +18,41 @@ export declare function resolveBaseURL(env?: BaseUrlEnv): string;
18
18
  *
19
19
  * Gated by default while pre-launch (an unset variable fails closed, never
20
20
  * open); set RUNBIOS_TRAINING_COMING_SOON=false / RUNBIOS_DATASETS_COMING_SOON=false
21
- * (legacy BIOS_* names still work) or flip the defaults here at launch.
21
+ * / RUNBIOS_LOOP_COMING_SOON=false (legacy BIOS_* names still work) or flip the
22
+ * defaults here at launch. The hosted server reads them from its task
23
+ * definition (scripts/deploy/ecs-service-contracts.json, usf-mcp), which opens
24
+ * all three in development only.
22
25
  */
23
26
  export interface LaunchGates {
24
27
  training: boolean;
25
28
  datasets: boolean;
29
+ /**
30
+ * The Conscious Loop, offered on development only (owner decision,
31
+ * 2026-09-24). Unlike the two above it hides the WHOLE family: every
32
+ * `loop_` tool is left unregistered and the guide says nothing about the
33
+ * loop, because nothing about it is offered where it is gated — not even a
34
+ * read. There is no per-organisation grant for it either: the training-beta
35
+ * grant resolved below opens training and datasets and never this.
36
+ * loop-service carries the same gate (LOOP_COMING_SOON, 403 on every
37
+ * customer route) as the authority.
38
+ */
39
+ loop: boolean;
26
40
  }
27
- type LaunchGateEnv = Partial<Pick<NodeJS.ProcessEnv, "RUNBIOS_TRAINING_COMING_SOON" | "BIOS_TRAINING_COMING_SOON" | "RUNBIOS_DATASETS_COMING_SOON" | "BIOS_DATASETS_COMING_SOON">>;
41
+ type LaunchGateEnv = Partial<Pick<NodeJS.ProcessEnv, "RUNBIOS_TRAINING_COMING_SOON" | "BIOS_TRAINING_COMING_SOON" | "RUNBIOS_DATASETS_COMING_SOON" | "BIOS_DATASETS_COMING_SOON" | "RUNBIOS_LOOP_COMING_SOON" | "BIOS_LOOP_COMING_SOON">>;
28
42
  export declare function resolveLaunchGates(env?: LaunchGateEnv): LaunchGates;
43
+ /** The tool-name prefix of the Conscious Loop family (see LaunchGates.loop). */
44
+ export declare const LOOP_TOOL_PREFIX = "loop_";
45
+ /**
46
+ * Removes every tool a closed launch gate hides from a session's authorized
47
+ * set, in place. The hosted MCP endpoint and the console assistant build their
48
+ * sessions from IAM's scope-derived tool list, which says nothing about the
49
+ * environment, so a scope that carries loop tools would otherwise offer them
50
+ * where the loop is not offered. This is decided by the environment alone —
51
+ * never by probing the service, whose answer depends on the credential's
52
+ * scopes (a key without loop:read is refused by the gateway before loop-service
53
+ * could say it is gated).
54
+ */
55
+ export declare function withoutLaunchGatedTools(tools: Set<string>, gates: LaunchGates): Set<string>;
29
56
  /**
30
57
  * Per-session grant resolution (docs/design-training-beta-access.md). The
31
58
  * environment gates above answer "is this surface open in this deployment?";
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gBAAgB,2BAA2B,CAAC;AAEzD,KAAK,UAAU,GAAG,OAAO,CACvB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,kBAAkB,GAAG,eAAe,CAAC,CAC9D,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,UAAwB,GAAG,MAAM,CAEpE;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,KAAK,aAAa,GAAG,OAAO,CAC1B,IAAI,CACF,MAAM,CAAC,UAAU,EACf,8BAA8B,GAC9B,2BAA2B,GAC3B,8BAA8B,GAC9B,2BAA2B,CAC9B,CACF,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,aAA2B,GAAG,WAAW,CAKhF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAC9C,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAEzC,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,OAAO,CAAC;IAAE,GAAG,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC9F,OAAO,CAAC,MAAM,CAAC,CASjB;AAKD,0EAA0E;AAC1E,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,EAClE,GAAG,GAAE,aAA2B,EAChC,GAAG,GAAE,MAAM,MAAiB,GAC3B,OAAO,CAAC,WAAW,CAAC,CAqCtB"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gBAAgB,+BAA+B,CAAC;AAE7D,KAAK,UAAU,GAAG,OAAO,CACvB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,kBAAkB,GAAG,eAAe,CAAC,CAC9D,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,UAAwB,GAAG,MAAM,CAEpE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB;;;;;;;;;OASG;IACH,IAAI,EAAE,OAAO,CAAC;CACf;AAED,KAAK,aAAa,GAAG,OAAO,CAC1B,IAAI,CACF,MAAM,CAAC,UAAU,EACf,8BAA8B,GAC9B,2BAA2B,GAC3B,8BAA8B,GAC9B,2BAA2B,GAC3B,0BAA0B,GAC1B,uBAAuB,CAC1B,CACF,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,aAA2B,GAAG,WAAW,CAMhF;AAED,gFAAgF;AAChF,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAExC;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAK3F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAC9C,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAEzC,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,OAAO,CAAC;IAAE,GAAG,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC9F,OAAO,CAAC,MAAM,CAAC,CASjB;AAKD,0EAA0E;AAC1E,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,EAClE,GAAG,GAAE,aAA2B,EAChC,GAAG,GAAE,MAAM,MAAiB,GAC3B,OAAO,CAAC,WAAW,CAAC,CAuCtB"}
package/dist/config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // api.runbios.ai DNS does not exist yet; planned cutover target once it does.
2
- export const DEFAULT_BASE_URL = "https://api.runbios.ai";
2
+ export const DEFAULT_BASE_URL = "https://api-dev.runbios.ai";
3
3
  /**
4
4
  * RUNBIOS_* is the canonical environment prefix; the legacy BIOS_* names keep
5
5
  * working so existing MCP client configs never break.
@@ -11,8 +11,29 @@ export function resolveLaunchGates(env = process.env) {
11
11
  return {
12
12
  training: (env.RUNBIOS_TRAINING_COMING_SOON ?? env.BIOS_TRAINING_COMING_SOON) !== "false",
13
13
  datasets: (env.RUNBIOS_DATASETS_COMING_SOON ?? env.BIOS_DATASETS_COMING_SOON) !== "false",
14
+ loop: (env.RUNBIOS_LOOP_COMING_SOON ?? env.BIOS_LOOP_COMING_SOON) !== "false",
14
15
  };
15
16
  }
17
+ /** The tool-name prefix of the Conscious Loop family (see LaunchGates.loop). */
18
+ export const LOOP_TOOL_PREFIX = "loop_";
19
+ /**
20
+ * Removes every tool a closed launch gate hides from a session's authorized
21
+ * set, in place. The hosted MCP endpoint and the console assistant build their
22
+ * sessions from IAM's scope-derived tool list, which says nothing about the
23
+ * environment, so a scope that carries loop tools would otherwise offer them
24
+ * where the loop is not offered. This is decided by the environment alone —
25
+ * never by probing the service, whose answer depends on the credential's
26
+ * scopes (a key without loop:read is refused by the gateway before loop-service
27
+ * could say it is gated).
28
+ */
29
+ export function withoutLaunchGatedTools(tools, gates) {
30
+ if (gates.loop) {
31
+ for (const name of [...tools])
32
+ if (name.startsWith(LOOP_TOOL_PREFIX))
33
+ tools.delete(name);
34
+ }
35
+ return tools;
36
+ }
16
37
  /**
17
38
  * Per-session grant resolution (docs/design-training-beta-access.md). The
18
39
  * environment gates above answer "is this surface open in this deployment?";
@@ -62,7 +83,9 @@ export async function sessionLaunchGates(orgId, getFeatures, env = process.env,
62
83
  const gates = resolveLaunchGates(env);
63
84
  if (!orgId || (!gates.training && !gates.datasets))
64
85
  return gates;
65
- const open = { training: false, datasets: false };
86
+ // The grant admits an organisation to training and datasets. It never opens
87
+ // the loop, which the environment alone decides.
88
+ const open = { ...gates, training: false, datasets: false };
66
89
  const cached = grantCache.get(orgId);
67
90
  if (cached && now() - cached.at < GRANT_CACHE_TTL_MS) {
68
91
  return cached.granted ? open : gates;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,CAAC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAMzD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAkB,OAAO,CAAC,GAAG;IAC1D,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,GAAG,CAAC,aAAa,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC7F,CAAC;AAgCD,MAAM,UAAU,kBAAkB,CAAC,MAAqB,OAAO,CAAC,GAAG;IACjE,OAAO;QACL,QAAQ,EAAE,CAAC,GAAG,CAAC,4BAA4B,IAAI,GAAG,CAAC,yBAAyB,CAAC,KAAK,OAAO;QACzF,QAAQ,EAAE,CAAC,GAAG,CAAC,4BAA4B,IAAI,GAAG,CAAC,yBAAyB,CAAC,KAAK,OAAO;KAC1F,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAC9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,eAAuB,EACvB,UAA+F;IAE/F,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,EAAE,CAAC;QACpC,OAAO,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,IAAI,QAAQ,EAAE,eAAe,IAAI,QAAQ,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACjG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAGD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAC;AAEjD,0EAA0E;AAC1E,MAAM,UAAU,eAAe;IAC7B,UAAU,CAAC,KAAK,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAa,EACb,WAAkE,EAClE,MAAqB,OAAO,CAAC,GAAG,EAChC,MAAoB,IAAI,CAAC,GAAG;IAE5B,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAEjE,MAAM,IAAI,GAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC/D,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,kBAAkB,EAAE,CAAC;QACrD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IACvC,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,QAAmD,CAAC;IACxD,IAAI,CAAC;QACH,kEAAkE;QAClE,qEAAqE;QACrE,uEAAuE;QACvE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAC7B,WAAW,EAAE;YACb,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC/B,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;YACzG,CAAC,CAAC;SACH,CAAC,CAAC;QACH,OAAO,GAAG,GAAG,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;QACnE,wEAAwE;QACxE,qDAAqD;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,oEAAoE;QACpE,oEAAoE;QACpE,wDAAwD;QACxD,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAED,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAC9C,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,14 @@ import { type AssistantModelMessage } from "../assistant/model.js";
4
4
  import type { AuditEmitter } from "./audit.js";
5
5
  import type { HostedConfig } from "./config.js";
6
6
  import type { McpStore } from "./store.js";
7
+ /**
8
+ * How the assistant may speak about the Conscious Loop in this session:
9
+ * offered — the environment offers it and this session holds loop tools;
10
+ * gated — the environment does not offer it (everywhere but development);
11
+ * no_access — offered here, but this member's role grants no loop tool.
12
+ */
13
+ export type LoopAvailability = "offered" | "gated" | "no_access";
14
+ export declare function loopAvailability(tools: ReadonlySet<string>): LoopAvailability;
7
15
  export declare function resolveSessionTools(client: BiosClient, orgId: string, workspaceId: string): Promise<Set<string>>;
8
16
  interface ResourceReference {
9
17
  kind: "dataset" | "training" | "deployment" | "checkpoint" | "integration" | "booking";
@@ -17,7 +25,24 @@ interface AssistantDeps {
17
25
  fetchImpl?: typeof fetch;
18
26
  }
19
27
  export declare function normalizeAssistantMessages(value: unknown): AssistantModelMessage[];
28
+ export declare function systemPrompt(toolsEnabled: boolean, loop: LoopAvailability): string;
20
29
  export declare function extractResourceReferences(toolName: string, text: string): ResourceReference[];
30
+ /** Called on SIGTERM: running segments stop at the next step boundary and hand off. */
31
+ export declare function beginAssistantDrain(): void;
32
+ /** Expiry of the caller's session JWT, read from its exp claim (the gateway still verifies it). */
33
+ export declare function sessionTokenExpiresAt(authorization: string): number | null;
34
+ /**
35
+ * Middle-out history compaction, front of the middle first (the same rule the
36
+ * serverless gateway applies in canon/compact.go): the first message (the task
37
+ * and any pasted document) is kept, the latest user message and everything after
38
+ * it are kept, and whole turns are dropped starting just after the head and
39
+ * moving forward until the history fits. An assistant message is always dropped
40
+ * together with the tool results that answer it, so the transcript stays valid.
41
+ */
42
+ export declare function compactHistory(messages: AssistantModelMessage[], limit: number): {
43
+ messages: AssistantModelMessage[];
44
+ dropped: number;
45
+ };
21
46
  export declare function createAssistantCapabilitiesHandler(deps: AssistantDeps): (req: Request, res: Response) => Promise<void>;
22
47
  export declare function createAssistantChatHandler(deps: AssistantDeps): (req: Request, res: Response) => Promise<void>;
23
48
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"assistant.d.ts","sourceRoot":"","sources":["../../src/http/assistant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAW9C,OAAO,EAIL,KAAK,qBAAqB,EAG3B,MAAM,uBAAuB,CAAC;AAY/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAyF3C,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAEtH;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,aAAa,GAAG,SAAS,CAAC;IACvF,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,aAAa;IACrB,KAAK,EAAE,QAAQ,CAAC;IAChB,GAAG,EAAE,YAAY,CAAC;IAClB,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAwFD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,EAAE,CAqClF;AAsND,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,CA2B7F;AA4GD,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,aAAa,IACxB,KAAK,OAAO,EAAE,KAAK,QAAQ,KAAG,OAAO,CAAC,IAAI,CAAC,CAoDxF;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,aAAa,IACxB,KAAK,OAAO,EAAE,KAAK,QAAQ,KAAG,OAAO,CAAC,IAAI,CAAC,CA6WhF"}
1
+ {"version":3,"file":"assistant.d.ts","sourceRoot":"","sources":["../../src/http/assistant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAW9C,OAAO,EAIL,KAAK,qBAAqB,EAG3B,MAAM,uBAAuB,CAAC;AAY/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA0G3C;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC;AAEjE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAG7E;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAEtH;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,aAAa,GAAG,SAAS,CAAC;IACvF,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,aAAa;IACrB,KAAK,EAAE,QAAQ,CAAC;IAChB,GAAG,EAAE,YAAY,CAAC;IAClB,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAwFD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,EAAE,CAqClF;AAsJD,wBAAgB,YAAY,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAuBlF;AA2DD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,CA2B7F;AAoGD,uFAAuF;AACvF,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED,mGAAmG;AACnG,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU1E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,qBAAqB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAwBvI;AAWD,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,aAAa,IACxB,KAAK,OAAO,EAAE,KAAK,QAAQ,KAAG,OAAO,CAAC,IAAI,CAAC,CAoDxF;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,aAAa,IACxB,KAAK,OAAO,EAAE,KAAK,QAAQ,KAAG,OAAO,CAAC,IAAI,CAAC,CA2ZhF"}