@tangle-network/agent-app 0.36.0 → 0.38.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.
@@ -3,6 +3,26 @@ export { StorageConfig } from '@tangle-network/sandbox';
3
3
  import { a as AppToolName, c as ToolHeaderNames } from '../auth-BlS9GWfL.js';
4
4
  import { b as AppToolContext } from '../types-2rOJo8Hc.js';
5
5
  import { Harness } from '../harness/index.js';
6
+ import { f as TangleExecutionEnvironment } from '../model-dF2h4xT9.js';
7
+
8
+ type Outcome<T> = {
9
+ succeeded: true;
10
+ value: T;
11
+ } | {
12
+ succeeded: false;
13
+ error: Error;
14
+ };
15
+
16
+ interface TerminalProxyIdentity {
17
+ userId: string;
18
+ workspaceId: string;
19
+ sandboxId: string;
20
+ }
21
+ declare function mintTerminalProxyToken(secret: string, identity: TerminalProxyIdentity, ttlMs?: number, now?: () => number): Promise<Outcome<{
22
+ token: string;
23
+ expiresAt: Date;
24
+ }>>;
25
+ declare function verifyTerminalProxyToken(secret: string, token: string, expected: TerminalProxyIdentity, now?: () => number): Promise<boolean>;
6
26
 
