@braidhq/server 0.2.1 → 0.3.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 (56) hide show
  1. package/README.md +3 -1
  2. package/dist/app.d.ts.map +1 -1
  3. package/dist/app.js +28 -4
  4. package/dist/app.js.map +1 -1
  5. package/dist/composeApp.d.ts +5 -1
  6. package/dist/composeApp.d.ts.map +1 -1
  7. package/dist/composeApp.js +6 -0
  8. package/dist/composeApp.js.map +1 -1
  9. package/dist/composeFsApp.d.ts +49 -3
  10. package/dist/composeFsApp.d.ts.map +1 -1
  11. package/dist/composeFsApp.js +146 -59
  12. package/dist/composeFsApp.js.map +1 -1
  13. package/dist/defaultOntologyPlugins.d.ts +9 -0
  14. package/dist/defaultOntologyPlugins.d.ts.map +1 -0
  15. package/dist/defaultOntologyPlugins.js +11 -0
  16. package/dist/defaultOntologyPlugins.js.map +1 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +1 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/infrastructure/oauth/GitHubOAuth.d.ts +45 -0
  22. package/dist/infrastructure/oauth/GitHubOAuth.d.ts.map +1 -0
  23. package/dist/infrastructure/oauth/GitHubOAuth.js +85 -0
  24. package/dist/infrastructure/oauth/GitHubOAuth.js.map +1 -0
  25. package/dist/infrastructure/oauth/providers.d.ts +19 -0
  26. package/dist/infrastructure/oauth/providers.d.ts.map +1 -0
  27. package/dist/infrastructure/oauth/providers.js +22 -0
  28. package/dist/infrastructure/oauth/providers.js.map +1 -0
  29. package/dist/infrastructure/skill/FsSkillRegistry.d.ts +6 -0
  30. package/dist/infrastructure/skill/FsSkillRegistry.d.ts.map +1 -1
  31. package/dist/infrastructure/skill/FsSkillRegistry.js +7 -1
  32. package/dist/infrastructure/skill/FsSkillRegistry.js.map +1 -1
  33. package/dist/infrastructure/skill/SubprocessSkillRunner.d.ts +26 -5
  34. package/dist/infrastructure/skill/SubprocessSkillRunner.d.ts.map +1 -1
  35. package/dist/infrastructure/skill/SubprocessSkillRunner.js +125 -13
  36. package/dist/infrastructure/skill/SubprocessSkillRunner.js.map +1 -1
  37. package/dist/infrastructure/workspace/productManifestWriter.d.ts +5 -1
  38. package/dist/infrastructure/workspace/productManifestWriter.d.ts.map +1 -1
  39. package/dist/infrastructure/workspace/productManifestWriter.js +5 -2
  40. package/dist/infrastructure/workspace/productManifestWriter.js.map +1 -1
  41. package/dist/middleware/auth.d.ts.map +1 -1
  42. package/dist/middleware/auth.js +8 -1
  43. package/dist/middleware/auth.js.map +1 -1
  44. package/dist/routes/oauth.d.ts +51 -10
  45. package/dist/routes/oauth.d.ts.map +1 -1
  46. package/dist/routes/oauth.js +174 -62
  47. package/dist/routes/oauth.js.map +1 -1
  48. package/dist/routes/sourceConnection.d.ts +30 -0
  49. package/dist/routes/sourceConnection.d.ts.map +1 -0
  50. package/dist/routes/sourceConnection.js +51 -0
  51. package/dist/routes/sourceConnection.js.map +1 -0
  52. package/dist/routes/workspaces.d.ts +6 -0
  53. package/dist/routes/workspaces.d.ts.map +1 -1
  54. package/dist/routes/workspaces.js +8 -1
  55. package/dist/routes/workspaces.js.map +1 -1
  56. package/package.json +15 -15
package/README.md CHANGED
@@ -21,6 +21,8 @@ Two layers share this package for now.
21
21
 
22
22
  A future app, a story world or a research-notes base, reuses the kernel and swaps the preset for its own ontology and adapters. When that second worldview arrives, the coding preset extracts into its own package, `@braidhq/preset-code`, and this package drops its plugin dependencies. Until a second worldview exists that pressure is speculative, so both layers stay here at no cost. The seam is `composeApp`: whatever the kernel reaches without a concrete plugin already belongs to it.
23
23
 
24
+ Such an app does not have to reimplement the runtime to get there. `composeFsAppWithRegistry(buildRegistry, options)` runs the same filesystem assembly as `composeFsApp`, the subprocess skill runner, the fs unit lister, and every fs repository, over a registry the caller builds. `composeFsApp` is that call with the preset's bundle.
25
+
24
26
  ## Structure
25
27
 
26
28
  The package layers outward from core. Infrastructure implements core's ports, routes expose them, and composition binds the two.
@@ -49,7 +51,7 @@ src/
49
51
  └── _shared/ cross-cutting fs plumbing, paths, json store, frontmatter
