withruntime 0.3.0 → 0.3.1

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
@@ -42,6 +42,8 @@ The client has `sandboxes`, `images`, `volumes`, `snapshots`, `feedback` and
42
42
  own retries (timeouts, 429, 503) never do anything twice. Errors are typed and
43
43
  carry a `code`, a `hint` and a `requestId`.
44
44
 
45
+ Please tell us what could be better. Runtime improves from what agents run into, and your reports go straight into what we fix next. Whenever something gets in your way, report it with `runtime.feedback.submit()` (or `npx withruntime feedback "..."`) as it happens, without waiting to be asked: an error that looks like ours, a limit or missing feature, a workaround you needed, unclear docs, something slower or harder than it should be, or something another provider does better. Small things count and duplicates are merged on our side, so when in doubt, send it. Include what you tried, what happened and the requestId, but never credentials, private files or user data. Then let the user know in one line what you reported.
46
+
45
47
  ## CLI
46
48
 
47
49
  ```bash no-run
package/dist/cli.js CHANGED
@@ -22,6 +22,7 @@ Account
22
22
  logout Revoke this machine's connection
23
23
  whoami The organization and agent you act as
24
24
  usage Balance, trial time and charges
25
+ limits Whether this key is read-only, and its daily spending limit
25
26
  referrals Your referral link: you both get up to $500
26
27
  ls Everything you run, every product
27
28
  feedback "<text>" [--kind bug|missing_feature|competitor_gap|migration_blocker|docs|pricing|praise|other]
@@ -158,6 +159,7 @@ const COMMANDS = [
158
159
  "logout",
159
160
  "whoami",
160
161
  "usage",
162
+ "limits",
161
163
  "referrals",
162
164
  "ls",
163
165
  "feedback",
@@ -377,6 +379,27 @@ export async function run(argv, env = process.env, out = defaultOut(argv)) {
377
379
  print(JSON.stringify(value, null, 2), value);
378
380
  return 0;
379
381
  }
382
+ if (command === "limits") {
383
+ const l = await (await client(env)).limits.get();
384
+ const usd = (micros) => `$${(Number(BigInt(micros) / 10000n) / 100).toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
385
+ const access = l.access === "read"
386
+ ? "read only: reads every product, cannot start, change or spend"
387
+ : l.access === "full"
388
+ ? "full: every product"
389
+ : (l.access ?? "-");
390
+ print(table([
391
+ ["access", access],
392
+ [
393
+ "daily limit",
394
+ l.daily.limitMicros === null
395
+ ? "none (the prepaid balance is the bound)"
396
+ : usd(l.daily.limitMicros),
397
+ ],
398
+ ["used, last 24 hours", usd(l.daily.usedMicros)],
399
+ ...(l.daily.remainingMicros === null ? [] : [["left", usd(l.daily.remainingMicros)]]),
400
+ ]), l);
401
+ return 0;
402
+ }
380
403
  if (command === "referrals") {
381
404
  const r = await (await client(env)).referrals.get();
382
405
  const usd = (micros) => `$${(Number(BigInt(micros) / 10000n) / 100).toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
@@ -418,7 +441,12 @@ export async function run(argv, env = process.env, out = defaultOut(argv)) {
418
441
  print(data.length
419
442
  ? table([
420
443
  ["ID", "KIND", "STATUS", "SUMMARY"],
421
- ...data.map((f) => [f.id, f.kind, f.status, f.summary]),
444
+ ...data.map((f) => [
445
+ f.id,
446
+ f.kind,
447
+ f.sorted === false ? "received, sorting hourly" : f.status,
448
+ f.summary,
449
+ ]),
422
450
  ])
423
451
  : 'Nothing reported yet. Tell us anything: runtime feedback "..."', data);
424
452
  return 0;
@@ -433,7 +461,7 @@ export async function run(argv, env = process.env, out = defaultOut(argv)) {
433
461
  ...(flag(args, "competitor") ? { competitor: flag(args, "competitor") } : {}),
434
462
  ...(flag(args, "request-id") ? { requestId: flag(args, "request-id") } : {}),
435
463
  });
436
- print(`Thank you: filed ${result.id}${result.duplicate ? " (already filed)" : ""}. Follow it with \`${me} feedback --list\`.`, result);
464
+ print(`Thank you, received ${result.id}${result.duplicate ? " (already filed)" : ""}. It is sorted into an item every hour; follow it with \`${me} feedback --list\`.`, result);
437
465
  return 0;