7
27
  interface WorkspaceSandboxInstanceLike {
8
28
  id: string;
@@ -42,15 +62,10 @@ interface WorkspaceSandboxManager<TBox extends WorkspaceSandboxInstanceLike, TEn
42
62
  declare function createWorkspaceSandboxManager<TClient, TBox extends WorkspaceSandboxInstanceLike, TEnsureOptions = void>(opts: WorkspaceSandboxManagerOptions<TClient, TBox, TEnsureOptions>): WorkspaceSandboxManager<TBox, TEnsureOptions>;
43
63
  interface SandboxTerminalTokenOptions {
44
64
  secret?: string;
45
- prefix?: string;
46
65
  expiresInMs?: number;
47
66
  now?: () => number;
48
67
  }
49
- interface SandboxTerminalTokenSubject {
50
- userId: string;
51
- workspaceId: string;
52
- sandboxId: string;
53
- }
68
+ type SandboxTerminalTokenSubject = TerminalProxyIdentity;
54
69
  interface SandboxTerminalTokenResult {
55
70
  token: string;
56
71
  expiresAt: Date;
@@ -70,7 +85,6 @@ interface WorkspaceSandboxConnectionHandlerOptions<TBox extends WorkspaceSandbox
70
85
  ensureWorkspaceSandbox: (workspaceId: string, userId: string) => Promise<TBox>;
71
86
  tokenSecret: string | (() => string | undefined);
72
87
  tokenExpiresInMs?: number;
73
- tokenPrefix?: string;
74
88
  proxyRuntimeUrl?: (args: {
75
89
  request: Request;
76
90
  workspaceId: string;
@@ -92,6 +106,7 @@ interface SandboxApiCredentials {
92
106
  }
93
107
  interface SandboxRuntimeConnection {
94
108
  runtimeUrl: string;
109
+ /** Server-side sidecar bearer. Must authorize terminal routes; never expose it to browser code. */
95
110
  authToken?: string;
96
111
  }
97
112
  interface WorkspaceSandboxRuntimeProxyHandlerOptions {
@@ -115,7 +130,6 @@ interface WorkspaceSandboxRuntimeProxyHandlerOptions {
115
130
  sandboxId: string;
116
131
  }) => Promise<SandboxRuntimeConnection | null | undefined>;
117
132
  tokenSecret: string | (() => string | undefined);
118
- tokenPrefix?: string;
119
133
  fetch?: typeof fetch;
120
134
  forwardHeaders?: string[];
121
135
  }
@@ -165,7 +179,6 @@ interface WorkspaceSandboxTerminalUpgradeHandlerOptions {
165
179
  sandboxId: string;
166
180
  }) => Promise<SandboxRuntimeConnection | null | undefined>;
167
181
  tokenSecret: string | (() => string | undefined);
168
- tokenPrefix?: string;
169
182
  fetch?: typeof fetch;
170
183
  }
171
184
  /**
@@ -186,17 +199,57 @@ declare function bearerToken(value: string | null): string | null;
186
199
  declare function bearerSubprotocolToken(value: string | null): string | null;
187
200
  declare function terminalTokenFromRequest(headers: Headers): string | null;
188
201
 
189
- type Outcome<T> = {
190
- succeeded: true;
191
- value: T;
192
- } | {
193
- succeeded: false;
194
- error: Error;
195
- };
196
202
  interface SandboxClientCredentials {
197
203
  apiKey: string;
198
204
  baseUrl: string;
199
205
  }
206
+ /**
207
+ * Sandbox credential policy reuses the canonical execution-environment union
208
+ * (development/test/staging/production) so env classification stays in one place
209
+ * (see resolveTangleExecutionEnvironment in runtime/model).
210
+ */
211
+ type SandboxCredentialEnvironment = TangleExecutionEnvironment;
212
+ interface ResolveSandboxClientCredentialsOptions {
213
+ /**
214
+ * Environment object to read from. Defaults to process.env when available.
215
+ */
216
+ env?: Record<string, string | undefined>;
217
+ /**
218
+ * Explicit environment classification. Defaults to APP_ENV/NODE_ENV derived
219
+ * behavior: local/development/test use direct env credentials; staging/prod
220
+ * require the provision callback unless allowDirectEnvCredentials opts in.
221
+ */
222
+ environment?: SandboxCredentialEnvironment;
223
+ /**
224
+ * Env names that may carry a sandbox-compatible bearer. The first non-empty
225
+ * value wins when direct env credentials are allowed.
226
+ */
227
+ directKeyNames?: readonly string[];
228
+ /**
229
+ * Env names that may carry the sandbox gateway URL. The first non-empty value
230
+ * wins, then defaultBaseUrl.
231
+ */
232
+ baseUrlNames?: readonly string[];
233
+ /**
234
+ * Base URL used when none of baseUrlNames are present.
235
+ */
236
+ defaultBaseUrl?: string;
237
+ /**
238
+ * Whether direct env credentials are allowed for this environment. Defaults
239
+ * to true in development/test and false in staging/production.
240
+ */
241
+ allowDirectEnvCredentials?: boolean | ((environment: SandboxCredentialEnvironment) => boolean);
242
+ /**
243
+ * Product-owned provision path, usually minting a per-user sandbox key from a
244
+ * linked platform account. Called before direct env credentials in
245
+ * staging/production and after direct env credentials in development/test.
246
+ */
247
+ provision?: (context: {
248
+ environment: SandboxCredentialEnvironment;
249
+ env: Record<string, string | undefined>;
250
+ }) => SandboxClientCredentials | null | undefined | Promise<SandboxClientCredentials | null | undefined>;
251
+ }
252
+ declare function resolveSandboxClientCredentials(options?: ResolveSandboxClientCredentialsOptions): Promise<SandboxClientCredentials>;
200
253
  interface SandboxResourceConfig {
201
254
  image: string;
202
255
  cpuCores: number;
@@ -256,6 +309,7 @@ interface SandboxRuntimeConfig {
256
309
  childKeyMint?: (scope: SandboxScope) => Promise<Outcome<string>>;
257
310
  bootstrap?: (box: SandboxInstance, scope: SandboxScope) => Promise<Outcome<void>>;
258
311
  livenessProbe?: LivenessProbeConfig;
312
+ webTerminalEnabled?: boolean;
259
313
  resumeStopped?: boolean;
260
314
  backendModelAtCreate?: boolean;
261
315
  deferProfileFiles?: boolean;
@@ -282,6 +336,27 @@ interface EnsureWorkspaceSandboxOptions {
282
336
  harness: Harness;
283
337
  forceNew?: boolean;
284
338
  }
339
+ interface SandboxToolSpec {
340
+ name: string;
341
+ content: string;
342
+ executable?: boolean;
343
+ }
344
+ interface SandboxToolPathOptions {
345
+ appName: string;
346
+ baseDir?: string;
347
+ binDir?: string;
348
+ }
349
+ interface BuildSandboxToolFileMountsOptions extends SandboxToolPathOptions {
350
+ tools: readonly SandboxToolSpec[];
351
+ }
352
+ declare function sandboxToolRootDir(options: SandboxToolPathOptions): string;
353
+ declare function sandboxToolBinDir(options: SandboxToolPathOptions): string;
354
+ declare function sandboxToolPath(options: SandboxToolPathOptions & {
355
+ toolName: string;
356
+ }): string;
357
+ declare function buildSandboxToolFileMounts(options: BuildSandboxToolFileMountsOptions): AgentProfileFileMount[];
358
+ declare function buildSandboxToolPathSetupScript(options: SandboxToolPathOptions): string;
359
+ declare function runSandboxToolPathSetup(box: SandboxInstance, options: SandboxToolPathOptions): Promise<Outcome<void>>;
285
360
  declare function splitDeferredProfileFiles(profile: AgentProfile): {
286
361
  leanProfile: AgentProfile;
287
362
  deferredFiles: AgentProfileFileMount[];
@@ -361,16 +436,6 @@ declare function mintSandboxScopedToken(box: SandboxInstance, options: {
361
436
  declare function driveSandboxTurn(shell: SandboxRuntimeConfig, box: SandboxInstance, message: string, options: StreamSandboxPromptOptions & {
362
437
  sessionId: string;
363
438
  }): Promise<Outcome<PromptResult>>;
364
- interface TerminalProxyIdentity {
365
- userId: string;
366
- workspaceId: string;
367
- sandboxId: string;
368
- }
369
- declare function mintTerminalProxyToken(secret: string, identity: TerminalProxyIdentity, ttlMs?: number): Promise<Outcome<{
370
- token: string;
371
- expiresAt: Date;
372
- }>>;
373
- declare function verifyTerminalProxyToken(secret: string, token: string, expected: TerminalProxyIdentity): Promise<boolean>;
374
439
  type SandboxStepTransition = {
375
440
  kind: 'step-start';
376
441
  } | {
@@ -382,4 +447,4 @@ declare function classifySeveredStream(event: unknown): SandboxStepTransition |
382
447
  declare function isTerminalPromptEvent(event: unknown): boolean;
383
448
  declare function detectInteractiveQuestion(event: unknown): string | null;
384
449
 
385
- export { type AppToolDescriptor, type AuthenticatedSandboxUser, type BuildAppToolMcpServersOptions, DEFAULT_SANDBOX_RESOURCES, type EnsureWorkspaceSandboxOptions, type LivenessProbeConfig, type MemberSyncSeam, type Outcome, type ProfileComposeOptions, type ProviderResolutionConfig, type ResolvedModel, type SandboxApiCredentials, type SandboxBuildContext, type SandboxClientCredentials, type SandboxPermissionLevel, type SandboxResourceConfig, type SandboxRestoreSpec, type SandboxRuntimeConfig, type SandboxRuntimeConnection, type SandboxScope, type SandboxStepTransition, type SandboxTerminalTokenOptions, type SandboxTerminalTokenResult, type SandboxTerminalTokenSubject, type SandboxTerminalWsMatch, type ScopedTokenResult, type SecretStore, type StreamSandboxPromptOptions, type TerminalProxyIdentity, type WorkspaceSandboxConnectionArgs, type WorkspaceSandboxConnectionHandlerOptions, type WorkspaceSandboxEnsureContext, type WorkspaceSandboxInstanceLike, type WorkspaceSandboxManager, type WorkspaceSandboxManagerOptions, type WorkspaceSandboxRuntimeProxyArgs, type WorkspaceSandboxRuntimeProxyHandlerOptions, type WorkspaceSandboxTerminalUpgradeHandlerOptions, attachReasoningEffort, bearerSubprotocolToken, bearerToken, buildAppToolMcpServers, buildSandboxRuntimeProxyHeaders, classifySeveredStream, createSandboxTerminalToken, createWorkspaceSandboxConnectionHandler, createWorkspaceSandboxManager, createWorkspaceSandboxRuntimeProxyHandler, createWorkspaceSandboxTerminalUpgradeHandler, deleteSecret, detectInteractiveQuestion, driveSandboxTurn, encodeSandboxRuntimePath, ensureWorkspaceSandbox, flattenHistory, getClient, isSandboxTerminalWsUpgrade, isTerminalPromptEvent, matchSandboxTerminalWsPath, mergeExtraMcp, mintSandboxScopedToken, mintTerminalProxyToken, readSecret, resetClientCache, resolveModel, runSandboxPrompt, secretStoreFromClient, splitDeferredProfileFiles, storeSecret, streamSandboxPrompt, syncSandboxMemberAdd, syncSandboxMemberRemove, syncSandboxMemberRole, terminalTokenFromRequest, verifySandboxTerminalToken, verifyTerminalProxyToken, writeProfileFilesToBox };
450
+ export { type AppToolDescriptor, type AuthenticatedSandboxUser, type BuildAppToolMcpServersOptions, type BuildSandboxToolFileMountsOptions, DEFAULT_SANDBOX_RESOURCES, type EnsureWorkspaceSandboxOptions, type LivenessProbeConfig, type MemberSyncSeam, type Outcome, type ProfileComposeOptions, type ProviderResolutionConfig, type ResolveSandboxClientCredentialsOptions, type ResolvedModel, type SandboxApiCredentials, type SandboxBuildContext, type SandboxClientCredentials, type SandboxCredentialEnvironment, type SandboxPermissionLevel, type SandboxResourceConfig, type SandboxRestoreSpec, type SandboxRuntimeConfig, type SandboxRuntimeConnection, type SandboxScope, type SandboxStepTransition, type SandboxTerminalTokenOptions, type SandboxTerminalTokenResult, type SandboxTerminalTokenSubject, type SandboxTerminalWsMatch, type SandboxToolPathOptions, type SandboxToolSpec, type ScopedTokenResult, type SecretStore, type StreamSandboxPromptOptions, type TerminalProxyIdentity, type WorkspaceSandboxConnectionArgs, type WorkspaceSandboxConnectionHandlerOptions, type WorkspaceSandboxEnsureContext, type WorkspaceSandboxInstanceLike, type WorkspaceSandboxManager, type WorkspaceSandboxManagerOptions, type WorkspaceSandboxRuntimeProxyArgs, type WorkspaceSandboxRuntimeProxyHandlerOptions, type WorkspaceSandboxTerminalUpgradeHandlerOptions, attachReasoningEffort, bearerSubprotocolToken, bearerToken, buildAppToolMcpServers, buildSandboxRuntimeProxyHeaders, buildSandboxToolFileMounts, buildSandboxToolPathSetupScript, classifySeveredStream, createSandboxTerminalToken, createWorkspaceSandboxConnectionHandler, createWorkspaceSandboxManager, createWorkspaceSandboxRuntimeProxyHandler, createWorkspaceSandboxTerminalUpgradeHandler, deleteSecret, detectInteractiveQuestion, driveSandboxTurn, encodeSandboxRuntimePath, ensureWorkspaceSandbox, flattenHistory, getClient, isSandboxTerminalWsUpgrade, isTerminalPromptEvent, matchSandboxTerminalWsPath, mergeExtraMcp, mintSandboxScopedToken, mintTerminalProxyToken, readSecret, resetClientCache, resolveModel, resolveSandboxClientCredentials, runSandboxPrompt, runSandboxToolPathSetup, sandboxToolBinDir, sandboxToolPath, sandboxToolRootDir, secretStoreFromClient, splitDeferredProfileFiles, storeSecret, streamSandboxPrompt, syncSandboxMemberAdd, syncSandboxMemberRemove, syncSandboxMemberRole, terminalTokenFromRequest, verifySandboxTerminalToken, verifyTerminalProxyToken, writeProfileFilesToBox };
@@ -5,6 +5,8 @@ import {
5
5
  bearerToken,
6
6
  buildAppToolMcpServers,
7
7
  buildSandboxRuntimeProxyHeaders,
8
+ buildSandboxToolFileMounts,
9
+ buildSandboxToolPathSetupScript,
8
10
  classifySeveredStream,
9
11
  createSandboxTerminalToken,
10
12
  createWorkspaceSandboxConnectionHandler,
@@ -27,7 +29,12 @@ import {
27
29
  readSecret,
28
30
  resetClientCache,
29
31
  resolveModel,
32
+ resolveSandboxClientCredentials,
30
33
  runSandboxPrompt,
34
+ runSandboxToolPathSetup,
35
+ sandboxToolBinDir,
36
+ sandboxToolPath,
37
+ sandboxToolRootDir,
31
38
  secretStoreFromClient,
32
39
  splitDeferredProfileFiles,
33
40
  storeSecret,
@@ -39,10 +46,11 @@ import {
39
46
  verifySandboxTerminalToken,
40
47
  verifyTerminalProxyToken,
41
48
  writeProfileFilesToBox
42
- } from "../chunk-GZGF3JWQ.js";
49
+ } from "../chunk-MJ3RUHD4.js";
43
50
  import "../chunk-5VXPDXZJ.js";
44
- import "../chunk-MH6AVXQ7.js";
51
+ import "../chunk-VT5DI6GL.js";
45
52
  import "../chunk-A76ZHWNF.js";
53
+ import "../chunk-7W5XSTUF.js";
46
54
  import "../chunk-JZZ6AWF4.js";
47
55
  export {
48
56
  DEFAULT_SANDBOX_RESOURCES,
@@ -51,6 +59,8 @@ export {
51
59
  bearerToken,
52
60
  buildAppToolMcpServers,
53
61
  buildSandboxRuntimeProxyHeaders,
62
+ buildSandboxToolFileMounts,
63
+ buildSandboxToolPathSetupScript,
54
64
  classifySeveredStream,
55
65
  createSandboxTerminalToken,
56
66
  createWorkspaceSandboxConnectionHandler,
@@ -73,7 +83,12 @@ export {
73
83
  readSecret,
74
84
  resetClientCache,
75
85
  resolveModel,
86
+ resolveSandboxClientCredentials,
76
87
  runSandboxPrompt,
88
+ runSandboxToolPathSetup,
89
+ sandboxToolBinDir,
90
+ sandboxToolPath,
91
+ sandboxToolRootDir,
77
92
  secretStoreFromClient,
78
93
  splitDeferredProfileFiles,
79
94
  storeSecret,
@@ -963,7 +963,8 @@ function GenerationDetail({
963
963
  }) {
964
964
  const cfg = typeConfigFor(generation.type);
965
965
  const Icon = cfg.icon;
966
- const href = vaultHref ? vaultHref(generationVaultPath(generation)) : null;
966
+ const vaultPath = generationVaultPath(generation);
967
+ const href = vaultHref && vaultPath ? vaultHref(vaultPath) : null;
967
968
  return /* @__PURE__ */ jsxs12("div", { className: "space-y-4", children: [
968
969
  /* @__PURE__ */ jsx13("div", { className: "overflow-hidden rounded-lg bg-muted/50", children: generation.type === "image" && generation.result ? /* @__PURE__ */ jsx13("img", { src: generation.result, alt: generation.prompt, className: "max-h-[420px] w-full object-contain" }) : (generation.type === "video" || generation.type === "avatar") && generation.result ? /* @__PURE__ */ jsx13("video", { src: generation.result, controls: true, className: "max-h-[420px] w-full" }) : generation.type === "speech" && generation.result ? /* @__PURE__ */ jsx13("div", { className: "p-6", children: /* @__PURE__ */ jsx13("audio", { src: generation.result, controls: true, className: "w-full" }) }) : /* @__PURE__ */ jsx13("div", { className: "flex h-32 items-center justify-center", children: /* @__PURE__ */ jsx13(Icon, { className: "h-8 w-8 text-muted-foreground/20" }) }) }),
969
970
  /* @__PURE__ */ jsxs12("div", { className: "flex flex-wrap items-center gap-2", children: [