50
52
  ```
51
53
 
52
- - **composeApp / composeFsApp**: The kernel root and the coding preset. `composeApp` takes a deps object, registers no plugin, and defaults every unset port to an in-memory adapter. `composeFsApp` builds the filesystem, git, and vendor adapters, registers the default plugin bundle, then hands the result to `composeApp`. Production runs the latter. See Positioning above.
54
+ - **composeApp / composeFsApp**: The kernel root and the coding preset. `composeApp` takes a deps object, registers no plugin, and defaults every unset port to an in-memory adapter. `composeFsAppWithRegistry` builds the filesystem, git, and vendor adapters over a caller-supplied registry, then hands the result to `composeApp`. `composeFsApp` is that call with the default bundle, and production runs it. See Positioning above.
53
55
  - **startup**: The two boot passes, `startupBeforeServe` and `startupAfterServe`. See Startup below for the full order.
54
56
  - **infrastructure**: The real adapters behind core's ports, grouped by domain concern to mirror `core/domain`, never by storage technology. Each folder owns one aggregate's adapter, so a future SQLite or Postgres store lands beside the filesystem one instead of in a separate `sql/` tree. `hitl/` persists proposals and clarifications, `workspace/` the graph and workspace files, `history/` records every change as a git commit, `skill/` runs a skill as a subprocess and streams its events back. `_shared/` holds the cross-cutting fs plumbing, its underscore marking it as the one folder that is not a domain concern, matching `routes/_shared.ts`. `users/ auth/ secrets/ oauth/` are host services with no core port.
55
57
  - **routes**: One `createXxxRouter(deps)` per resource, each taking only the services it needs. Bodies validate through zod, path ids parse through their branded schema.
package/dist/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AA+B/C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,GAAE,UAAe,GAAG,WAAW,CAsMtF"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAgC/C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,GAAE,UAAe,GAAG,WAAW,CA8NtF"}
package/dist/app.js CHANGED
@@ -13,7 +13,7 @@ import { healthRouter } from './routes/health.js';
13
13
  import { createHistoryRouter } from './routes/history.js';
14
14
  import { createModelRouter } from './routes/model.js';
15
15
  import { createNodesRouter } from './routes/nodes.js';
16
- import { createOAuthRouter } from './routes/oauth.js';
16
+ import { createOAuthCallbackRouter, createOAuthStartRouter, OAuthFlowStore } from './routes/oauth.js';
17
17
  import { createOntologiesRouter } from './routes/ontologies.js';
18
18
  import { createOntologyRouter } from './routes/ontology.js';
19
19
  import { createProposalsRouter } from './routes/proposals.js';
@@ -21,6 +21,7 @@ import { createReactorCyclesRouter } from './routes/reactorCycles.js';
21
21
  import { createRunsRouter } from './routes/runs.js';
22
22
  import { createSkillInputOptionsRouter } from './routes/skillInputOptions.js';
23
23
  import { createSkillsRouter } from './routes/skills.js';
24
+ import { createSourceConnectionRouter } from './routes/sourceConnection.js';
24
25
  import { createSourceLoadersRouter } from './routes/sourceLoaders.js';
25
26
  import { createSourceUnitObservationsRouter } from './routes/sourceUnitObservations.js';
26
27
  import { createGithubWebhookReceiver, createSourceWebhooksAdminRouter } from './routes/sourceWebhooks.js';
@@ -74,6 +75,7 @@ export function createApp(deps, options = {}) {
74
75
  sourceLoaderRunner: deps.sourceLoaderRunner,
75
76
  workspacesRoot: deps.workspacesRoot,
76
77
  pluginRegistry: deps.pluginRegistry,
78
+ ...(deps.defaultOntologyId ? { defaultOntologyId: deps.defaultOntologyId } : {}),
77
79
  ...(deps.bootstrap ? { bootstrap: deps.bootstrap } : {}),
78
80
  ...(deps.workspaceRegistry ? { workspaceRegistry: deps.workspaceRegistry } : {}),
79
81
  ...(deps.userRegistry ? { userRegistry: deps.userRegistry } : {}),
@@ -98,6 +100,9 @@ export function createApp(deps, options = {}) {
98
100
  pluginRegistry: deps.pluginRegistry,
99
101
  }));
100
102
  }
103
+ // Shared by the OAuth start and callback routers,
104
+ // so a flow opened by start is resolved by callback.
105
+ const oauthFlowStore = new OAuthFlowStore();
101
106
  // Workspace-scoped sub-app, mounted under `/workspaces/:workspaceId` below.
102
107
  const workspaceScoped = new OpenAPIHono();
103
108
  workspaceScoped.use('*', workspaceIdMiddleware);
@@ -173,6 +178,7 @@ export function createApp(deps, options = {}) {
173
178
  pluginRegistry: deps.pluginRegistry,
174
179
  ...(options.apiUrl ? { apiUrl: options.apiUrl } : {}),
175
180
  }));
181
+ workspaceScoped.route('/source-connections', createSourceConnectionRouter({ secretStore: deps.secretStore, workspaceService: deps.workspaceService }));
176
182
  }
177
183
  workspaceScoped.route('/skill-input-options', createSkillInputOptionsRouter({
178
184
  modelRepository: deps.modelRepository,
@@ -194,9 +200,23 @@ export function createApp(deps, options = {}) {
194
200
  }
195
201
  app.route('/workspaces/:workspaceId', workspaceScoped);
196
202
  if (deps.secretStore) {
197
- app.route('/oauth', createOAuthRouter({
203
+ // Start is owner-gated in-handler,
204
+ // so an existing workspace needs `workspace.write`,
205
+ // while the Wizard can connect before scaffold.
206
+ app.route('/oauth', createOAuthStartRouter({
198
207
  secretStore: deps.secretStore,
208
+ flowStore: oauthFlowStore,
199
209
  ...(deps.googleOAuth ? { google: deps.googleOAuth } : {}),
210
+ ...(deps.githubOAuth ? { github: deps.githubOAuth } : {}),
211
+ ...(deps.userRegistry ? { userRegistry: deps.userRegistry } : {}),
212
+ workspaceService: deps.workspaceService,
213
+ ...(deps.workspaceRegistry ? { workspaceRegistry: deps.workspaceRegistry } : {}),
214
+ }));
215
+ app.route('/oauth', createOAuthCallbackRouter({
216
+ secretStore: deps.secretStore,
217
+ flowStore: oauthFlowStore,
218
+ ...(deps.googleOAuth ? { google: deps.googleOAuth } : {}),
219
+ ...(deps.githubOAuth ? { github: deps.githubOAuth } : {}),
200
220
  }));
201
221
  }
202
222
  // OpenAPI 3 spec, consumed by openapi-mcp-gateway, to surface REST operations as MCP tools.
@@ -204,8 +224,12 @@ export function createApp(deps, options = {}) {
204
224
  // they mount plain Hono sub-routers, so they never register with the doc.
205
225
  // The `servers[]` block lets the gateway resolve the upstream base URL,
206
226
  // without an explicit --base-url flag.
207
- app.doc('/openapi.json', {
208
- openapi: '3.0.0',
227
+ // 3.1 so schemas are JSON Schema 2020-12,
228
+ // the dialect a tool `input_schema` is validated against.
229
+ // A 3.0 doc emits `nullable` and boolean `exclusiveMinimum`,
230
+ // which the model API rejects once the gateway forwards them as MCP tool schemas.
231
+ app.doc31('/openapi.json', {
232
+ openapi: '3.1.0',
209
233
  info: {
210
234
  title: 'Braid REST API',
211
235
  version: '0.0.1',
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import type { BatchPlanRepository, ClarificationRepository, Clock, ModelRepository, ModelSerializer, ProposalRepository, ReactorCycleRepository, RunRepository, SkillRegistry, SkillRunner, SourceUnitDigest, SourceUnitObservationRepository, UnitLister, UserDirectory, WorkspaceBootstrapService, WorkspaceEventBus, WorkspaceHistory, WorkspaceRepository } from '@braidhq/core';
2
- import type { AbsolutePath } from '@braidhq/schema';
2
+ import type { AbsolutePath, OntologyId } from '@braidhq/schema';
3
3
  import type { AuthMode } from './authMode.js';
4
4
  import type { AccessPolicy } from './infrastructure/auth/AccessPolicy.js';
5
5
  import type { SessionStore } from './infrastructure/auth/SessionStore.js';
6
+ import type { GitHubOAuth } from './infrastructure/oauth/GitHubOAuth.js';
6
7
  import type { GoogleOAuth } from './infrastructure/oauth/GoogleOAuth.js';
7
8
  import type { SecretStore } from './infrastructure/secrets/SecretStore.js';
8
9
  import type { UserRegistryFile } from './infrastructure/users/UserRegistryFile.js';
@@ -38,6 +39,7 @@ export interface AppDependencies {
38
39
  pluginRegistry: PluginRegistry;
39
40
  clock: Clock;
40
41
  workspacesRoot: AbsolutePath;
42
+ defaultOntologyId?: OntologyId;
41
43
  bootstrap?: WorkspaceBootstrapService;
42
44
  authMode: AuthMode;
43
45
  userRegistry?: UserRegistryFile;
@@ -46,6 +48,7 @@ export interface AppDependencies {
46
48
  accessPolicy?: AccessPolicy;
47
49
  secretStore?: SecretStore;
48
50
  googleOAuth?: GoogleOAuth;
51
+ githubOAuth?: GitHubOAuth;
49
52
  studioUrl?: string;
50
53
  }
51
54
  /**
@@ -75,6 +78,7 @@ export interface ComposeOptions {
75
78
  userDirectory?: UserDirectory;
76
79
  authMode?: AuthMode;
77
80
  workspacesRoot?: AbsolutePath;
81
+ defaultOntologyId?: OntologyId;
78
82
  }
79
83
  export declare function composeApp(options?: ComposeOptions): AppDependencies;
80
84
  //# sourceMappingURL=composeApp.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"composeApp.d.ts","sourceRoot":"","sources":["../src/composeApp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"composeApp.d.ts","sourceRoot":"","sources":["../src/composeApp.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,11 @@ export function composeApp(options = {}) {
10
10
  const modelRepository = options.modelRepository ?? new InMemoryModelRepository();
11
11
  const workspaceRepository = options.workspaceRepository ?? new InMemoryWorkspaceRepository();
12
12
  const pluginRegistry = options.pluginRegistry ?? new PluginRegistry();
13
+ // A build registering exactly one ontology has no ambiguity to resolve,
14
+ // so a scaffold that names none gets that one rather than a hardwired id.
15
+ const ontologies = pluginRegistry.ontologies();
16
+ const defaultOntologyId = options.defaultOntologyId
17
+ ?? (ontologies.length === 1 ? ontologies[0]?.ontologyId : undefined);
13
18
  const eventBus = options.eventBus ?? new InMemoryWorkspaceEventBus();
14
19
  const workspaceService = new WorkspaceService({ workspaceRepository, pluginRegistry });
15
20
  const modelService = new ModelService({ modelRepository });
@@ -118,6 +123,7 @@ export function composeApp(options = {}) {
118
123
  skillRunner: options.skillRunner,
119
124
  runRepository: options.runRepository ?? new NoopRunRepository(),
120
125
  workspacesRoot: options.workspacesRoot ?? join(tmpdir(), 'braid-workspaces'),
126
+ ...(defaultOntologyId ? { defaultOntologyId } : {}),
121
127
  // `composeApp` is the test and in-memory composition entry.
122
128
  // It defaults to local trust, the local-user fallback,
123
129
  // so a test that wires a sessionStore still resolves a caller.
@@ -1 +1 @@
1
- {"version":3,"file":"composeApp.js","sourceRoot":"","sources":["../src/composeApp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"composeApp.js","sourceRoot":"","sources":["../src/composeApp.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,56 @@
1
1
  import type { AgentPlugin, OntologyPlugin, SourceLoaderPlugin, StoragePlugin } from '@braidhq/core';
2
- import type { AgentEffort, StorageKind } from '@braidhq/schema';
2
+ import type { AgentEffort, OntologyId, StorageKind } from '@braidhq/schema';
3
3
  import type { AppDependencies } from './composeApp.js';
4
+ import { PluginRegistry } from '@braidhq/core';
4
5
  import { AgentKind } from '@braidhq/schema';
5
- export interface ComposeFsOptions {
6
+ import { GitHubOAuth } from './infrastructure/oauth/GitHubOAuth.js';
7
+ import { GoogleOAuth } from './infrastructure/oauth/GoogleOAuth.js';
8
+ import { type SecretStore } from './infrastructure/secrets/SecretStore.js';
9
+ export interface ComposeFsRuntimeOptions {
6
10
  readonly braidHome?: string;
7
11
  readonly apiUrl?: string;
8
12
  readonly storageKind?: StorageKind;
9
13
  readonly agentKind?: AgentKind;
10
14
  readonly agentModel?: string;
11
15
  readonly agentEffort?: AgentEffort;
16
+ readonly defaultOntologyId?: OntologyId;
17
+ }
18
+ export interface ExtraPluginOptions {
12
19
  readonly extraStoragePlugins?: readonly StoragePlugin[];
13
20
  readonly extraOntologyPlugins?: readonly OntologyPlugin[];
14
21
  readonly extraSourceLoaderPlugins?: readonly SourceLoaderPlugin[];
15
22
  readonly extraAgentPlugins?: readonly AgentPlugin[];
16
23
  }
24
+ export type ComposeFsOptions = ComposeFsRuntimeOptions & ExtraPluginOptions;
25
+ /**
26
+ * What the fs runtime has already built by the time it asks for a registry.
27
+ * The OAuth-backed loaders need the secret store and the provider clients,
28
+ * both derived from `braidHome` and `apiUrl`, so a caller-supplied plugin
29
+ * reads them from here rather than rebuilding them.
30
+ * `googleOAuth` and `githubOAuth` are absent when their env is unset.
31
+ */
32
+ export interface FsRuntimeContext {
33
+ readonly braidHome: string;
34
+ readonly apiUrl: string;
35
+ readonly secretStore: SecretStore;
36
+ readonly googleOAuth?: GoogleOAuth;
37
+ readonly githubOAuth?: GitHubOAuth;
38
+ }
39
+ /** Yields the registry the fs runtime resolves storage, agent, and ontology from. */
40
+ export type PluginRegistryFactory = (context: FsRuntimeContext) => PluginRegistry | Promise<PluginRegistry>;
41
+ /**
42
+ * The source loaders a default Braid build ships with.
43
+ * Exported so a third-party composition can take the git, github, and drive
44
+ * loaders without inheriting the rest of the coding preset.
45
+ */
46
+ export declare function defaultSourceLoaderPlugins(context: FsRuntimeContext): readonly SourceLoaderPlugin[];
47
+ /**
48
+ * The registry `composeFsApp` runs on, the coding preset's whole bundle.
49
+ * Defaults register first, then the caller's extras,
50
+ * so `extraOntologyPlugins: [c4]` yields both ddd and c4.
51
+ * The active one is chosen per-workspace via PRODUCT.md.ontologyId.
52
+ */
53
+ export declare function defaultPluginRegistry(context: FsRuntimeContext, options?: ExtraPluginOptions): PluginRegistry;
17
54
  /**
18
55
  * Opinionated production composition, the coding preset.
19
56
  * Filesystem-persists workspaces, proposals, and clarifications,
@@ -21,7 +58,16 @@ export interface ComposeFsOptions {
21
58
  * loaders, and the claude-code agent.
22
59
  *
23
60
  * To run a different plugin set, either pass `extraXxxPlugins` and flip
24
- * `storageKind` or `agentKind`, or call `composeApp` with your own registry.
61
+ * `storageKind` or `agentKind`, or hand `composeFsAppWithRegistry` a registry
62
+ * holding only the plugins you want.
25
63
  */
26
64
  export declare function composeFsApp(options?: ComposeFsOptions): Promise<AppDependencies>;
65
+ /**
66
+ * The same filesystem runtime as `composeFsApp`, over a registry you build.
67
+ * Storage and agent resolve from whatever `buildRegistry` registered, under
68
+ * `storageKind` and `agentKind`, so a composition that omits the coding
69
+ * preset's ontology and loaders still gets the subprocess skill runner, the
70
+ * fs unit lister, and every fs repository, and so a batch runs unchanged.
71
+ */
72
+ export declare function composeFsAppWithRegistry(buildRegistry: PluginRegistryFactory, options?: ComposeFsRuntimeOptions): Promise<AppDependencies>;
27
73
  //# sourceMappingURL=composeFsApp.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"composeFsApp.d.ts","sourceRoot":"","sources":["../src/composeFsApp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACnG,OAAO,KAAK,EAAwC,WAAW,EAAE,WAAW,EAAe,MAAM,iBAAiB,CAAA;AAClH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAgBtD,OAAO,EAAW,SAAS,EAAoC,MAAM,iBAAiB,CAAA;AAyCtF,MAAM,WAAW,gBAAgB;IAI/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IAIxB,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAA;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAA;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAA;IAKlC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,SAAS,aAAa,EAAE,CAAA;IACvD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,SAAS,cAAc,EAAE,CAAA;IACzD,QAAQ,CAAC,wBAAwB,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAA;IACjE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,WAAW,EAAE,CAAA;CACpD;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAqR3F"}
1
+ {"version":3,"file":"composeFsApp.d.ts","sourceRoot":"","sources":["../src/composeFsApp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACnG,OAAO,KAAK,EAAwC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAe,MAAM,iBAAiB,CAAA;AAC9H,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAOtD,OAAO,EAGL,cAAc,EAGf,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAW,SAAS,EAAoC,MAAM,iBAAiB,CAAA;AAgBtF,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AAGnE,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,yCAAyC,CAAA;AAyBzF,MAAM,WAAW,uBAAuB;IAItC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IAIxB,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAA;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAA;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAA;IAKlC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAA;CACxC;AAED,MAAM,WAAW,kBAAkB;IAIjC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,SAAS,aAAa,EAAE,CAAA;IACvD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,SAAS,cAAc,EAAE,CAAA;IACzD,QAAQ,CAAC,wBAAwB,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAA;IACjE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,WAAW,EAAE,CAAA;CACpD;AAED,MAAM,MAAM,gBAAgB,GAAG,uBAAuB,GAAG,kBAAkB,CAAA;AAE3E;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAA;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAA;CACnC;AAED,qFAAqF;AACrF,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;AAE3G;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,kBAAkB,EAAE,CAqCnG;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,GAAE,kBAAuB,GAAG,cAAc,CAqBjH;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAE3F;AAED;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,qBAAqB,EACpC,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,eAAe,CAAC,CAqP1B"}
@@ -6,7 +6,6 @@ import { fileURLToPath } from 'node:url';
6
6
  import { claudeCodeAgentPlugin } from '@braidhq/agent-claude-code';
7
7
  import { builtinSkillsRoot, NotFoundError, PluginRegistry, ValidationError, WorkspaceBootstrapService, } from '@braidhq/core';
8
8
  import { InMemoryWorkspaceEventBus } from '@braidhq/core/in-memory';
9
- import { dddOntology } from '@braidhq/ontology-ddd';
10
9
  import { AgentId, AgentKind, StorageKind as StorageKindSchema } from '@braidhq/schema';
11
10
  import { createGoogleDriveLoader } from '@braidhq/source-loader-gdrive';
12
11
  import { gitLoader } from '@braidhq/source-loader-git';
@@ -14,6 +13,7 @@ import { createGithubLoader } from '@braidhq/source-loader-github';
14
13
  import { kuzuStoragePlugin } from '@braidhq/storage-kuzu';
15
14
  import { authenticated, localTrust } from './authMode.js';
16
15
  import { composeApp } from './composeApp.js';
16
+ import { defaultOntologyPlugins } from './defaultOntologyPlugins.js';
17
17
  import { parseBoolEnv } from './infrastructure/_shared/env.js';
18
18
  import { AccessPolicy } from './infrastructure/auth/AccessPolicy.js';
19
19
  import { FsSessionStore } from './infrastructure/auth/SessionStore.js';
@@ -22,11 +22,13 @@ import { GitWorkspaceHistory } from './infrastructure/history/GitWorkspaceHistor
22
22
  import { FsClarificationRepository } from './infrastructure/hitl/FsClarificationRepository.js';
23
23
  import { FsProposalRepository } from './infrastructure/hitl/FsProposalRepository.js';
24
24
  import { FsModelSerializer } from './infrastructure/model/FsModelSerializer.js';
25
+ import { GitHubOAuth } from './infrastructure/oauth/GitHubOAuth.js';
25
26
  import { GoogleOAuth } from './infrastructure/oauth/GoogleOAuth.js';
27
+ import { oauthNamespace } from './infrastructure/oauth/providers.js';
26
28
  import { FsReactorCycleRepository } from './infrastructure/reactor/FsReactorCycleRepository.js';
27
29
  import { FsSecretStore } from './infrastructure/secrets/SecretStore.js';
28
30
  import { FsRunRepository } from './infrastructure/skill/FsRunRepository.js';
29
- import { FsSkillRegistry } from './infrastructure/skill/FsSkillRegistry.js';
31
+ import { BUILTIN_SKILL_NAMESPACE, FsSkillRegistry } from './infrastructure/skill/FsSkillRegistry.js';
30
32
  import { SubprocessSkillRunner } from './infrastructure/skill/SubprocessSkillRunner.js';
31
33
  import { FsSourceUnitDigest } from './infrastructure/source/FsSourceUnitDigest.js';
32
34
  import { FsSourceUnitObservationRepository } from './infrastructure/source/FsSourceUnitObservationRepository.js';
@@ -41,11 +43,71 @@ import { ensureServiceAccount, REACTOR_USER_ID } from './serviceAccounts.js';
41
43
  import { startupBeforeServe } from './startup.js';
42
44
  // The coding preset's default plugin identities, its worldview in one place.
43
45
  // A caller overrides any of these through ComposeFsOptions,
44
- // or drops to composeApp with its own PluginRegistry for a different worldview.
46
+ // or hands composeFsAppWithRegistry its own PluginRegistry,
47
+ // for a different worldview over the same runtime.
45
48
  const DEFAULT_STORAGE_KIND = 'kuzu';
46
49
  const DEFAULT_AGENT_KIND = 'claude-code';
47
50
  const DEFAULT_AGENT_MODEL = 'opus';
48
51
  const DEFAULT_AGENT_EFFORT = 'high';
52
+ /**
53
+ * The source loaders a default Braid build ships with.
54
+ * Exported so a third-party composition can take the git, github, and drive
55
+ * loaders without inheriting the rest of the coding preset.
56
+ */
57
+ export function defaultSourceLoaderPlugins(context) {
58
+ const { secretStore, githubOAuth, googleOAuth } = context;
59
+ return [
60
+ gitLoader,
61
+ createGithubLoader({
62
+ resolveAccessToken: makeOAuthTokenResolver({
63
+ secretStore,
64
+ namespace: oauthNamespace('github'),
65
+ refresh: githubOAuth ? refreshToken => githubOAuth.refreshAccessToken(refreshToken) : undefined,
66
+ notConfigured: sourceId => new ValidationError(`GitHub source "${sourceId}" cannot be loaded: set BRAID_GITHUB_CLIENT_ID and BRAID_GITHUB_CLIENT_SECRET on the server, restart, then reconnect.`),
67
+ notConnected: (workspaceId, sourceId) => new NotFoundError(`GitHub source "${sourceId}" on workspace "${workspaceId}" is not connected. `
68
+ + `Connect it from the source settings in Studio.`),
69
+ }),
70
+ }),
71
+ // Drive is listed even when its OAuth env is unset,
72
+ // so a `kind: gdrive` source resolves a loader instead of failing lookup.
73
+ // The token resolver then throws at provision time,
74
+ // naming the env vars the user has to set.
75
+ createGoogleDriveLoader({
76
+ resolveAccessToken: makeOAuthTokenResolver({
77
+ secretStore,
78
+ namespace: oauthNamespace('google'),
79
+ refresh: googleOAuth ? refreshToken => googleOAuth.refreshAccessToken(refreshToken) : undefined,
80
+ notConfigured: sourceId => new ValidationError(`Google Drive source "${sourceId}" cannot be loaded: set BRAID_GOOGLE_CLIENT_ID and BRAID_GOOGLE_CLIENT_SECRET on the server, restart, then re-sync.`),
81
+ notConnected: (workspaceId, sourceId) => new NotFoundError(`Google Drive source "${sourceId}" on workspace "${workspaceId}" is not connected. `
82
+ + `Connect it from the source settings in Studio.`),
83
+ }),
84
+ }),
85
+ ];
86
+ }
87
+ /**
88
+ * The registry `composeFsApp` runs on, the coding preset's whole bundle.
89
+ * Defaults register first, then the caller's extras,
90
+ * so `extraOntologyPlugins: [c4]` yields both ddd and c4.
91
+ * The active one is chosen per-workspace via PRODUCT.md.ontologyId.
92
+ */
93
+ export function defaultPluginRegistry(context, options = {}) {
94
+ const pluginRegistry = new PluginRegistry();
95
+ pluginRegistry.register(kuzuStoragePlugin);
96
+ for (const plugin of options.extraStoragePlugins ?? [])
97
+ pluginRegistry.register(plugin);
98
+ for (const plugin of defaultOntologyPlugins())
99
+ pluginRegistry.register(plugin);
100
+ for (const plugin of options.extraOntologyPlugins ?? [])
101
+ pluginRegistry.register(plugin);
102
+ for (const plugin of defaultSourceLoaderPlugins(context))
103
+ pluginRegistry.register(plugin);
104
+ for (const plugin of options.extraSourceLoaderPlugins ?? [])
105
+ pluginRegistry.register(plugin);
106
+ pluginRegistry.register(claudeCodeAgentPlugin);
107
+ for (const plugin of options.extraAgentPlugins ?? [])
108
+ pluginRegistry.register(plugin);
109
+ return pluginRegistry;
110
+ }
49
111
  /**
50
112
  * Opinionated production composition, the coding preset.
51
113
  * Filesystem-persists workspaces, proposals, and clarifications,
@@ -53,9 +115,20 @@ const DEFAULT_AGENT_EFFORT = 'high';
53
115
  * loaders, and the claude-code agent.
54
116
  *
55
117
  * To run a different plugin set, either pass `extraXxxPlugins` and flip
56
- * `storageKind` or `agentKind`, or call `composeApp` with your own registry.
118
+ * `storageKind` or `agentKind`, or hand `composeFsAppWithRegistry` a registry
119
+ * holding only the plugins you want.
57
120
  */
58
121
  export async function composeFsApp(options = {}) {
122
+ return composeFsAppWithRegistry(context => defaultPluginRegistry(context, options), options);
123
+ }
124
+ /**
125
+ * The same filesystem runtime as `composeFsApp`, over a registry you build.
126
+ * Storage and agent resolve from whatever `buildRegistry` registered, under
127
+ * `storageKind` and `agentKind`, so a composition that omits the coding
128
+ * preset's ontology and loaders still gets the subprocess skill runner, the
129
+ * fs unit lister, and every fs repository, and so a batch runs unchanged.
130
+ */
131
+ export async function composeFsAppWithRegistry(buildRegistry, options = {}) {
59
132
  const braidHome = options.braidHome ?? process.env.BRAID_HOME ?? join(homedir(), '.braid');
60
133
  const apiUrl = options.apiUrl ?? 'http://localhost:4321';
61
134
  const secretStore = new FsSecretStore(join(braidHome, 'secrets'));
@@ -71,6 +144,16 @@ export async function composeFsApp(options = {}) {
71
144
  loginRedirectUri: googleLoginRedirect,
72
145
  })
73
146
  : undefined;
147
+ const githubClientId = process.env.BRAID_GITHUB_CLIENT_ID;
148
+ const githubClientSecret = process.env.BRAID_GITHUB_CLIENT_SECRET;
149
+ const githubRedirect = process.env.BRAID_GITHUB_REDIRECT_URI ?? `${apiUrl}/oauth/github/callback`;
150
+ const githubOAuth = githubClientId && githubClientSecret
151
+ ? new GitHubOAuth({
152
+ clientId: githubClientId,
153
+ clientSecret: githubClientSecret,
154
+ redirectUri: githubRedirect,
155
+ })
156
+ : undefined;
74
157
  const registry = new WorkspaceRegistryFile(join(braidHome, 'workspaces.json'));
75
158
  const workspaceRepository = new FsWorkspaceRepository({ registry });
76
159
  // Server-side user roster, distinct from any workspace's git history.
@@ -113,53 +196,13 @@ export async function composeFsApp(options = {}) {
113
196
  };
114
197
  const proposalRepository = new FsProposalRepository({ workspaceRoots });
115
198
  const clarificationRepository = new FsClarificationRepository({ workspaceRoots });
116
- // Plugin registration. Defaults bundle first, then extras,
117
- // so a caller passing `extraOntologyPlugins: [c4]` gets both ddd and c4.
118
- // The active one is chosen per-workspace via PRODUCT.md.ontologyId.
119
- const pluginRegistry = new PluginRegistry();
120
- pluginRegistry.register(kuzuStoragePlugin);
121
- for (const plugin of options.extraStoragePlugins ?? [])
122
- pluginRegistry.register(plugin);
123
- pluginRegistry.register(dddOntology);
124
- for (const plugin of options.extraOntologyPlugins ?? [])
125
- pluginRegistry.register(plugin);
126
- pluginRegistry.register(gitLoader);
127
- pluginRegistry.register(createGithubLoader());
128
- for (const plugin of options.extraSourceLoaderPlugins ?? [])
129
- pluginRegistry.register(plugin);
130
- pluginRegistry.register(claudeCodeAgentPlugin);
131
- for (const plugin of options.extraAgentPlugins ?? [])
132
- pluginRegistry.register(plugin);
133
- // The gdrive loader is always registered,
134
- // so a `kind: gdrive` source doesn't crash at plugin lookup.
135
- // If OAuth env vars aren't configured,
136
- // the token resolver throws an actionable error at provision time,
137
- // so the user knows exactly what to set.
138
- const oauth = googleOAuth;
139
- pluginRegistry.register(createGoogleDriveLoader({
140
- resolveAccessToken: async ({ workspaceId, sourceId }) => {
141
- if (!oauth) {
142
- throw new ValidationError(`Google Drive source "${sourceId}" cannot be loaded: set BRAID_GOOGLE_CLIENT_ID and BRAID_GOOGLE_CLIENT_SECRET on the server, restart, then re-sync.`);
143
- }
144
- const key = `${workspaceId}--${sourceId}`;
145
- const stored = await secretStore.read('oauth-google', key);
146
- if (!stored) {
147
- throw new NotFoundError(`Google Drive source "${sourceId}" on workspace "${workspaceId}" is not connected. `
148
- + `Authorise via POST /oauth/google/start.`);
149
- }
150
- // 60-second skew, so we don't hand out a token about to expire mid-request.
151
- const stillValidUntil = new Date(stored.expiresAt).getTime() - 60_000;
152
- if (Date.now() < stillValidUntil)
153
- return stored.accessToken;
154
- const refreshed = await oauth.refreshAccessToken(stored.refreshToken);
155
- await secretStore.write('oauth-google', key, {
156
- ...stored,
157
- accessToken: refreshed.accessToken,
158
- expiresAt: refreshed.expiresAt,
159
- });
160
- return refreshed.accessToken;
161
- },
162
- }));
199
+ const pluginRegistry = await buildRegistry({
200
+ braidHome,
201
+ apiUrl,
202
+ secretStore,
203
+ ...(googleOAuth ? { googleOAuth } : {}),
204
+ ...(githubOAuth ? { githubOAuth } : {}),
205
+ });
163
206
  // Resolve the active storage plugin and ask it for a ModelRepository.
164
207
  const storageKind = StorageKindSchema.parse(options.storageKind ?? process.env.BRAID_STORAGE_KIND ?? DEFAULT_STORAGE_KIND);
165
208
  const modelRepository = await pluginRegistry.requireStoragePlugin(storageKind).createModelRepository({ kind: storageKind, config: {} }, {
@@ -206,16 +249,16 @@ export async function composeFsApp(options = {}) {
206
249
  console.warn('[braid] `uv` not found on PATH; the built-in braid-core MCP gateway will not be available. '
207
250
  + 'Install via `brew install uv` or https://docs.astral.sh/uv/ to enable.');
208
251
  }
209
- // Build the list of reference dirs symlinked into every skill session:
210
- // - builtin `shared/` from @braidhq/core,
211
- // format docs for Proposal, Clarification, Validator, content conventions,
212
- // and drift-detection guidance.
213
- // - whatever each registered plugin contributes,
214
- // for example the concept doc from ontology-ddd.
252
+ // Reference dirs mounted into every skill session,
253
+ // keyed by the namespace that owns them, so each stays paired with its skills.
254
+ // Core's `shared/` lands under the builtin namespace,
255
+ // carrying the Proposal, Clarification, Validator, batch-plan, drift contracts.
256
+ // Each plugin's own dir lands under its namespace,
257
+ // the DDD concept doc under `ddd` for example.
215
258
  // Plugin contributions resolve `URL` to an absolute path.
216
259
  const pluginReferenceDirs = pluginRegistry.pluginReferenceDirs().map((ref) => {
217
260
  const dir = typeof ref.directory === 'string' ? ref.directory : fileURLToPath(ref.directory);
218
- return { name: ref.name, path: dir };
261
+ return { skillNamespace: ref.skillNamespace, path: dir };
219
262
  });
220
263
  const skillRunner = new SubprocessSkillRunner({
221
264
  skillRegistry,
@@ -228,9 +271,16 @@ export async function composeFsApp(options = {}) {
228
271
  ? { coreGateway: { specUrl: `${apiUrl}/openapi.json`, uvxBin } }
229
272
  : {}),
230
273
  referenceDirs: [
231
- { name: 'shared', path: join(builtinSkillsRoot, 'shared') },
274
+ { skillNamespace: BUILTIN_SKILL_NAMESPACE, path: join(builtinSkillsRoot, 'shared') },
232
275
  ...pluginReferenceDirs,
233
276
  ],
277
+ // Resolve the workspace's active ontology to its declared source roles.
278
+ // The runner serialises these into BRAID_SOURCE_ROLES,
279
+ // so a generic prompt reads the role vocabulary instead of naming role ids.
280
+ resolveSourceRoles: (workspace) => {
281
+ const ontology = pluginRegistry.findOntology(workspace.productManifest.ontologyId);
282
+ return ontology?.sourceRoles ?? [];
283
+ },
234
284
  });
235
285
  // Shared by WorkspaceBootstrapService (boot reconciliation),
236
286
  // and HITLService (per-mutation commits).
@@ -259,6 +309,7 @@ export async function composeFsApp(options = {}) {
259
309
  bootstrap,
260
310
  batchPlanRepository: new FsBatchPlanRepository(),
261
311
  unitLister: workspace => listUnitItems(workspace, unitBearingRolesOf(pluginRegistry, workspace)),
312
+ ...(options.defaultOntologyId ? { defaultOntologyId: options.defaultOntologyId } : {}),
262
313
  // The reactor has no human caller, so it acts as the `reactor` service account,
263
314
  // minting a short-lived session so its API calls authenticate.
264
315
  reactorToken: async () => (await sessionStore.issue(REACTOR_USER_ID, { ttlSeconds: 3600 })).token,
@@ -290,6 +341,42 @@ export async function composeFsApp(options = {}) {
290
341
  accessPolicy,
291
342
  studioUrl,
292
343
  ...(googleOAuth ? { googleOAuth } : {}),
344
+ ...(githubOAuth ? { githubOAuth } : {}),
345
+ };
346
+ }
347
+ /**
348
+ * Build a token resolver for an OAuth-backed loader.
349
+ * Returns a still-valid access token, or refreshes when it is near expiry.
350
+ * A failed refresh flags the source `needsAuth` so Studio prompts a reconnect,
351
+ * a fresh refresh clears that flag.
352
+ * `refresh` is absent when the provider's server env is unset,
353
+ * then the resolver throws `notConfigured`.
354
+ */
355
+ function makeOAuthTokenResolver(deps) {
356
+ return async ({ workspaceId, sourceId }) => {
357
+ if (!deps.refresh)
358
+ throw deps.notConfigured(sourceId);
359
+ const key = `${workspaceId}--${sourceId}`;
360
+ const stored = await deps.secretStore.read(deps.namespace, key);
361
+ if (!stored)
362
+ throw deps.notConnected(workspaceId, sourceId);
363
+ // 60-second skew, so we don't hand out a token about to expire mid-request.
364
+ const stillValidUntil = new Date(stored.expiresAt).getTime() - 60_000;
365
+ if (Date.now() < stillValidUntil)
366
+ return stored.accessToken;
367
+ try {
368
+ // A fresh set clears any prior needs-auth marker.
369
+ // GitHub rotates its refresh token, so spreading `refreshed` keeps it.
370
+ const refreshed = await deps.refresh(stored.refreshToken);
371
+ await deps.secretStore.write(deps.namespace, key, { ...stored, ...refreshed, needsAuth: false });
372
+ return refreshed.accessToken;
373
+ }
374
+ catch (error) {
375
+ // The refresh token is dead, revoked or expired.
376
+ // Flag the source so Studio prompts a reconnect instead of only logging.
377
+ await deps.secretStore.write(deps.namespace, key, { ...stored, needsAuth: true });
378
+ throw error;
379
+ }
293
380
  };
294
381
  }
295
382
  function parseCsv(input) {