@sapiom/tools 0.1.3 → 0.2.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 (46) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +2 -1
  3. package/dist/cjs/client.d.ts +8 -0
  4. package/dist/cjs/client.d.ts.map +1 -1
  5. package/dist/cjs/client.js +41 -0
  6. package/dist/cjs/client.js.map +1 -1
  7. package/dist/cjs/file-storage/errors.d.ts +16 -0
  8. package/dist/cjs/file-storage/errors.d.ts.map +1 -0
  9. package/dist/cjs/file-storage/errors.js +36 -0
  10. package/dist/cjs/file-storage/errors.js.map +1 -0
  11. package/dist/cjs/file-storage/index.d.ts +116 -0
  12. package/dist/cjs/file-storage/index.d.ts.map +1 -0
  13. package/dist/cjs/file-storage/index.js +136 -0
  14. package/dist/cjs/file-storage/index.js.map +1 -0
  15. package/dist/cjs/index.d.ts +4 -2
  16. package/dist/cjs/index.d.ts.map +1 -1
  17. package/dist/cjs/index.js +6 -3
  18. package/dist/cjs/index.js.map +1 -1
  19. package/dist/cjs/stub/index.d.ts +19 -0
  20. package/dist/cjs/stub/index.d.ts.map +1 -0
  21. package/dist/cjs/stub/index.js +187 -0
  22. package/dist/cjs/stub/index.js.map +1 -0
  23. package/dist/esm/client.d.ts +8 -0
  24. package/dist/esm/client.d.ts.map +1 -1
  25. package/dist/esm/client.js +8 -0
  26. package/dist/esm/client.js.map +1 -1
  27. package/dist/esm/file-storage/errors.d.ts +16 -0
  28. package/dist/esm/file-storage/errors.d.ts.map +1 -0
  29. package/dist/esm/file-storage/errors.js +31 -0
  30. package/dist/esm/file-storage/errors.js.map +1 -0
  31. package/dist/esm/file-storage/index.d.ts +116 -0
  32. package/dist/esm/file-storage/index.d.ts.map +1 -0
  33. package/dist/esm/file-storage/index.js +129 -0
  34. package/dist/esm/file-storage/index.js.map +1 -0
  35. package/dist/esm/index.d.ts +4 -2
  36. package/dist/esm/index.d.ts.map +1 -1
  37. package/dist/esm/index.js +4 -2
  38. package/dist/esm/index.js.map +1 -1
  39. package/dist/esm/stub/index.d.ts +19 -0
  40. package/dist/esm/stub/index.d.ts.map +1 -0
  41. package/dist/esm/stub/index.js +184 -0
  42. package/dist/esm/stub/index.js.map +1 -0
  43. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  44. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  45. package/package.json +12 -2
  46. package/src/file-storage/README.md +61 -0
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStubClient = createStubClient;
4
+ /**
5
+ * `@sapiom/tools/stub` — a stub capability client for local development.
6
+ *
7
+ * `createStubClient()` returns a `Sapiom` of the same shape as the real client,
8
+ * but every capability is satisfied by a built-in default (so a workflow runs
9
+ * locally with zero setup) plus optional per-capability overrides (when a step's
10
+ * logic branches on a result). No network, no credentials.
11
+ *
12
+ * It is shape-faithful: namespace methods return the real handle types
13
+ * (`Repository`, `Sandbox`, `RunHandle`), and a handle's instance methods
14
+ * (`repo.pushFromSandbox(...)`, `sandbox.exec(...)`) work too — so a step never
15
+ * has to be rewritten to run locally. Method names are validated against the
16
+ * real handle classes, so a call to a method that doesn't exist throws.
17
+ *
18
+ * Overrides are keyed by capability path — namespace methods by their dotted
19
+ * path (`repositories.list`, `agent.coding.run`), handle methods by
20
+ * `<handle>.<method>` (`repository.pushFromSandbox`, `sandbox.exec`). A value
21
+ * replaces that capability's default; a function `(…args) => value` computes it
22
+ * from the call arguments.
23
+ */
24
+ const index_js_1 = require("../agent/index.js");
25
+ const index_js_2 = require("../repositories/index.js");
26
+ const index_js_3 = require("../sandboxes/index.js");
27
+ // Module-scoped so correlation ids are unique across launches within a run.
28
+ let launchSeq = 0;
29
+ /** A launched, pausable capability handle (the `DispatchHandle` shape). */
30
+ function isDispatchHandle(v) {
31
+ if (!v || typeof v !== 'object')
32
+ return false;
33
+ const h = v;
34
+ return typeof h.wait === 'function' && typeof h.dispatch?.correlationId === 'string';
35
+ }
36
+ /**
37
+ * Register a dispatch-able handle's eventual result so a pause on its signal can
38
+ * be auto-resumed, then return the handle. Capability-agnostic: any launch-style
39
+ * stub method wraps its returned handle in this — the result a `pauseUntilSignal`
40
+ * resumes with is exactly what the handle's `wait()` resolves to.
41
+ */
42
+ async function dispatchable(handle, signals) {
43
+ if (signals && isDispatchHandle(handle)) {
44
+ signals.set(handle.dispatch.correlationId, await handle.wait());
45
+ }
46
+ return handle;
47
+ }
48
+ // Method names of each handle, reflected from the real classes so the stub stays
49
+ // in lockstep with the SDK (a renamed/added method is picked up automatically).
50
+ const REPOSITORY_METHODS = handleMethods(index_js_2.Repository.prototype);
51
+ const SANDBOX_METHODS = handleMethods(index_js_3.Sandbox.prototype);
52
+ const RUN_HANDLE_METHODS = new Set(['status', 'wait']); // RunHandle is a literal, not a class
53
+ function handleMethods(proto) {
54
+ return new Set(Object.getOwnPropertyNames(proto).filter((n) => n !== 'constructor'));
55
+ }
56
+ function resolve(overrides, path, args, fallback) {
57
+ if (Object.prototype.hasOwnProperty.call(overrides, path)) {
58
+ const o = overrides[path];
59
+ return typeof o === 'function' ? o(...args) : o;
60
+ }
61
+ return fallback();
62
+ }
63
+ /**
64
+ * Build a handle proxy: data fields read from `data`; declared methods resolve an
65
+ * override (`<type>.<method>`) or a default; any other property is rejected as
66
+ * not part of the handle.
67
+ */
68
+ function makeHandle(type, methods, data, overrides, defaults) {
69
+ return new Proxy(data, {
70
+ get(target, prop) {
71
+ if (typeof prop === 'symbol' || prop === 'then')
72
+ return undefined;
73
+ const key = String(prop);
74
+ if (key in target)
75
+ return target[key]; // data field (incl. nested handles)
76
+ if (methods.has(key)) {
77
+ return (...args) => Promise.resolve(resolve(overrides, `${type}.${key}`, args, () => defaults[key]?.(args)));
78
+ }
79
+ throw new Error(`'${type}.${key}' is not a method or field on this handle.`);
80
+ },
81
+ });
82
+ }
83
+ const REPO_METHOD_DEFAULTS = {
84
+ delete: () => undefined,
85
+ pushFromSandbox: () => ({ pushed: true, sha: 'stub00000000', branch: 'main' }),
86
+ };
87
+ const SANDBOX_METHOD_DEFAULTS = {
88
+ exec: () => ({ pid: 'stub-proc', exitCode: 0, stdout: '', stderr: '' }),
89
+ readFile: () => '',
90
+ writeFile: () => undefined,
91
+ destroy: () => undefined,
92
+ };
93
+ function stubRepository(data, overrides) {
94
+ return makeHandle('repository', REPOSITORY_METHODS, { slug: data.slug, cloneUrl: data.cloneUrl, status: data.status ?? 'active' }, overrides, REPO_METHOD_DEFAULTS);
95
+ }
96
+ function stubSandbox(data, overrides) {
97
+ return makeHandle('sandbox', SANDBOX_METHODS, { name: data.name, workspaceRoot: data.workspaceRoot ?? '/workspace' }, overrides, SANDBOX_METHOD_DEFAULTS);
98
+ }
99
+ function stubCodingResult(overrides) {
100
+ return {
101
+ runId: 'stub-run',
102
+ status: 'completed',
103
+ summary: '(stub) coding run completed locally',
104
+ result: {
105
+ success: true,
106
+ turns: 1,
107
+ modelUsed: 'stub-model',
108
+ durationMs: 0,
109
+ toolCallCount: 0,
110
+ usage: { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheCreateTokens: 0, thinkingTokens: 0 },
111
+ },
112
+ error: null,
113
+ sandbox: stubSandbox({ name: 'stub-sandbox' }, overrides),
114
+ };
115
+ }
116
+ function stubRunHandle(overrides, correlationId, result) {
117
+ const handle = {
118
+ runId: correlationId,
119
+ sandbox: result.sandbox,
120
+ dispatch: { correlationId, resultSignal: index_js_1.CODING_RESULT_SIGNAL },
121
+ status: () => Promise.resolve(result.status),
122
+ wait: () => Promise.resolve(result),
123
+ };
124
+ return makeHandle('runHandle', RUN_HANDLE_METHODS, handle, overrides, {});
125
+ }
126
+ /**
127
+ * Create a stub `Sapiom` client. Runs every capability against built-in defaults;
128
+ * pass `overrides` to control the results a step branches on.
129
+ */
130
+ function createStubClient(opts = {}) {
131
+ const overrides = opts.overrides ?? {};
132
+ const r = (path, args, fallback) => resolve(overrides, path, args, fallback);
133
+ const client = {
134
+ sandboxes: {
135
+ create: (sandboxOpts) => Promise.resolve(r('sandboxes.create', [sandboxOpts], () => stubSandbox({ name: sandboxOpts?.name ?? 'stub-sandbox' }, overrides))),
136
+ attach: (name, attachOpts) => r('sandboxes.attach', [name, attachOpts], () => stubSandbox({ name }, overrides)),
137
+ },
138
+ repositories: {
139
+ create: (slug) => Promise.resolve(r('repositories.create', [slug], () => stubRepository({ slug, cloneUrl: `https://git.local/${slug}.git` }, overrides))),
140
+ get: (slug) => Promise.resolve(r('repositories.get', [slug], () => stubRepository({ slug, cloneUrl: `https://git.local/${slug}.git` }, overrides))),
141
+ list: () => Promise.resolve(r('repositories.list', [], () => [])),
142
+ delete: (slug) => Promise.resolve(r('repositories.delete', [slug], () => undefined)),
143
+ attach: (slug, cloneUrl) => r('repositories.attach', [slug, cloneUrl], () => stubRepository({ slug, cloneUrl }, overrides)),
144
+ },
145
+ agent: {
146
+ coding: {
147
+ run: (spec) => Promise.resolve(r('agent.coding.run', [spec], () => stubCodingResult(overrides))),
148
+ launch: (spec) => {
149
+ const correlationId = `stub-run-${++launchSeq}`;
150
+ // The resume payload IS the run result, so `agent.coding.run`
151
+ // overrides control both `await run()` and `launch()` + pause.
152
+ const result = {
153
+ ...r('agent.coding.run', [spec], () => stubCodingResult(overrides)),
154
+ runId: correlationId,
155
+ };
156
+ // Generic: any dispatch-able handle registers itself for pause-resume.
157
+ return dispatchable(stubRunHandle(overrides, correlationId, result), opts.signals);
158
+ },
159
+ },
160
+ },
161
+ fileStorage: {
162
+ upload: (input) => Promise.resolve(r('fileStorage.upload', [input], () => ({
163
+ fileId: 'stub-file',
164
+ uploadUrl: 'https://storage.local/upload/stub-file',
165
+ expiresAt: '2099-01-01T00:00:00Z',
166
+ requiredHeaders: {},
167
+ }))),
168
+ getDownloadUrl: (fileId) => Promise.resolve(r('fileStorage.getDownloadUrl', [fileId], () => ({
169
+ downloadUrl: `https://storage.local/download/${fileId}`,
170
+ expiresAt: '2099-01-01T00:00:00Z',
171
+ }))),
172
+ list: (listOpts) => Promise.resolve(r('fileStorage.list', [listOpts], () => ({ files: [], limit: 20, offset: 0, hasMore: false }))),
173
+ delete: (fileId) => Promise.resolve(r('fileStorage.delete', [fileId], () => undefined)),
174
+ setVisibility: (fileId, visibility) => Promise.resolve(r('fileStorage.setVisibility', [fileId, visibility], () => ({
175
+ fileId,
176
+ contentType: 'application/octet-stream',
177
+ visibility,
178
+ status: 'uploaded',
179
+ createdAt: '2099-01-01T00:00:00Z',
180
+ downloadRequestCount: 0,
181
+ }))),
182
+ },
183
+ withAttribution: () => client,
184
+ };
185
+ return client;
186
+ }
187
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stub/index.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,7 @@ import { Sandbox } from "./sandboxes/index.js";
19
19
  import type { SandboxCreateOptions } from "./sandboxes/index.js";