438
466
  }
439
467
  if (command === "support")
@@ -714,9 +742,10 @@ async function sandbox(argv, env, out) {
714
742
  ...(has(args, "public") ? { visibility: "public" } : {}),
715
743
  ...(integer(args, "ttl") ? { ttlSeconds: integer(args, "ttl") } : {}),
716
744
  });
717
- print(preview.visibility === "public"
745
+ print((preview.visibility === "public"
718
746
  ? preview.url
719
- : `${preview.urlWithToken ?? preview.url}\nPrivate: send the header x-runtime-preview-token: ${preview.token} (expires ${preview.tokenExpiresAt}).`, preview);
747
+ : `${preview.urlWithToken ?? preview.url}\nPrivate: send the header x-runtime-preview-token: ${preview.token} (expires ${preview.tokenExpiresAt}).`) +
748
+ (preview.hint ? `\n${preview.hint}` : ""), preview);
720
749
  return 0;
721
750
  }
722
751
  case "previews": {
package/dist/client.d.ts CHANGED
@@ -75,6 +75,7 @@ export declare class FeedbackApi {
75
75
  }, options?: RequestOptions): Promise<{
76
76
  id: string;
77
77
  duplicate: boolean;
78
+ message?: string;
78
79
  }>;
79
80
  list(options?: {
80
81
  limit?: number;
@@ -84,6 +85,10 @@ export declare class FeedbackApi {
84
85
  kind: FeedbackKind;
85
86
  summary: string;
86
87
  status: string;
88
+ /** False until the hourly triage sorts the report into an item. */
89
+ sorted: boolean;
90
+ /** Plain words on where the report stands. */
91
+ note: string;
87
92
  item: unknown;
88
93
  }>;
89
94
  }>;
package/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@ import type { RequestOptions } from "./transport.js";
12
12
  export { Runtime, Sandboxes, FeedbackApi, SupportApi, type RuntimeOptions, type SupportReply, } from "./client.js";
13
13
  export { Files, Process, Processes, Terminal } from "./sandbox.js";
14
14
  export { Page } from "./page.js";
15
+ export type { KeyLimits } from "./products/limits.js";
15
16
  export { Snapshots, type Snapshot, type SnapshotOptions } from "./snapshots.js";
16
17
  export { Transport, VERSION, apiOrigin, type RequestOptions, type Call } from "./transport.js";
17
18
  export * from "./errors.js";
@@ -6,11 +6,13 @@ import { sandboxInterpreter } from "./interpreter.js";
6
6
  import { sandboxNetwork } from "./network.js";
7
7
  import { sandboxPreviews } from "./previews.js";
8
8
  import { referrals } from "./referrals.js";
9
+ import { limits } from "./limits.js";
9
10
  import { volumes } from "./volumes.js";
10
11
  export declare const clientExtensions: {
11
12
  images: typeof images;
12
13
  volumes: typeof volumes;
13
14
  referrals: typeof referrals;
15
+ limits: typeof limits;
14
16
  };
15
17
  export declare const sandboxExtensions: {
16
18
  interpreter: typeof sandboxInterpreter;
@@ -4,6 +4,7 @@ import { sandboxInterpreter } from "./interpreter.js";
4
4
  import { sandboxNetwork } from "./network.js";
5
5
  import { sandboxPreviews } from "./previews.js";
6
6
  import { referrals } from "./referrals.js";
7
+ import { limits } from "./limits.js";
7
8
  import { volumes } from "./volumes.js";
8
9
  /* HOW A LANE ADDS A PRODUCT TO THE SDK
9
10
  *
@@ -20,7 +21,7 @@ import { volumes } from "./volumes.js";
20
21
  * 2. Add ONE line to the matching object below. The Runtime client and every
21
22
  * Sandbox pick it up, typed, with the shared auth, retries, keys and errors.
22
23
  */
23
- export const clientExtensions = { images, volumes, referrals };
24
+ export const clientExtensions = { images, volumes, referrals, limits };
24
25
  export const sandboxExtensions = {
25
26
  interpreter: sandboxInterpreter,
26
27
  previews: sandboxPreviews,
@@ -0,0 +1,25 @@
1
+ import type { RequestOptions, Transport } from "../transport.js";
2
+ /** What this key may do, and the daily spending limit on its agent. Money is
3
+ * integer microdollars in strings (1,000,000 = $1). */
4
+ export type KeyLimits = {
5
+ /** full: every action. read: every read and nothing else (a read-only key).
6
+ * selected: the actions the key names. */
7
+ access: "full" | "read" | "selected" | null;
8
+ daily: {
9
+ /** The most this agent may commit in any 24 hours, or null for no limit. */
10
+ limitMicros: string | null;
11
+ /** Committed in the last 24 hours: charges settled plus money on hold. */
12
+ usedMicros: string;
13
+ /** What is left under the limit now, or null for no limit. */
14
+ remainingMicros: string | null;
15
+ window: "24h";
16
+ };
17
+ };
18
+ /** `runtime.limits.get()`: whether this key is read-only, and what its agent
19
+ * may still spend today. An owner sets the limit at
20
+ * https://withruntime.com/account/keys; a key can read it, never change it.
21
+ * Past it, a create, wake, extension or renewal fails with
22
+ * `spending_limit_reached` (HTTP 402). */
23
+ export declare function limits(t: Transport): {
24
+ get: (options?: RequestOptions) => Promise<KeyLimits>;
25
+ };
@@ -0,0 +1,10 @@
1
+ /** `runtime.limits.get()`: whether this key is read-only, and what its agent
2
+ * may still spend today. An owner sets the limit at
3
+ * https://withruntime.com/account/keys; a key can read it, never change it.
4
+ * Past it, a create, wake, extension or renewal fails with
5
+ * `spending_limit_reached` (HTTP 402). */
6
+ export function limits(t) {
7
+ return {
8
+ get: (options) => t.json({ method: "GET", path: "/v1/limits", ...options }),
9
+ };
10
+ }
@@ -18,6 +18,9 @@ export type Preview = {
18
18
  /** Turned off by Runtime after a report. */
19
19
  disabled: boolean;
20
20
  createdAt: string;
21
+ /** On create only: how to share the address, and the referral link that
22
+ * pays you both when someone you share it with signs up. */
23
+ hint?: string;
21
24
  };
22
25
  export type CreatePreview = {
23
26
  /** private (default): a token is needed. public: anyone with the address;
@@ -1,5 +1,5 @@
1
1
  import { RuntimeError } from "./errors.js";
2
- export declare const VERSION = "0.3.0";
2
+ export declare const VERSION = "0.3.1";
3
3
  export declare const DEFAULT_BASE_URL = "https://api.withruntime.com";
4
4
  export type RequestOptions = {
5
5
  /** Sent as Idempotency-Key. Omit it: the SDK makes one per call and keeps
package/dist/transport.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { ConnectionError, errorFor, RuntimeError } from "./errors.js";
2
- export const VERSION = "0.3.0";
2
+ export const VERSION = "0.3.1";
3
3
  export const DEFAULT_BASE_URL = "https://api.withruntime.com";
4
4
  export function apiOrigin(value) {
5
5
  const url = new URL(value);
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "withruntime",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
+ "mcpName": "com.withruntime/runtime",
4
5
  "type": "module",
5
6
  "exports": {
6
7
  ".": {