20
20
  import { Repository } from "./repositories/index.js";
21
21
  import type { CodingRunSpec, CodingRunResult, RunHandle } from "./agent/index.js";
22
+ import type { UploadInput, UploadResponse, DownloadUrlResponse, ListOptions, ListResponse, FileMetadata } from "./file-storage/index.js";
22
23
  export interface Sapiom {
23
24
  readonly sandboxes: {
24
25
  create(opts: SandboxCreateOptions): Promise<Sandbox>;
@@ -40,6 +41,13 @@ export interface Sapiom {
40
41
  launch(spec: CodingRunSpec): Promise<RunHandle>;
41
42
  };
42
43
  };
44
+ readonly fileStorage: {
45
+ upload(input: UploadInput): Promise<UploadResponse>;
46
+ getDownloadUrl(fileId: string): Promise<DownloadUrlResponse>;
47
+ list(opts?: ListOptions): Promise<ListResponse>;
48
+ delete(fileId: string): Promise<void>;
49
+ setVisibility(fileId: string, visibility: "private" | "public"): Promise<FileMetadata>;
50
+ };
43
51
  /**
44
52
  * Derive a client that attributes its calls to a different agent/trace. For the
45
53
  * router case (one process acting for many agents); step-authoring code doesn't
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,WAAW,EACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,SAAS,EACV,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,SAAS,EAAE;QAClB,MAAM,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,CACJ,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;YAAE,aAAa,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,GAClD,OAAO,CAAC;KACZ,CAAC;IACF,QAAQ,CAAC,YAAY,EAAE;QACrB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACvC,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC;KACpD,CAAC;IACF,QAAQ,CAAC,KAAK,EAAE;QACd,MAAM,EAAE;YACN,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;YACnD,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;SACjD,CAAC;KACH,CAAC;IACF;;;;OAIG;IACH,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC;CAEnD;AA2BD,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,MAAM,CAE7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,WAAW,EACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,SAAS,EACV,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,YAAY,EACb,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,SAAS,EAAE;QAClB,MAAM,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,CACJ,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;YAAE,aAAa,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,GAClD,OAAO,CAAC;KACZ,CAAC;IACF,QAAQ,CAAC,YAAY,EAAE;QACrB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACvC,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC;KACpD,CAAC;IACF,QAAQ,CAAC,KAAK,EAAE;QACd,MAAM,EAAE;YACN,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;YACnD,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;SACjD,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,WAAW,EAAE;QACpB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;QACpD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,aAAa,CACX,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,SAAS,GAAG,QAAQ,GAC/B,OAAO,CAAC,YAAY,CAAC,CAAC;KAC1B,CAAC;IACF;;;;OAIG;IACH,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC;CAEnD;AAmCD,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,MAAM,CAE7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
@@ -18,6 +18,7 @@ import { Transport, attributionFromEnv, } from "./_client/index.js";
18
18
  import { Sandbox } from "./sandboxes/index.js";
19
19
  import { Repository } from "./repositories/index.js";
20
20
  import { run as codingRun, launch as codingLaunch } from "./agent/index.js";
21
+ import * as fileStorage from "./file-storage/index.js";
21
22
  /** Bind every capability namespace to a transport. `withAttribution` rebinds to a derived one. */
22
23
  function bind(transport) {
23
24
  return {
@@ -38,6 +39,13 @@ function bind(transport) {
38
39
  launch: (spec) => codingLaunch(spec, transport),
39
40
  },
40
41
  },
42
+ fileStorage: {
43
+ upload: (input) => fileStorage.upload(input, transport),
44
+ getDownloadUrl: (fileId) => fileStorage.getDownloadUrl(fileId, transport),
45
+ list: (opts) => fileStorage.list(opts, transport),
46
+ delete: (fileId) => fileStorage.delete(fileId, transport),
47
+ setVisibility: (fileId, visibility) => fileStorage.setVisibility(fileId, visibility, transport),
48
+ },
41
49
  withAttribution: (attribution) => bind(transport.withAttribution(attribution)),
42
50
  };
43
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EACL,SAAS,EACT,kBAAkB,GAGnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAqC5E,kGAAkG;AAClG,SAAS,IAAI,CAAC,SAAoB;IAChC,OAAO;QACL,SAAS,EAAE;YACT,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;YACjD,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC;SAC9D;QACD,YAAY,EAAE;YACZ,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;YACpD,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC;YAC9C,IAAI,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YACtC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;YACpD,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC;SACzE;QACD,KAAK,EAAE;YACL,MAAM,EAAE;gBACN,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC;gBACzC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC;aAChD;SACF;QACD,eAAe,EAAE,CAAC,WAAW,EAAE,EAAE,CAC/B,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAwB;IACnD,OAAO,IAAI,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EACL,SAAS,EACT,kBAAkB,GAGnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAM5E,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AAkDvD,kGAAkG;AAClG,SAAS,IAAI,CAAC,SAAoB;IAChC,OAAO;QACL,SAAS,EAAE;YACT,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;YACjD,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC;SAC9D;QACD,YAAY,EAAE;YACZ,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;YACpD,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC;YAC9C,IAAI,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YACtC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;YACpD,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC;SACzE;QACD,KAAK,EAAE;YACL,MAAM,EAAE;gBACN,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC;gBACzC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC;aAChD;SACF;QACD,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC;YACvD,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC;YACzE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;YACjD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;YACzD,aAAa,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CACpC,WAAW,CAAC,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC;SAC3D;QACD,eAAe,EAAE,CAAC,WAAW,EAAE,EAAE,CAC/B,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAwB;IACnD,OAAO,IAAI,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Error thrown by the file-storage capability when the gateway returns a non-2xx
3
+ * response. Exposes `status` (HTTP status code) and `body` (parsed JSON body, or
4
+ * raw text when the body isn't JSON) for programmatic inspection.
5
+ */
6
+ export declare class FileStorageHttpError extends Error {
7
+ readonly status: number;
8
+ readonly body: unknown;
9
+ constructor(message: string, status: number, body: unknown);
10
+ }
11
+ /**
12
+ * Return the response when 2xx, otherwise throw a {@link FileStorageHttpError}.
13
+ * Parses the error body as JSON when possible; falls back to raw text.
14
+ */
15
+ export declare function ensureOk(response: Response, errorPrefix: string): Promise<Response>;
16
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/file-storage/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;gBAEX,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO;CAM3D;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,QAAQ,CAAC,CAcnB"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Error thrown by the file-storage capability when the gateway returns a non-2xx
3
+ * response. Exposes `status` (HTTP status code) and `body` (parsed JSON body, or
4
+ * raw text when the body isn't JSON) for programmatic inspection.
5
+ */
6
+ export class FileStorageHttpError extends Error {
7
+ constructor(message, status, body) {
8
+ super(message);
9
+ this.name = "FileStorageHttpError";
10
+ this.status = status;
11
+ this.body = body;
12
+ }
13
+ }
14
+ /**
15
+ * Return the response when 2xx, otherwise throw a {@link FileStorageHttpError}.
16
+ * Parses the error body as JSON when possible; falls back to raw text.
17
+ */
18
+ export async function ensureOk(response, errorPrefix) {
19
+ if (response.ok)
20
+ return response;
21
+ let body;
22
+ const text = await response.text().catch(() => "");
23
+ try {
24
+ body = JSON.parse(text);
25
+ }
26
+ catch {
27
+ body = text;
28
+ }
29
+ throw new FileStorageHttpError(`${errorPrefix}: ${response.status} ${text}`, response.status, body);
30
+ }
31
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/file-storage/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAI7C,YAAY,OAAe,EAAE,MAAc,EAAE,IAAa;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAkB,EAClB,WAAmB;IAEnB,IAAI,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC;IACjC,IAAI,IAAa,CAAC;IAClB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,oBAAoB,CAC5B,GAAG,WAAW,KAAK,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,EAC5C,QAAQ,CAAC,MAAM,EACf,IAAI,CACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * `fileStorage` capability — tenant-scoped object storage on presigned GCS URLs.
3
+ *
4
+ * The control plane only: `upload` hands back a presigned URL you PUT the bytes to
5
+ * yourself (so you own streaming / progress / resumable uploads), and
6
+ * `getDownloadUrl` hands back a presigned URL you GET. `list`, `setVisibility`, and
7
+ * `delete` round out the lifecycle.
8
+ *
9
+ * import { fileStorage } from "@sapiom/tools"; // ambient auth
10
+ * const { uploadUrl, requiredHeaders } = await fileStorage.upload({
11
+ * contentType: "image/png",
12
+ * fileName: "photo.png",
13
+ * });
14
+ * await fetch(uploadUrl, { method: "PUT", headers: requiredHeaders, body: bytes });
15
+ *
16
+ * Or via an explicit client: `createClient({ apiKey }).fileStorage.upload(...)`.
17
+ *
18
+ * Wire fields are snake_case; this module maps them to the camelCase SDK surface.
19
+ * Byte counts are int64 — the gateway serializes them as strings (precision-safe),
20
+ * so `expectedFileSize` / `actualFileSize` on returned metadata are `string | null`.
21
+ */
22
+ import { Transport } from "../_client/index.js";
23
+ import { FileStorageHttpError } from "./errors.js";
24
+ export { FileStorageHttpError };
25
+ export interface UploadInput {
26
+ /** MIME content type of the file (e.g. "image/png", "application/pdf"). */
27
+ contentType: string;
28
+ /** Original file name for display purposes. */
29
+ fileName?: string;
30
+ /**
31
+ * File visibility.
32
+ * - "private" — download requires authentication (default).
33
+ * - "public" — download URL is unauthenticated.
34
+ */
35
+ visibility?: "private" | "public";
36
+ /** Expected file size in bytes. Used to pre-allocate storage. */
37
+ expectedFileSize?: number;
38
+ }
39
+ export interface UploadResponse {
40
+ /** Unique file identifier. Use this in subsequent calls. */
41
+ fileId: string;
42
+ /** GCS presigned upload URL. PUT the file bytes here directly. Expires at `expiresAt`. */
43
+ uploadUrl: string;
44
+ /** ISO-8601 timestamp when the upload URL expires. */
45
+ expiresAt: string;
46
+ /** Headers that must be sent when PUTting bytes to `uploadUrl` (e.g. Content-Type). */
47
+ requiredHeaders: Record<string, string>;
48
+ }
49
+ export interface DownloadUrlResponse {
50
+ /** Presigned GCS download URL. Expires at `expiresAt`. */
51
+ downloadUrl: string;
52
+ /** ISO-8601 timestamp when the download URL expires. */
53
+ expiresAt: string;
54
+ }
55
+ export interface FileMetadata {
56
+ /** Unique file identifier. */
57
+ fileId: string;
58
+ /** Original file name, if provided at upload time. */
59
+ fileName?: string;
60
+ /** MIME content type. */
61
+ contentType: string;
62
+ /** File visibility ("private" or "public"). */
63
+ visibility: "private" | "public";
64
+ /** Upload lifecycle status (e.g. "pending_upload", "uploaded", "deleted"). */
65
+ status: string;
66
+ /**
67
+ * Expected (client-declared) size in bytes — a string (int64, precision-safe),
68
+ * `null` when not declared.
69
+ */
70
+ expectedFileSize?: string | null;
71
+ /** Actual size in bytes after upload (string; `null` until the verify sweep records it). */
72
+ actualFileSize?: string | null;
73
+ /** ISO-8601 timestamp when the record was created. */
74
+ createdAt: string;
75
+ /** ISO-8601 timestamp when the bytes were uploaded. */
76
+ uploadedAt?: string;
77
+ /** ISO-8601 timestamp when the file was soft-deleted. */
78
+ deletedAt?: string;
79
+ /** Number of times a download URL was generated for this file. */
80
+ downloadRequestCount: number;
81
+ }
82
+ export interface ListOptions {
83
+ /** Maximum number of files to return. */
84
+ limit?: number;
85
+ /** Number of files to skip (pagination). */
86
+ offset?: number;
87
+ }
88
+ export interface ListResponse {
89
+ /** Files on the current page. */
90
+ files: FileMetadata[];
91
+ /** Page size used. */
92
+ limit: number;
93
+ /** Offset used. */
94
+ offset: number;
95
+ /** Whether more files exist beyond this page. */
96
+ hasMore: boolean;
97
+ }
98
+ /**
99
+ * Initiate an upload. Returns a presigned GCS URL; PUT the bytes to `uploadUrl`
100
+ * with `requiredHeaders` yourself (this capability owns only the control plane).
101
+ */
102
+ export declare function upload(input: UploadInput, transport?: Transport, baseUrl?: string): Promise<UploadResponse>;
103
+ /** Generate a presigned download URL for a file. */
104
+ export declare function getDownloadUrl(fileId: string, transport?: Transport, baseUrl?: string): Promise<DownloadUrlResponse>;
105
+ /** List files owned by the authenticated tenant. */
106
+ export declare function list(opts?: ListOptions, transport?: Transport, baseUrl?: string): Promise<ListResponse>;
107
+ /** Update a file's visibility. */
108
+ export declare function setVisibility(fileId: string, visibility: "private" | "public", transport?: Transport, baseUrl?: string): Promise<FileMetadata>;
109
+ /**
110
+ * Delete a file. Idempotent on the gateway (deleting an already-deleted file is a
111
+ * no-op success). Exported as `delete`:
112
+ * `import { fileStorage } from "@sapiom/tools"; await fileStorage.delete(id)`.
113
+ */
114
+ declare function deleteFile(fileId: string, transport?: Transport, baseUrl?: string): Promise<void>;
115
+ export { deleteFile as delete };
116
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/file-storage/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * `fileStorage` capability — tenant-scoped object storage on presigned GCS URLs.
3
+ *
4
+ * The control plane only: `upload` hands back a presigned URL you PUT the bytes to
5
+ * yourself (so you own streaming / progress / resumable uploads), and
6
+ * `getDownloadUrl` hands back a presigned URL you GET. `list`, `setVisibility`, and
7
+ * `delete` round out the lifecycle.
8
+ *
9
+ * import { fileStorage } from "@sapiom/tools"; // ambient auth
10
+ * const { uploadUrl, requiredHeaders } = await fileStorage.upload({
11
+ * contentType: "image/png",
12
+ * fileName: "photo.png",
13
+ * });
14
+ * await fetch(uploadUrl, { method: "PUT", headers: requiredHeaders, body: bytes });
15
+ *
16
+ * Or via an explicit client: `createClient({ apiKey }).fileStorage.upload(...)`.
17
+ *
18
+ * Wire fields are snake_case; this module maps them to the camelCase SDK surface.
19
+ * Byte counts are int64 — the gateway serializes them as strings (precision-safe),
20
+ * so `expectedFileSize` / `actualFileSize` on returned metadata are `string | null`.
21
+ */
22
+ import { defaultTransport } from "../_client/index.js";
23
+ import { ensureOk, FileStorageHttpError } from "./errors.js";
24
+ export { FileStorageHttpError };
25
+ /** Object storage service. Host routing is an internal detail — override via SAPIOM_FILE_STORAGE_URL. */
26
+ const DEFAULT_BASE_URL = process.env.SAPIOM_FILE_STORAGE_URL ||
27
+ "https://file-storage.services.sapiom.ai";
28
+ function mapFileMetadata(raw) {
29
+ return {
30
+ fileId: raw.file_id,
31
+ ...(raw.file_name !== undefined && { fileName: raw.file_name }),
32
+ contentType: raw.content_type,
33
+ visibility: raw.visibility,
34
+ status: raw.status,
35
+ ...(raw.expected_file_size !== undefined && {
36
+ expectedFileSize: raw.expected_file_size,
37
+ }),
38
+ ...(raw.actual_file_size !== undefined && {
39
+ actualFileSize: raw.actual_file_size,
40
+ }),
41
+ createdAt: raw.created_at,
42
+ ...(raw.uploaded_at !== undefined && { uploadedAt: raw.uploaded_at }),
43
+ ...(raw.deleted_at !== undefined && { deletedAt: raw.deleted_at }),
44
+ downloadRequestCount: raw.download_request_count,
45
+ };
46
+ }
47
+ // ----- capability operations -----
48
+ /**
49
+ * Initiate an upload. Returns a presigned GCS URL; PUT the bytes to `uploadUrl`
50
+ * with `requiredHeaders` yourself (this capability owns only the control plane).
51
+ */
52
+ export async function upload(input, transport = defaultTransport(), baseUrl = DEFAULT_BASE_URL) {
53
+ const body = { content_type: input.contentType };
54
+ if (input.fileName !== undefined)
55
+ body.file_name = input.fileName;
56
+ if (input.visibility !== undefined)
57
+ body.visibility = input.visibility;
58
+ if (input.expectedFileSize !== undefined) {
59
+ body.expected_file_size = input.expectedFileSize;
60
+ }
61
+ const res = await ensureOk(await transport.fetch(`${baseUrl}/upload`, {
62
+ method: "POST",
63
+ headers: { "content-type": "application/json" },
64
+ body: JSON.stringify(body),
65
+ }), "Failed to initiate file upload");
66
+ const raw = (await res.json());
67
+ return {
68
+ fileId: raw.file_id,
69
+ uploadUrl: raw.upload_url,
70
+ expiresAt: raw.expires_at,
71
+ requiredHeaders: raw.required_headers,
72
+ };
73
+ }
74
+ /** Generate a presigned download URL for a file. */
75
+ export async function getDownloadUrl(fileId, transport = defaultTransport(), baseUrl = DEFAULT_BASE_URL) {
76
+ const res = await ensureOk(await transport.fetch(`${baseUrl}/download/${encodeURIComponent(fileId)}`), `Failed to get download URL for file '${fileId}'`);
77
+ const raw = (await res.json());
78
+ return { downloadUrl: raw.download_url, expiresAt: raw.expires_at };
79
+ }
80
+ /** List files owned by the authenticated tenant. */
81
+ export async function list(opts, transport = defaultTransport(), baseUrl = DEFAULT_BASE_URL) {
82
+ const url = new URL(`${baseUrl}/files`);
83
+ if (opts?.limit !== undefined) {
84
+ url.searchParams.set("limit", String(opts.limit));
85
+ }
86
+ if (opts?.offset !== undefined) {
87
+ url.searchParams.set("offset", String(opts.offset));
88
+ }
89
+ const res = await ensureOk(await transport.fetch(url.toString()), "Failed to list files");
90
+ const raw = (await res.json());
91
+ return {
92
+ files: raw.files.map(mapFileMetadata),
93
+ limit: raw.limit,
94
+ offset: raw.offset,
95
+ hasMore: raw.has_more,
96
+ };
97
+ }
98
+ /** Update a file's visibility. */
99
+ export async function setVisibility(fileId, visibility, transport = defaultTransport(), baseUrl = DEFAULT_BASE_URL) {
100
+ const res = await ensureOk(await transport.fetch(`${baseUrl}/${encodeURIComponent(fileId)}`, {
101
+ method: "PATCH",
102
+ headers: { "content-type": "application/json" },
103
+ body: JSON.stringify({ visibility }),
104
+ }), `Failed to set visibility for file '${fileId}'`);
105
+ const raw = (await res.json());
106
+ return mapFileMetadata(raw);
107
+ }
108
+ /**
109
+ * Delete a file. Idempotent on the gateway (deleting an already-deleted file is a
110
+ * no-op success). Exported as `delete`:
111
+ * `import { fileStorage } from "@sapiom/tools"; await fileStorage.delete(id)`.
112
+ */
113
+ async function deleteFile(fileId, transport = defaultTransport(), baseUrl = DEFAULT_BASE_URL) {
114
+ const res = await transport.fetch(`${baseUrl}/${encodeURIComponent(fileId)}`, { method: "DELETE" });
115
+ if (!res.ok) {
116
+ const text = await res.text().catch(() => "");
117
+ let parsed;
118
+ try {
119
+ parsed = JSON.parse(text);
120
+ }
121
+ catch {
122
+ parsed = text;
123
+ }
124
+ throw new FileStorageHttpError(`Failed to delete file '${fileId}': ${res.status} ${text}`, res.status, parsed);
125
+ }
126
+ // 204 No Content — nothing to parse.
127
+ }
128
+ export { deleteFile as delete };
129
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/file-storage/index.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,8 @@
2
2
  * `@sapiom/tools` — the typed Sapiom capability client.
3
3
  *
4
4
  * The same catalog your agents call over MCP, callable from code. Capabilities are
5
- * namespaces (`sandboxes`, `repositories`, `agent`, … ), importable from the barrel
6
- * or a subpath:
5
+ * namespaces (`sandboxes`, `repositories`, `agent`, `fileStorage`, … ), importable
6
+ * from the barrel or a subpath:
7
7
  *
8
8
  * import { sandboxes } from "@sapiom/tools";
9
9
  * import { sandboxes } from "@sapiom/tools/sandboxes";
@@ -21,4 +21,6 @@ export * as repositories from "./repositories/index.js";
21
21
  export { Repository } from "./repositories/index.js";
22
22
  export * as agent from "./agent/index.js";
23
23
  export { CODING_RESULT_SIGNAL } from "./agent/index.js";
24
+ export * as fileStorage from "./file-storage/index.js";
25
+ export { FileStorageHttpError } from "./file-storage/index.js";
24
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAChE,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIvE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAChE,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIvE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/esm/index.js CHANGED
@@ -2,8 +2,8 @@
2
2
  * `@sapiom/tools` — the typed Sapiom capability client.
3
3
  *
4
4
  * The same catalog your agents call over MCP, callable from code. Capabilities are
5
- * namespaces (`sandboxes`, `repositories`, `agent`, … ), importable from the barrel
6
- * or a subpath:
5
+ * namespaces (`sandboxes`, `repositories`, `agent`, `fileStorage`, … ), importable
6
+ * from the barrel or a subpath:
7
7
  *
8
8
  * import { sandboxes } from "@sapiom/tools";
9
9
  * import { sandboxes } from "@sapiom/tools/sandboxes";
@@ -19,4 +19,6 @@ export { Repository } from "./repositories/index.js";
19
19
  export * as agent from "./agent/index.js";
20
20
  // Surfaced top-level for the static `pause: { signal }` decl on a workflow step.
21
21
  export { CODING_RESULT_SIGNAL } from "./agent/index.js";
22
+ export * as fileStorage from "./file-storage/index.js";
23
+ export { FileStorageHttpError } from "./file-storage/index.js";
22
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQhE,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,iFAAiF;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQhE,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,iFAAiF;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC"}