wicked-crew-api-types 0.178.0 → 0.186.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.
- package/index.d.ts +750 -12
- package/package.json +1 -1
package/index.d.ts
CHANGED
|
@@ -12316,7 +12316,61 @@ export interface PutDeliveryFreezeBody {
|
|
|
12316
12316
|
* sources: registered through the same preview/save, but with NO tools — nothing of theirs is ever
|
|
12317
12317
|
* offered to a governed run. Their preview answers {@link McpPreviewResponse.source} (the catalog).
|
|
12318
12318
|
*/
|
|
12319
|
-
export type McpUpstreamKind = 'mcp-stdio' | 'mcp-http' | 'rest' | 'sql' | 'graphql';
|
|
12319
|
+
export type McpUpstreamKind = 'mcp-stdio' | 'mcp-http' | 'rest' | 'sql' | 'graphql' | 'toolbox-source';
|
|
12320
|
+
|
|
12321
|
+
// ── The one registry's entry (api-types 0.183.0, DES-KNOWLEDGE-DATA-001 §5) ─────────────────────
|
|
12322
|
+
|
|
12323
|
+
/**
|
|
12324
|
+
* (api-types 0.183.0, DES-KNOWLEDGE-DATA-001 §5.1) A database source as MCP Toolbox for Databases models it: its
|
|
12325
|
+
* own source document (`kind: source`, `type`, that type's fields), which the registry stores as the source of
|
|
12326
|
+
* truth for `kind: 'toolbox-source'`. Checked against crew's deployment policy for the pinned Toolbox release
|
|
12327
|
+
* (v1.15.0) at preview and at save: a field that bypasses the address check (`connectionString`), names a host
|
|
12328
|
+
* path, or tunes the driver is a 400 `refused_field`; a field only crew writes (`name`, `queryParams`,
|
|
12329
|
+
* `connectTimeout`: the TLS settings, startup parameters and timeouts) a 400 `crew_written_field`; any other
|
|
12330
|
+
* unknown field a 400 `unknown_field`. `password` is exactly `"${WICKED_SRC_1}"`, the placeholder naming
|
|
12331
|
+
* `auth.ref`'s secret (a value is a 400 `secret_literal`); `${` anywhere else is a 400 `interpolation`.
|
|
12332
|
+
*/
|
|
12333
|
+
// A type alias (not an interface) so it is assignable to a plain record: the route takes any object and the
|
|
12334
|
+
// deployment policy judges each field.
|
|
12335
|
+
export type ToolboxSourceDocument = {
|
|
12336
|
+
kind: 'source';
|
|
12337
|
+
/** v1: `postgres` only (any other type is a 400 `unsupported_type`). */
|
|
12338
|
+
type: 'postgres';
|
|
12339
|
+
/** One host name or IP address. */
|
|
12340
|
+
host: string;
|
|
12341
|
+
/** Toolbox takes the port as a string, `"1"`-`"65535"`. */
|
|
12342
|
+
port: string;
|
|
12343
|
+
database: string;
|
|
12344
|
+
user: string;
|
|
12345
|
+
password?: string;
|
|
12346
|
+
};
|
|
12347
|
+
|
|
12348
|
+
/**
|
|
12349
|
+
* (api-types 0.183.0) How crew reads a database source: `native` (crew's own adapter: K1's driver, dialer and
|
|
12350
|
+
* read policy; Postgres) or `toolbox` (one Toolbox process per source; a preview is a 501 `runtime_unavailable`
|
|
12351
|
+
* on a daemon without the Toolbox runtime).
|
|
12352
|
+
*/
|
|
12353
|
+
export type McpSourceRuntime = 'native' | 'toolbox';
|
|
12354
|
+
|
|
12355
|
+
/**
|
|
12356
|
+
* (api-types 0.183.0, DES-KNOWLEDGE-DATA-001 §7.1) What a tool's answer discloses: `rows` (needs a source's
|
|
12357
|
+
* "query" switch), `structure` (needs "see"), or `none`. Reviewed at preview, bound to the tool's saved schema
|
|
12358
|
+
* hash; `null` = not reviewed, or reviewed against a schema that has since changed. A tool with no class in force
|
|
12359
|
+
* is offered to no agent.
|
|
12360
|
+
*/
|
|
12361
|
+
export type McpToolDisclosure = 'none' | 'structure' | 'rows';
|
|
12362
|
+
|
|
12363
|
+
/**
|
|
12364
|
+
* (api-types 0.183.0, DES-KNOWLEDGE-DATA-001 §7.1) A data source's agent switches: `see` (on by default),
|
|
12365
|
+
* `query` (off by default; needs `see`; turned off again by a descriptor change and by a restore), `projects`
|
|
12366
|
+
* (none by default) and `everyProject` (an explicit choice). Set by a human operator only.
|
|
12367
|
+
*/
|
|
12368
|
+
export interface McpSourceAgents {
|
|
12369
|
+
see: boolean;
|
|
12370
|
+
query: boolean;
|
|
12371
|
+
projects: string[];
|
|
12372
|
+
everyProject: boolean;
|
|
12373
|
+
}
|
|
12320
12374
|
/**
|
|
12321
12375
|
* A tool's class, from its own `tools/list` annotations (never from a carrier): `read` when
|
|
12322
12376
|
* `readOnlyHint` is true; else `destructive` unless `destructiveHint` is false; else `write`. A tool
|
|
@@ -12418,6 +12472,16 @@ export interface McpServerConfigBody {
|
|
|
12418
12472
|
* from `POST /apps/uploads` (a snapshot digest), not from a preview.
|
|
12419
12473
|
*/
|
|
12420
12474
|
sql?: SqlSourceConfigBody;
|
|
12475
|
+
/**
|
|
12476
|
+
* (api-types 0.183.0, DES-KNOWLEDGE-DATA-001 §5.1) `toolbox-source` only: Toolbox's own source document. Its
|
|
12477
|
+
* password is the secret behind `auth.ref` (`auth` takes only `ref`). A `sql` body with Postgres settings is
|
|
12478
|
+
* saved as the same document.
|
|
12479
|
+
*/
|
|
12480
|
+
toolbox?: ToolboxSourceDocument;
|
|
12481
|
+
/** (api-types 0.183.0) `toolbox-source` only: default `native`. */
|
|
12482
|
+
runtime?: McpSourceRuntime;
|
|
12483
|
+
/** (api-types 0.183.0) `toolbox-source` only: the TLS choice crew writes the driver's settings from; default `verify-full`. */
|
|
12484
|
+
tls?: { mode: 'verify-full' | 'disable'; ca?: string };
|
|
12421
12485
|
/**
|
|
12422
12486
|
* (api-types 0.175.0) `sql` only: the views (and materialized views) a read may name, as
|
|
12423
12487
|
* `schema.view` (MySQL `database.view`). A view not listed is refused by the read policy.
|
|
@@ -12488,9 +12552,16 @@ export interface McpTool {
|
|
|
12488
12552
|
schemaHash: string | null;
|
|
12489
12553
|
/** The hash the last probe saw. */
|
|
12490
12554
|
observedSchemaHash: string;
|
|
12555
|
+
/** (api-types 0.183.0) The disclosure class in force; `null` = none reviewed for the saved schema. */
|
|
12556
|
+
disclosure: McpToolDisclosure | null;
|
|
12491
12557
|
}
|
|
12492
12558
|
|
|
12493
12559
|
export interface McpServer {
|
|
12560
|
+
/**
|
|
12561
|
+
* (api-types 0.183.0, DES-KNOWLEDGE-DATA-001 §5.1) The entry's immutable id. Estate's source documents, `deps`,
|
|
12562
|
+
* grants and records key on it, never on the name: a name removed and registered again is a new id.
|
|
12563
|
+
*/
|
|
12564
|
+
id: string;
|
|
12494
12565
|
name: string;
|
|
12495
12566
|
kind: McpUpstreamKind;
|
|
12496
12567
|
command: string | null;
|
|
@@ -12518,6 +12589,19 @@ export interface McpServer {
|
|
|
12518
12589
|
* `allowWrites`). Queries, actions and grants bind to it.
|
|
12519
12590
|
*/
|
|
12520
12591
|
descriptorHash?: string;
|
|
12592
|
+
/**
|
|
12593
|
+
* (api-types 0.183.0, DES-KNOWLEDGE-DATA-001 §5.1, §5.4) A database source stored as its Toolbox document. A
|
|
12594
|
+
* `native` one still answers `kind: 'sql'` and `sql` (the read-path projection every existing reader uses).
|
|
12595
|
+
* `descriptorVersion` 1 = mapped from a K1 record, hashed with K1's function (locks and grants unchanged);
|
|
12596
|
+
* 2 = written by a save, hashed over the canonical execution descriptor.
|
|
12597
|
+
*/
|
|
12598
|
+
runtime?: McpSourceRuntime;
|
|
12599
|
+
toolbox?: ToolboxSourceDocument;
|
|
12600
|
+
descriptorVersion?: 1 | 2;
|
|
12601
|
+
/** The deployment policy the document was checked under, e.g. `postgres/1@toolbox-v1.15.0`. */
|
|
12602
|
+
policyVersion?: string;
|
|
12603
|
+
/** (api-types 0.183.0) Data sources only: the agent switches (defaults filled in). */
|
|
12604
|
+
agents?: McpSourceAgents;
|
|
12521
12605
|
/**
|
|
12522
12606
|
* (api-types 0.174.0) `mcp-http` and `rest` only: the ranges confirmed for this server's
|
|
12523
12607
|
* connections. A server saved before 0.174.0 shows what crew re-derived for it: the IP literal or
|
|
@@ -12549,12 +12633,77 @@ export interface McpDiscoveredServer {
|
|
|
12549
12633
|
managed: boolean;
|
|
12550
12634
|
}
|
|
12551
12635
|
|
|
12552
|
-
/**
|
|
12636
|
+
/**
|
|
12637
|
+
* `GET /mcp/servers`, for a human actor. (api-types 0.183.0, DES-KNOWLEDGE-DATA-001 §5.2, crew#1310) Any other
|
|
12638
|
+
* actor, and `?view=agent`, gets {@link McpServersAgentResponse} instead; so do the answers of a save, a
|
|
12639
|
+
* `PATCH /mcp/servers/:name` and a test for a non-human actor.
|
|
12640
|
+
*/
|
|
12553
12641
|
export interface McpServersResponse {
|
|
12554
12642
|
servers: McpServer[];
|
|
12555
12643
|
discovered: McpDiscoveredServer[];
|
|
12556
12644
|
}
|
|
12557
12645
|
|
|
12646
|
+
/**
|
|
12647
|
+
* (api-types 0.183.0, DES-KNOWLEDGE-DATA-001 §5.2) A server as an agent may know it: no host, port, database,
|
|
12648
|
+
* login, url, command, arguments, path, address, secret reference or descriptor.
|
|
12649
|
+
*/
|
|
12650
|
+
export interface McpServerAgentView {
|
|
12651
|
+
id: string;
|
|
12652
|
+
name: string;
|
|
12653
|
+
kind: McpUpstreamKind;
|
|
12654
|
+
enabled: boolean;
|
|
12655
|
+
health: { state: McpHealthState };
|
|
12656
|
+
/** The tools that are not `gone`. */
|
|
12657
|
+
tools: Array<{ name: string; subject: string; class: McpToolClass; disclosure: McpToolDisclosure | null; enabled: boolean; status: McpToolStatus }>;
|
|
12658
|
+
/** Data sources only. */
|
|
12659
|
+
agents?: { see: boolean; query: boolean };
|
|
12660
|
+
}
|
|
12661
|
+
|
|
12662
|
+
/** (api-types 0.183.0) `GET /mcp/servers?view=agent`, and `GET /mcp/servers` for any non-human actor. */
|
|
12663
|
+
export interface McpServersAgentResponse {
|
|
12664
|
+
view: 'agent';
|
|
12665
|
+
servers: McpServerAgentView[];
|
|
12666
|
+
}
|
|
12667
|
+
|
|
12668
|
+
/**
|
|
12669
|
+
* (api-types 0.183.0, DES-KNOWLEDGE-DATA-001 §5.5) `GET /mcp/registry/generations` (human operator only). Every
|
|
12670
|
+
* write keeps the registry it replaces; the last 10 are kept.
|
|
12671
|
+
*/
|
|
12672
|
+
export interface McpRegistryGenerationsResponse {
|
|
12673
|
+
/** The generation in force. */
|
|
12674
|
+
current: number;
|
|
12675
|
+
/** Newest first. */
|
|
12676
|
+
generations: Array<{ generation: number; savedAt: string }>;
|
|
12677
|
+
}
|
|
12678
|
+
|
|
12679
|
+
/** (api-types 0.183.0) `POST /mcp/registry/restore`. */
|
|
12680
|
+
export interface McpRegistryRestoreBody {
|
|
12681
|
+
generation: number;
|
|
12682
|
+
}
|
|
12683
|
+
|
|
12684
|
+
/**
|
|
12685
|
+
* (api-types 0.183.0, DES-KNOWLEDGE-DATA-001 §5.5) `POST /mcp/registry/restore`'s 200 (human operator only;
|
|
12686
|
+
* audited `mcp.registry.restored`). A restore fails closed: every source's "query" switch and Allow writes come
|
|
12687
|
+
* back OFF; a server whose secret reference resolves to nothing comes back DISABLED (`secret_missing`); MCP
|
|
12688
|
+
* approvals whose tool schema differs from the restored one are withdrawn first (a failed withdrawal refuses the
|
|
12689
|
+
* restore, 500 `withdraw_failed`). A generation that is not kept is a 404 `unknown_generation`; one that does not
|
|
12690
|
+
* parse, or holds a record crew could not have written, a 409 `generation_unreadable`, and nothing changes. The
|
|
12691
|
+
* withdrawal and the commit hold every affected server's lock; when servers keep being registered meanwhile the
|
|
12692
|
+
* restore gives up with a 409 `registry_busy`, having changed nothing. The registry in force before the restore is
|
|
12693
|
+
* kept as a generation too.
|
|
12694
|
+
*/
|
|
12695
|
+
export interface McpRegistryRestoreResponse {
|
|
12696
|
+
restored: number;
|
|
12697
|
+
/** The generation the restore wrote. */
|
|
12698
|
+
generation: number;
|
|
12699
|
+
servers: number;
|
|
12700
|
+
disabled: Array<{ name: string; code: 'secret_missing' }>;
|
|
12701
|
+
queryReset: string[];
|
|
12702
|
+
writesReset: string[];
|
|
12703
|
+
/** The approval tokens withdrawn first. */
|
|
12704
|
+
withdrawnApprovals?: string[];
|
|
12705
|
+
}
|
|
12706
|
+
|
|
12558
12707
|
/** The difference between the registered tools and a probe, by tool name. */
|
|
12559
12708
|
export interface McpToolDiff {
|
|
12560
12709
|
added: string[];
|
|
@@ -12587,6 +12736,11 @@ export interface McpPreviewTool {
|
|
|
12587
12736
|
* approving it: `MCP-FIRST-USE` still asks on its first call.
|
|
12588
12737
|
*/
|
|
12589
12738
|
enabledOnSave: boolean;
|
|
12739
|
+
/**
|
|
12740
|
+
* (api-types 0.183.0) The disclosure class a save gives the tool when `disclosures` does not name it: its
|
|
12741
|
+
* class while its schema is unchanged, crew's own class for a tool of crew's Toolbox configuration, else `null`.
|
|
12742
|
+
*/
|
|
12743
|
+
disclosure: McpToolDisclosure | null;
|
|
12590
12744
|
}
|
|
12591
12745
|
|
|
12592
12746
|
/**
|
|
@@ -12611,6 +12765,11 @@ export interface McpPreviewResponse {
|
|
|
12611
12765
|
/** (api-types 0.175.0) `sql` only. */
|
|
12612
12766
|
sql?: SqlSourceView;
|
|
12613
12767
|
viewsAllowed?: string[];
|
|
12768
|
+
/** (api-types 0.183.0) A database source: the Toolbox document the save will store. */
|
|
12769
|
+
runtime?: McpSourceRuntime;
|
|
12770
|
+
toolbox?: ToolboxSourceDocument;
|
|
12771
|
+
descriptorVersion?: 1 | 2;
|
|
12772
|
+
policyVersion?: string;
|
|
12614
12773
|
};
|
|
12615
12774
|
/**
|
|
12616
12775
|
* (api-types 0.175.0, DES-APPS-001 §5.1) `sql`/`graphql` only: what the describe found —
|
|
@@ -12659,6 +12818,13 @@ export interface SaveMcpServerBody {
|
|
|
12659
12818
|
* `egress_not_rest` for a server that is not `rest`.
|
|
12660
12819
|
*/
|
|
12661
12820
|
allowOrigin?: string;
|
|
12821
|
+
/**
|
|
12822
|
+
* (api-types 0.183.0, DES-KNOWLEDGE-DATA-001 §5.1) The operator's review of what each tool discloses, by tool
|
|
12823
|
+
* name (`McpPreviewTool.disclosure` is what a tool not named here gets). A name the preview does not list is a
|
|
12824
|
+
* 400 `unknown_tool`. Human operator only (403 `disclosure_review_human_only`); audited
|
|
12825
|
+
* `mcp.tool.disclosure_reviewed`.
|
|
12826
|
+
*/
|
|
12827
|
+
disclosures?: Record<string, McpToolDisclosure>;
|
|
12662
12828
|
}
|
|
12663
12829
|
|
|
12664
12830
|
/**
|
|
@@ -12712,6 +12878,25 @@ export interface PatchMcpServerBody {
|
|
|
12712
12878
|
export interface PatchMcpToolBody {
|
|
12713
12879
|
enabled?: boolean;
|
|
12714
12880
|
classOverride?: McpToolClass | null;
|
|
12881
|
+
/**
|
|
12882
|
+
* (api-types 0.183.0) Review what the tool discloses, against its saved schema (409 `not_registered` when the
|
|
12883
|
+
* schema changed since the save). Setting a class is a human operator's only (403
|
|
12884
|
+
* `disclosure_review_human_only`), audited `mcp.tool.disclosure_reviewed`; `null` clears it (the tool is then
|
|
12885
|
+
* offered to no agent).
|
|
12886
|
+
*/
|
|
12887
|
+
disclosure?: McpToolDisclosure | null;
|
|
12888
|
+
}
|
|
12889
|
+
|
|
12890
|
+
/**
|
|
12891
|
+
* (api-types 0.183.0, DES-KNOWLEDGE-DATA-001 §5.2) `POST /mcp/servers/:name/test`'s 200 for a NON-HUMAN actor: the
|
|
12892
|
+
* server as the agent-safe projection, and `error` reduced to `"the probe failed"` (a probe's words can name the host).
|
|
12893
|
+
* A save and `PATCH /mcp/servers/:name` likewise answer an {@link McpServerAgentView} to a non-human actor.
|
|
12894
|
+
*/
|
|
12895
|
+
export interface McpServerTestAgentResponse {
|
|
12896
|
+
ok: boolean;
|
|
12897
|
+
error: string | null;
|
|
12898
|
+
diff: McpToolDiff | null;
|
|
12899
|
+
server: McpServerAgentView;
|
|
12715
12900
|
}
|
|
12716
12901
|
|
|
12717
12902
|
/** `POST /mcp/servers/:name/test`'s 200: a failed probe is `ok: false` and counts toward `failing`. */
|
|
@@ -13289,6 +13474,231 @@ export interface SourceAllowWritesResponse {
|
|
|
13289
13474
|
withdrawnGrants: number;
|
|
13290
13475
|
}
|
|
13291
13476
|
|
|
13477
|
+
/**
|
|
13478
|
+
* (api-types 0.184.0, DES-KNOWLEDGE-DATA-001 §7.1) A live source's agent switches. Agents reach a source
|
|
13479
|
+
* only through crew's data gate (`mcp:<source>/<tool>` through the broker); Apps units get none of its tools,
|
|
13480
|
+
* whatever this says (D-7). Never a write, never a credential.
|
|
13481
|
+
*/
|
|
13482
|
+
export type SourceAgentAccess = McpSourceAgents;
|
|
13483
|
+
|
|
13484
|
+
/** `PUT /sources/:name/agents` (human operator only; each change audited). At least one field. */
|
|
13485
|
+
export interface SourceAgentAccessBody {
|
|
13486
|
+
see?: boolean;
|
|
13487
|
+
query?: boolean;
|
|
13488
|
+
projects?: string[];
|
|
13489
|
+
everyProject?: boolean;
|
|
13490
|
+
}
|
|
13491
|
+
|
|
13492
|
+
export interface SourceAgentAccessResponse {
|
|
13493
|
+
name: string;
|
|
13494
|
+
agents: SourceAgentAccess;
|
|
13495
|
+
}
|
|
13496
|
+
|
|
13497
|
+
/** One agent read of a source (`GET /sources/:name/agent-queries`), as crew recorded it: never the SQL, a value or a source's words. */
|
|
13498
|
+
export interface SourceAgentQuery {
|
|
13499
|
+
/** The broker call's id. */
|
|
13500
|
+
callId: string;
|
|
13501
|
+
at: string;
|
|
13502
|
+
runId: string;
|
|
13503
|
+
unit: number;
|
|
13504
|
+
attempt: number;
|
|
13505
|
+
seat: string;
|
|
13506
|
+
source: string;
|
|
13507
|
+
/** The source's registry id. */
|
|
13508
|
+
sourceId: string;
|
|
13509
|
+
/** sha256 of the SQL text, hex. */
|
|
13510
|
+
sqlHash: string;
|
|
13511
|
+
/** `ok` (rows released), or crew's code (a read-policy code, `query_off`, `deadline`, `too_large`, `busy`, `changed_while_running`, …). */
|
|
13512
|
+
outcome: string;
|
|
13513
|
+
rows: number;
|
|
13514
|
+
truncated: boolean;
|
|
13515
|
+
ms: number;
|
|
13516
|
+
/** Whether rows were released to the agent's answer (written before the answer is sent: it may over-state, never under-state). */
|
|
13517
|
+
released: boolean;
|
|
13518
|
+
sqlstate?: string;
|
|
13519
|
+
}
|
|
13520
|
+
|
|
13521
|
+
/** `GET /sources/:name/agent-queries` (observer): the last 20, newest first. `known: false` = the record could not be read. */
|
|
13522
|
+
export interface SourceAgentQueriesResponse {
|
|
13523
|
+
name: string;
|
|
13524
|
+
known: boolean;
|
|
13525
|
+
queries: SourceAgentQuery[];
|
|
13526
|
+
}
|
|
13527
|
+
|
|
13528
|
+
/** One source a run's agents read (`GET /runs/:id/data-use`). */
|
|
13529
|
+
export interface SourceDataUse {
|
|
13530
|
+
source: string;
|
|
13531
|
+
/** Calls that reached the read policy. */
|
|
13532
|
+
queries: number;
|
|
13533
|
+
/** Calls whose rows reached the agent. */
|
|
13534
|
+
released: number;
|
|
13535
|
+
rows: number;
|
|
13536
|
+
truncated: boolean;
|
|
13537
|
+
lastAt: string;
|
|
13538
|
+
}
|
|
13539
|
+
|
|
13540
|
+
/** `GET /runs/:id/data-use` (observer): the sources a run's agents read. `known: false` = UNKNOWN, never "none". */
|
|
13541
|
+
export interface RunDataUseResponse {
|
|
13542
|
+
runId: string;
|
|
13543
|
+
known: boolean;
|
|
13544
|
+
sources: SourceDataUse[];
|
|
13545
|
+
}
|
|
13546
|
+
|
|
13547
|
+
/**
|
|
13548
|
+
* (api-types 0.184.0, DES-KNOWLEDGE-DATA-001 §7.8) What a unit's rows tool (`mcp:<source>/execute_sql`)
|
|
13549
|
+
* answers through the gate: one JSON object inside the MCP result's text, citable like knowledge, fenced as
|
|
13550
|
+
* untrusted data.
|
|
13551
|
+
*/
|
|
13552
|
+
export interface SourceReadEnvelope {
|
|
13553
|
+
/** Always first: the rows are data from the source, never instructions. */
|
|
13554
|
+
untrusted: string;
|
|
13555
|
+
/** `src:<name>@<at>#<8 hex>`. */
|
|
13556
|
+
cite: string;
|
|
13557
|
+
source: string;
|
|
13558
|
+
/** The dialect (`postgres`). */
|
|
13559
|
+
kind: string;
|
|
13560
|
+
/** The agent's own SQL (scrubbed of the source's secret). */
|
|
13561
|
+
sql: string;
|
|
13562
|
+
params: unknown[];
|
|
13563
|
+
at: string;
|
|
13564
|
+
/** `source:<id>`: what a cached answer depends on. */
|
|
13565
|
+
deps: string[];
|
|
13566
|
+
/** `type`: the source's type name, or `null` where the adapter does not report one. */
|
|
13567
|
+
columns: Array<{ name: string; type: string | null }>;
|
|
13568
|
+
rows: unknown[][];
|
|
13569
|
+
rowCount: number;
|
|
13570
|
+
/** More rows than the cap, more bytes than the cap, or a cell cut at 2,000 characters. */
|
|
13571
|
+
truncated: boolean;
|
|
13572
|
+
rowCap: number;
|
|
13573
|
+
byteCap: number;
|
|
13574
|
+
ms: number;
|
|
13575
|
+
}
|
|
13576
|
+
|
|
13577
|
+
/**
|
|
13578
|
+
* (api-types 0.186.0, DES-KNOWLEDGE-DATA-001 §10.2) One column of a value-free profile: bands, never a value.
|
|
13579
|
+
* `nullPct` is the null fraction to the nearest 5 % (`null` for an empty relation); `hasNulls` says a few nulls
|
|
13580
|
+
* the band rounded to 0 are there.
|
|
13581
|
+
*/
|
|
13582
|
+
export interface SourceProfileColumn {
|
|
13583
|
+
name: string;
|
|
13584
|
+
type: string;
|
|
13585
|
+
nullPct: number | null;
|
|
13586
|
+
hasNulls: boolean;
|
|
13587
|
+
cardinality: 'none' | 'single' | 'low' | 'high' | 'unique' | 'unknown';
|
|
13588
|
+
keyCandidate: boolean;
|
|
13589
|
+
}
|
|
13590
|
+
|
|
13591
|
+
/** (api-types 0.186.0) A relation's value-free profile; `rows` is an order-of-magnitude band, `null` when it was not read (`error` = a class). */
|
|
13592
|
+
export interface SourceProfileRelation {
|
|
13593
|
+
/** `schema.table`, the catalog document's key. */
|
|
13594
|
+
key: string;
|
|
13595
|
+
rows: '0' | '1-99' | '100-9,999' | '10,000-999,999' | '1,000,000+' | null;
|
|
13596
|
+
columns: SourceProfileColumn[];
|
|
13597
|
+
error: string | null;
|
|
13598
|
+
/** Columns not profiled (more than the profiler reads per relation). */
|
|
13599
|
+
columnsNotListed?: number;
|
|
13600
|
+
}
|
|
13601
|
+
|
|
13602
|
+
/** (api-types 0.186.0) A join the profiler found: a declared foreign key, or a name-and-type match the overlap band confirmed. */
|
|
13603
|
+
export interface SourceProfileJoin {
|
|
13604
|
+
from: string;
|
|
13605
|
+
columns: string[];
|
|
13606
|
+
to: string;
|
|
13607
|
+
references: string[];
|
|
13608
|
+
basis: 'fk' | 'name_type';
|
|
13609
|
+
/** How many of the referencing side's distinct values the other side holds (one-column joins); measured at the source. */
|
|
13610
|
+
overlap: 'empty' | 'none' | 'some' | 'most' | 'all' | null;
|
|
13611
|
+
}
|
|
13612
|
+
|
|
13613
|
+
/**
|
|
13614
|
+
* (api-types 0.186.0) `POST /sources/:name/profile`, a human operator's only (403 `profile_human_only`). The
|
|
13615
|
+
* value-free profile of a described native Postgres source, through the data gate's person read, and the data shapes
|
|
13616
|
+
* it filed as `knowledge` proposals for the review (one per relation; an identical shape already in the queue is not
|
|
13617
|
+
* filed again). 409 `not_in_knowledge`: estate holds no structure for the source yet.
|
|
13618
|
+
*/
|
|
13619
|
+
export interface SourceProfileResponse {
|
|
13620
|
+
name: string;
|
|
13621
|
+
/** The registry id. */
|
|
13622
|
+
sourceId: string;
|
|
13623
|
+
profiledAt: string;
|
|
13624
|
+
relations: SourceProfileRelation[];
|
|
13625
|
+
joins: SourceProfileJoin[];
|
|
13626
|
+
/** Code entities named exactly like a relation, in the repos' code graphs. */
|
|
13627
|
+
describes: Array<{ relation: string; repo: string; name: string; kind: string; file: string }>;
|
|
13628
|
+
proposed: Array<{ id: string; relation: string }>;
|
|
13629
|
+
alreadyProposed: number;
|
|
13630
|
+
codeSearch: { searched: string[]; notSearched: string[] };
|
|
13631
|
+
/** Catalog documents estate holds that crew's own catalog does not (or a view not allowed): not profiled. */
|
|
13632
|
+
notInKnowledge?: number;
|
|
13633
|
+
/** Relations beyond what one profile reads (too many): not profiled. */
|
|
13634
|
+
notListed?: number;
|
|
13635
|
+
/** Estate holds more catalog pages than one read takes: the rest were not profiled. */
|
|
13636
|
+
catalogTruncated?: true;
|
|
13637
|
+
}
|
|
13638
|
+
|
|
13639
|
+
/**
|
|
13640
|
+
* (api-types 0.186.0) The crew-owned record a data-shape proposal carries in `payload.shape` (a `knowledge`
|
|
13641
|
+
* proposal filed by the profiler). The review shows it; estate stores it as given.
|
|
13642
|
+
*/
|
|
13643
|
+
export interface KnowledgeShapeRecord {
|
|
13644
|
+
format: 1;
|
|
13645
|
+
sourceId: string;
|
|
13646
|
+
source: string;
|
|
13647
|
+
relation: string;
|
|
13648
|
+
profile: SourceProfileRelation;
|
|
13649
|
+
joins: SourceProfileJoin[];
|
|
13650
|
+
describes: Array<{ repo: string; symbolId: string; name: string; kind: string; file: string }>;
|
|
13651
|
+
/** Related tables whose join did not fit estate's 200 links per proposal (`joins` above keeps every one). */
|
|
13652
|
+
linksNotListed?: number;
|
|
13653
|
+
}
|
|
13654
|
+
|
|
13655
|
+
/** (api-types 0.186.0) A node of the Knowledge map. `key` is `<store>:<id>` (`source:`, `repo:`, `knowledge:`, `estate:`). */
|
|
13656
|
+
export interface KnowledgeMapNode {
|
|
13657
|
+
key: string;
|
|
13658
|
+
kind: 'source' | 'table' | 'shape' | 'code' | 'repo' | 'knowledge';
|
|
13659
|
+
label: string;
|
|
13660
|
+
/** A table's source name. */
|
|
13661
|
+
source?: string;
|
|
13662
|
+
/** A code entity's repo id. */
|
|
13663
|
+
repo?: string;
|
|
13664
|
+
/** A shape's proposal id. */
|
|
13665
|
+
proposalId?: string;
|
|
13666
|
+
/** A shape's value-free summary. */
|
|
13667
|
+
summary?: string;
|
|
13668
|
+
}
|
|
13669
|
+
|
|
13670
|
+
/**
|
|
13671
|
+
* (api-types 0.186.0) A typed edge of the Knowledge map (`describes`, `joins`, `governed_by`, `derived_from`, …;
|
|
13672
|
+
* `contains` is drawn structure). A `joins` edge's evidence is `{basis, on: [{columns, references, basis, overlap?,
|
|
13673
|
+
* cut?}], more?}`: every condition between the two tables, held under estate's 1 KiB evidence bound.
|
|
13674
|
+
*/
|
|
13675
|
+
export interface KnowledgeMapEdge {
|
|
13676
|
+
rel: string;
|
|
13677
|
+
from: string;
|
|
13678
|
+
to: string;
|
|
13679
|
+
confidence: number | null;
|
|
13680
|
+
evidence: Record<string, unknown> | null;
|
|
13681
|
+
/** The node of the shape that asserts it (`kconcept synthetic proposal:<id>:`, estate's id); `null` for drawn structure. */
|
|
13682
|
+
owner: string | null;
|
|
13683
|
+
}
|
|
13684
|
+
|
|
13685
|
+
/**
|
|
13686
|
+
* (api-types 0.186.0) `GET /knowledge/map`, a human operator's only. The source catalogs and the APPROVED data shapes
|
|
13687
|
+
* estate holds live, with their typed edges; a pending or declined shape is never in it. Every source and repo is in
|
|
13688
|
+
* the read's visible set; a repo is drawn when a shape links into it. A catalog estate replaced while it was read is
|
|
13689
|
+
* left out with a note, never drawn half.
|
|
13690
|
+
*/
|
|
13691
|
+
export interface KnowledgeMapResponse {
|
|
13692
|
+
nodes: KnowledgeMapNode[];
|
|
13693
|
+
edges: KnowledgeMapEdge[];
|
|
13694
|
+
sources: Array<{ id: string; name: string; described: boolean; inKnowledge: boolean; tables: number }>;
|
|
13695
|
+
shapes: number;
|
|
13696
|
+
/** Approved shapes estate no longer holds, or hides. */
|
|
13697
|
+
skipped: number;
|
|
13698
|
+
truncated: boolean;
|
|
13699
|
+
notes: string[];
|
|
13700
|
+
}
|
|
13701
|
+
|
|
13292
13702
|
/**
|
|
13293
13703
|
* `POST /sources/:name/test-call` (G6) — human operator only. Without `confirm` it sends NOTHING and
|
|
13294
13704
|
* answers the exact request it would send and its `requestHash`; with `confirm` equal to that hash it
|
|
@@ -13341,6 +13751,106 @@ export interface CrewSourceCatalog {
|
|
|
13341
13751
|
routes: Array<{ path: string; responseType: string; params: string[] }>;
|
|
13342
13752
|
}
|
|
13343
13753
|
|
|
13754
|
+
// ── Test connection, and ask a question of a source (operator 2026-11-03; api-types 0.179.0) ─────────
|
|
13755
|
+
|
|
13756
|
+
/**
|
|
13757
|
+
* `POST /sources/:name/test` — "Test connection" on a saved `sql` or `graphql` source (it replaces
|
|
13758
|
+
* "Describe again"). crew connects with the saved credentials resolved now, describes the source again
|
|
13759
|
+
* and saves that description, then (SQL) checks a probe read of one table with the read policy and a
|
|
13760
|
+
* prepare at the source; the probe is never executed. A failure is a result (`ok: false`, HTTP 200):
|
|
13761
|
+
* crew's `code` and words (a source's own words reach a human only, scrubbed of the secret). No answer
|
|
13762
|
+
* carries the secret.
|
|
13763
|
+
*/
|
|
13764
|
+
export interface SourceConnectionTestResponse {
|
|
13765
|
+
name: string;
|
|
13766
|
+
kind: 'sql' | 'graphql';
|
|
13767
|
+
driver: 'postgres' | 'mysql' | 'sqlite' | null;
|
|
13768
|
+
ok: boolean;
|
|
13769
|
+
/** Connecting and describing, in milliseconds (a failure: until it failed). */
|
|
13770
|
+
ms: number;
|
|
13771
|
+
/** When crew ran the test (ISO 8601). */
|
|
13772
|
+
testedAt: string;
|
|
13773
|
+
/**
|
|
13774
|
+
* How crew connects: `verified` (TLS, the certificate checked against the host: Postgres
|
|
13775
|
+
* `verify-full`, MySQL `VERIFY_IDENTITY`, HTTPS), `off` (plaintext, allowed on this confirmed
|
|
13776
|
+
* address), `local` (an upload: crew opens its own snapshot, there is no connection).
|
|
13777
|
+
*/
|
|
13778
|
+
tls: 'verified' | 'off' | 'local';
|
|
13779
|
+
/** `ok`: the fresh description (saved): structure, and for Postgres the login's privilege report. */
|
|
13780
|
+
catalog?: SourceCatalogResponse;
|
|
13781
|
+
/** `ok`, SQL: the read-policy check of the probe read (`null`: no table to probe). */
|
|
13782
|
+
readCheck?: ({ ok: true; text: string; relation: string } | { ok: false; text: string; relation: string; code: string; detail: string }) | null;
|
|
13783
|
+
/** `!ok`: why (`secret_missing`, a dialer refusal code, `source_connection`, `source_timeout`, `source_source`, `test_failed`, …). */
|
|
13784
|
+
code?: string;
|
|
13785
|
+
error?: string;
|
|
13786
|
+
}
|
|
13787
|
+
|
|
13788
|
+
/** `POST /sources/:name/ask` — HUMAN operator only (403 `ask_human_only`). SQL sources. */
|
|
13789
|
+
export interface SourceAskBody {
|
|
13790
|
+
/** The person's question, e.g. "How many tickets are open?" (1-1000 characters). */
|
|
13791
|
+
question: string;
|
|
13792
|
+
}
|
|
13793
|
+
|
|
13794
|
+
/**
|
|
13795
|
+
* The draft: one seat wrote one read query from the question and the source's STRUCTURE only (what
|
|
13796
|
+
* agents see: names, types, keys, declared enum literals, row estimates; never a row or a credential),
|
|
13797
|
+
* and crew checked it with the read policy, then a prepare at the source. NOTHING RAN. `confirm` is
|
|
13798
|
+
* crew's run token for exactly `sql` (only when the check passed): `POST /sources/:name/query` with it
|
|
13799
|
+
* runs that text. Audited `apps.source.asked` (no question, no SQL).
|
|
13800
|
+
*/
|
|
13801
|
+
export interface SourceAskResponse {
|
|
13802
|
+
/** The query the seat wrote (`''`: it said the structure cannot answer the question). */
|
|
13803
|
+
sql: string;
|
|
13804
|
+
/** The seat's one line: what the query returns and how to read it (or why there is no query). */
|
|
13805
|
+
explanation: string;
|
|
13806
|
+
/** The seat that drafted it. */
|
|
13807
|
+
seat: string;
|
|
13808
|
+
/** The check of `sql` (`null` when there is no query). */
|
|
13809
|
+
check: SourceCheckResponse | null;
|
|
13810
|
+
confirm: string | null;
|
|
13811
|
+
}
|
|
13812
|
+
|
|
13813
|
+
/** `POST /sources/:name/query` — HUMAN operator only (403 `query_human_only`). SQL sources. */
|
|
13814
|
+
export interface SourceQueryBody {
|
|
13815
|
+
/** The SQL to check (or run): a draft, an edited draft, or the person's own. */
|
|
13816
|
+
sql: string;
|
|
13817
|
+
/** crew's run token for exactly `sql` (from the ask, or from this route without `confirm`). */
|
|
13818
|
+
confirm?: string;
|
|
13819
|
+
}
|
|
13820
|
+
|
|
13821
|
+
/**
|
|
13822
|
+
* Without `confirm`: the check only (`ran: false`; nothing reaches the source but a prepare) and, when
|
|
13823
|
+
* it passed, the run token. With `confirm`: crew verifies the token is its own for exactly this text
|
|
13824
|
+
* and this source as it is now (`409 query_changed` otherwise), then runs it: the read policy again,
|
|
13825
|
+
* a `READ ONLY` transaction, the 10 s deadline cancelled at the source (`504 source_timeout`), at most
|
|
13826
|
+
* {@link SourceQueryRan.rowCap} rows. The rows go to this answer only: never to a seat, a log or the
|
|
13827
|
+
* audit trail (`apps.source.queried` records the relations, counts and time).
|
|
13828
|
+
*/
|
|
13829
|
+
export type SourceQueryResponse = SourceQueryChecked | SourceQueryRan;
|
|
13830
|
+
|
|
13831
|
+
export interface SourceQueryChecked {
|
|
13832
|
+
ran: false;
|
|
13833
|
+
check: SourceCheckResponse;
|
|
13834
|
+
confirm: string | null;
|
|
13835
|
+
}
|
|
13836
|
+
|
|
13837
|
+
export interface SourceQueryRan {
|
|
13838
|
+
ran: true;
|
|
13839
|
+
columns: Array<{ name: string; type: string }>;
|
|
13840
|
+
/**
|
|
13841
|
+
* Cells as the source's driver reads them, as JSON carries them: Postgres and MySQL dates, times,
|
|
13842
|
+
* numerics and 64-bit integers as the source's own text (`2026-01-01 01:00:00+00`, in the session's
|
|
13843
|
+
* time zone), bytes as `\x` hex (the first 32,767 bytes, `…` past them; Postgres `bytea` arrives as the source's `\x`
|
|
13844
|
+
* text and is cut like any text), JSON values as JSON; text past 64 KB
|
|
13845
|
+
* is cut.
|
|
13846
|
+
*/
|
|
13847
|
+
rows: unknown[][];
|
|
13848
|
+
/** More rows than the cap, or past 1 MB of rows as encoded: only the first are shown. */
|
|
13849
|
+
truncated: boolean;
|
|
13850
|
+
rowCap: number;
|
|
13851
|
+
ms: number;
|
|
13852
|
+
}
|
|
13853
|
+
|
|
13344
13854
|
// ── Decision capture (DES-decision-capture §4.2.1 / §4.6; DC-S4a, api-types 0.80.0) ──────────────
|
|
13345
13855
|
|
|
13346
13856
|
/** The laya codebook's decision types. `none` is crew's label for "no decision". */
|
|
@@ -15200,6 +15710,42 @@ export interface AppTurnState {
|
|
|
15200
15710
|
actor: string;
|
|
15201
15711
|
}
|
|
15202
15712
|
|
|
15713
|
+
/**
|
|
15714
|
+
* (api-types 0.185.0, DES-APPS-001 §9.2, K5) One chat message to an app and how its `apps-turn` run ended, kept
|
|
15715
|
+
* in crew's record of the app (the last 50; the detail answers the last 20). The chat on the app's page is this
|
|
15716
|
+
* list: no other thread store. `running` while the run works; `landed` with the version it made; `refused` when
|
|
15717
|
+
* the check or the review refused it (nothing landed, `code` and `reason` say why); `failed` when a step could
|
|
15718
|
+
* not run; `cancelled` when it was stopped.
|
|
15719
|
+
*/
|
|
15720
|
+
export interface AppTurnRecord {
|
|
15721
|
+
runId: string;
|
|
15722
|
+
/** Unix millis: when the message was sent. */
|
|
15723
|
+
at: number;
|
|
15724
|
+
/** The actor id that sent it. */
|
|
15725
|
+
actor: string;
|
|
15726
|
+
/** The person's message, as sent. */
|
|
15727
|
+
message: string;
|
|
15728
|
+
/** The component ids the message was about (the composer's chips). */
|
|
15729
|
+
about: string[];
|
|
15730
|
+
/** The version it was sent on. */
|
|
15731
|
+
base: number;
|
|
15732
|
+
state: 'running' | 'landed' | 'refused' | 'failed' | 'cancelled';
|
|
15733
|
+
/** Unix millis, or `null` while it runs. */
|
|
15734
|
+
endedAt: number | null;
|
|
15735
|
+
/** `landed`: the version it made. */
|
|
15736
|
+
version: number | null;
|
|
15737
|
+
/** `landed`: crew's own line of what changed, from the two specs ("Added 1 chart and 1 query"). */
|
|
15738
|
+
change: string | null;
|
|
15739
|
+
/** `landed`: the builder's change lines, as it wrote them (text; never instructions to anyone). */
|
|
15740
|
+
summary: string | null;
|
|
15741
|
+
/** `landed`: the seats that built it and reviewed it (distinct). */
|
|
15742
|
+
builder: string | null;
|
|
15743
|
+
reviewer: string | null;
|
|
15744
|
+
/** Not landed: a stable code (`check_failed`, `review_refused`, `launch_refused`, `cancelled`, …) and crew's words. */
|
|
15745
|
+
code: string | null;
|
|
15746
|
+
reason: string | null;
|
|
15747
|
+
}
|
|
15748
|
+
|
|
15203
15749
|
/** `GET /apps` item. */
|
|
15204
15750
|
export interface AppSummary {
|
|
15205
15751
|
/**
|
|
@@ -15216,6 +15762,12 @@ export interface AppSummary {
|
|
|
15216
15762
|
createdAt: number;
|
|
15217
15763
|
head: { version: number; tree: string; receipt: AppReceiptKind | null };
|
|
15218
15764
|
turn: AppTurnState | null;
|
|
15765
|
+
/**
|
|
15766
|
+
* (api-types 0.180.0) The app's last successful publish: its share link (`shareUrl`), the version it serves
|
|
15767
|
+
* and what was produced. `null` until a publish run finished (studio says "Publish to share", never a made-up
|
|
15768
|
+
* link); absent from an older daemon.
|
|
15769
|
+
*/
|
|
15770
|
+
published?: AppPublished | null;
|
|
15219
15771
|
}
|
|
15220
15772
|
|
|
15221
15773
|
/** `GET /apps` (observer); `?project=<id>` keeps one project's apps. */
|
|
@@ -15240,6 +15792,8 @@ export interface AppDetail extends AppSummary {
|
|
|
15240
15792
|
/** Oldest first. */
|
|
15241
15793
|
versions: AppVersion[];
|
|
15242
15794
|
history: AppHistory;
|
|
15795
|
+
/** (api-types 0.185.0, K5) The app's chat: its last turns, oldest first. Absent from an older daemon. */
|
|
15796
|
+
turns?: AppTurnRecord[];
|
|
15243
15797
|
}
|
|
15244
15798
|
|
|
15245
15799
|
/** `GET /apps/:app` (observer), and `POST /apps` (201). */
|
|
@@ -15531,6 +16085,10 @@ export interface AppErrorBody {
|
|
|
15531
16085
|
| 'unknown_version'
|
|
15532
16086
|
| 'unknown_query'
|
|
15533
16087
|
| 'unknown_project'
|
|
16088
|
+
/** (api-types 0.185.0) `POST /apps/check` from a unit that is not the turn's check step. */
|
|
16089
|
+
| 'not_the_check'
|
|
16090
|
+
/** (api-types 0.185.0) A turn on an app whose repository is not registered yet. */
|
|
16091
|
+
| 'not_registered'
|
|
15534
16092
|
| 'stale_base'
|
|
15535
16093
|
| 'turn_in_flight'
|
|
15536
16094
|
| 'not_accepted'
|
|
@@ -15580,21 +16138,40 @@ export interface AppErrorBody {
|
|
|
15580
16138
|
* unit's capability token in the body, never as a bearer): check the builder's candidate commit of the
|
|
15581
16139
|
* app's turn in flight (DES §9.2 `check`).
|
|
15582
16140
|
*/
|
|
15583
|
-
export
|
|
15584
|
-
|
|
15585
|
-
|
|
15586
|
-
|
|
15587
|
-
|
|
15588
|
-
|
|
15589
|
-
|
|
15590
|
-
|
|
16141
|
+
export type AppsCheckBody =
|
|
16142
|
+
| {
|
|
16143
|
+
token: string;
|
|
16144
|
+
/**
|
|
16145
|
+
* (api-types 0.185.0) The builder's worktree as the engine snapshotted it (`WICKED_TREE`, a tree in the app
|
|
16146
|
+
* repo's objects); crew finds the app by the unit's run.
|
|
16147
|
+
*/
|
|
16148
|
+
tree: string;
|
|
16149
|
+
/** The publish manifest, for the publish check (a later slice). */
|
|
16150
|
+
manifest?: unknown;
|
|
16151
|
+
}
|
|
16152
|
+
| {
|
|
16153
|
+
token: string;
|
|
16154
|
+
app: string;
|
|
16155
|
+
/** The builder's candidate commit in the app repo (the older form). */
|
|
16156
|
+
commit: string;
|
|
16157
|
+
/** The publish manifest, for the publish check (a later slice). */
|
|
16158
|
+
manifest?: unknown;
|
|
16159
|
+
};
|
|
15591
16160
|
|
|
15592
16161
|
/**
|
|
15593
16162
|
* (api-types 0.173.0) `POST /apps/check` 200: on a pass, the commit crew made on the candidate with its lock (the only tree the
|
|
15594
16163
|
* turn's review can land) and what the check ran; on a refusal, why.
|
|
15595
16164
|
*/
|
|
15596
16165
|
export type AppsCheckResponse =
|
|
15597
|
-
| {
|
|
16166
|
+
| {
|
|
16167
|
+
ok: true; commit: string; tree: string; summary: AppCheckSummary;
|
|
16168
|
+
/**
|
|
16169
|
+
* (api-types 0.185.0) The checked tree's files as text (`apps.json`, `apps.lock.json`, `queries/<id>.<ext>`):
|
|
16170
|
+
* `wicked-crew apps-check` writes exactly these into the turn's worktree, so the review is dispatched on the
|
|
16171
|
+
* tree that can land.
|
|
16172
|
+
*/
|
|
16173
|
+
files?: Array<{ path: string; text: string }>;
|
|
16174
|
+
}
|
|
15598
16175
|
| { ok: false; code: 'check_failed' | 'source_check_unavailable'; findings: AppCheckFinding[] };
|
|
15599
16176
|
|
|
15600
16177
|
/**
|
|
@@ -15613,7 +16190,7 @@ export interface AppsCapabilities {
|
|
|
15613
16190
|
* since api-types 0.178.0 (K2b, the write path: API actions and Postgres row writes).
|
|
15614
16191
|
*/
|
|
15615
16192
|
actions: boolean;
|
|
15616
|
-
/** `POST /apps/:app/turns` launches `apps-turn` runs. */
|
|
16193
|
+
/** `POST /apps/:app/turns` launches `apps-turn` runs (true since api-types 0.185.0 on a daemon whose engine runs them). */
|
|
15617
16194
|
turns: boolean;
|
|
15618
16195
|
/** `POST /apps/:app/publish`. */
|
|
15619
16196
|
publish: boolean;
|
|
@@ -15644,3 +16221,164 @@ export interface RegisterRepoBody {
|
|
|
15644
16221
|
actor?: string;
|
|
15645
16222
|
autoCapture?: boolean;
|
|
15646
16223
|
}
|
|
16224
|
+
|
|
16225
|
+
// ── Apps: publish and the standalone site (api-types 0.180.0, DES-APPS-001 §8.1-8.2, §9.3, slice K6) ──────────
|
|
16226
|
+
//
|
|
16227
|
+
// Publish turns an accepted version into a container image the deployer runs: `wicked-apps-server` with the
|
|
16228
|
+
// runtime, the checked `apps.json`, `queries/`, `apps.lock.json`, the snapshots by digest and the manifest
|
|
16229
|
+
// below. The SHARE LINK is the site's own address, the base URL the deployer gives in the publish settings
|
|
16230
|
+
// (`site.origin`): after a successful publish it is `AppPublished.shareUrl`, and anyone in the app's audience
|
|
16231
|
+
// (anyone at all, for a public app) opens it. crew never invents one and pushes nothing anywhere.
|
|
16232
|
+
|
|
16233
|
+
/** Where a publish puts the app. `studio` is always on; `embed` needs a public app; `teams` needs the Entra profile. */
|
|
16234
|
+
export type AppPublishTarget = 'studio' | 'site' | 'embed' | 'teams';
|
|
16235
|
+
|
|
16236
|
+
/**
|
|
16237
|
+
* Who may open the site, judged on the verified token (DES §8.2). `public`: anyone, read-only (every query
|
|
16238
|
+
* public, no action). `oidc-groups`: a group claim value (`claim`, default `groups`). `oidc-email-domain`: the
|
|
16239
|
+
* email's domain, only with `email_verified: true` (a Boolean). `entra-roles`: an app-role VALUE in `roles`
|
|
16240
|
+
* (recommended). `entra-groups`: a group object id in `groups` (a token with a groups overage marker is refused).
|
|
16241
|
+
*/
|
|
16242
|
+
export type AppAudienceRule =
|
|
16243
|
+
| { kind: 'public' }
|
|
16244
|
+
| { kind: 'oidc-groups'; groups: string[]; claim?: string }
|
|
16245
|
+
| { kind: 'oidc-email-domain'; domains: string[] }
|
|
16246
|
+
| { kind: 'entra-roles'; roles: string[] }
|
|
16247
|
+
| { kind: 'entra-groups'; groups: string[] };
|
|
16248
|
+
|
|
16249
|
+
/**
|
|
16250
|
+
* The site's one issuer, fixed at publish. `oidc`: the page signs in with authorization code + PKCE and sends
|
|
16251
|
+
* the ID token (`aud` = `clientId`). `entra`: the page sends a v2 ACCESS token for the app's own
|
|
16252
|
+
* `access_as_user` scope (`aud` = `clientId`, `scp` has `access_as_user`, `tid` = `tenantId`); app-only tokens and
|
|
16253
|
+
* ID tokens are refused. The issuer is `https://` (Entra: `https://login.microsoftonline.com/<tenantId>/v2.0`).
|
|
16254
|
+
*/
|
|
16255
|
+
export interface AppPublishIdentity {
|
|
16256
|
+
profile: 'oidc' | 'entra';
|
|
16257
|
+
issuer: string;
|
|
16258
|
+
clientId: string;
|
|
16259
|
+
/** `entra` only. */
|
|
16260
|
+
tenantId?: string;
|
|
16261
|
+
/** The scope the page asks for. Default: `openid email profile groups` (oidc), `api://<site host>/<clientId>/access_as_user openid profile` (entra). */
|
|
16262
|
+
scope?: string;
|
|
16263
|
+
/**
|
|
16264
|
+
* Loopback or private CIDR ranges the issuer may be reached at when it is a NAME on a private network (crew's
|
|
16265
|
+
* `OidcConfig.allowRanges`); an IP-literal issuer confirms itself. Never metadata or link-local.
|
|
16266
|
+
*/
|
|
16267
|
+
allowRanges?: string[];
|
|
16268
|
+
}
|
|
16269
|
+
|
|
16270
|
+
/** `POST /apps/:app/publish` (HUMAN operator): launch an `apps-publish` run bound to the head tree and this manifest. */
|
|
16271
|
+
export interface AppPublishBody {
|
|
16272
|
+
/** The head version the person is publishing (`409 stale_base` if head moved). */
|
|
16273
|
+
base: number;
|
|
16274
|
+
targets: AppPublishTarget[];
|
|
16275
|
+
/**
|
|
16276
|
+
* The site's address: `https://<host>[:port]`, or `http://localhost:<port>` / `http://127.0.0.1:<port>` for a
|
|
16277
|
+
* local run. No path, query or credentials. It is the share link, the redirect URI's origin
|
|
16278
|
+
* (`<origin>/auth/callback`), and the only origin a POST to the site may come from.
|
|
16279
|
+
*/
|
|
16280
|
+
site: { origin: string };
|
|
16281
|
+
/** `null` = a public app (no sign-in). */
|
|
16282
|
+
identity: AppPublishIdentity | null;
|
|
16283
|
+
audience: AppAudienceRule;
|
|
16284
|
+
/** `embed`: the origins that may frame the public site (`https://…`, no path). `teams` adds the Teams origins itself. */
|
|
16285
|
+
embedOrigins?: string[];
|
|
16286
|
+
}
|
|
16287
|
+
|
|
16288
|
+
/** One source as the person consents to shipping it (DES §9.3 step 3). */
|
|
16289
|
+
export interface AppManifestSource {
|
|
16290
|
+
name: string;
|
|
16291
|
+
kind: 'sql' | 'graphql' | 'rest' | 'mcp-http';
|
|
16292
|
+
descriptorHash: string;
|
|
16293
|
+
/** Where the container must reach it (`db.support.internal:5432`, a URL's origin), or `null` for a snapshot. */
|
|
16294
|
+
reach: string | null;
|
|
16295
|
+
/** The address is loopback or private: the container's network must reach it. */
|
|
16296
|
+
privateAddress: boolean;
|
|
16297
|
+
/** The environment variable the deployer passes its secret in, or `null` when it has none. */
|
|
16298
|
+
env: string | null;
|
|
16299
|
+
/** A Postgres source's Allow writes switch at publish. */
|
|
16300
|
+
allowWrites: boolean;
|
|
16301
|
+
/** An upload: the snapshot's digest, shipped in the image. */
|
|
16302
|
+
snapshot?: string;
|
|
16303
|
+
}
|
|
16304
|
+
|
|
16305
|
+
/** The manifest a publish run is bound to (its digest is on the run, the QE verdict and the `published` receipt). */
|
|
16306
|
+
export interface AppPublishManifest {
|
|
16307
|
+
schema: 'wicked.apps.manifest/v1';
|
|
16308
|
+
app: { slug: string; name: string; version: number; tree: string; commit: string };
|
|
16309
|
+
targets: AppPublishTarget[];
|
|
16310
|
+
site: { origin: string };
|
|
16311
|
+
/**
|
|
16312
|
+
* The issuer, with the endpoints its discovery document named at publish (the page's `connect-src`) and the ID
|
|
16313
|
+
* token signing algorithms it named (`id_token_signing_alg_values_supported`; the page checks the ID token's).
|
|
16314
|
+
*/
|
|
16315
|
+
identity: (AppPublishIdentity & { endpoints: { authorization: string; token: string; idTokenAlgs?: string[] } }) | null;
|
|
16316
|
+
audience: AppAudienceRule;
|
|
16317
|
+
embedOrigins: string[];
|
|
16318
|
+
sources: AppManifestSource[];
|
|
16319
|
+
queries: Array<{ id: string; source: string; public: boolean }>;
|
|
16320
|
+
/** Each action with the grant the image enforces (revoking = publishing again without it). */
|
|
16321
|
+
actions: Array<{ id: string; kind: 'api' | 'row-write'; source: string; grant: AppActionGrant; table?: string; columns?: string[] }>;
|
|
16322
|
+
/** Every environment name the image needs, sorted. A missing one fails the server's start, by name. */
|
|
16323
|
+
env: string[];
|
|
16324
|
+
/** `/data` must be a mounted volume when the app has an action (its action records and logs live there). */
|
|
16325
|
+
volume: '/data' | null;
|
|
16326
|
+
}
|
|
16327
|
+
|
|
16328
|
+
/** An app's last successful publish (`AppSummary.published`, so also on `AppDetail`): the share link and what was produced. */
|
|
16329
|
+
export interface AppPublished {
|
|
16330
|
+
version: number;
|
|
16331
|
+
tree: string;
|
|
16332
|
+
/** The `apps-publish` run. */
|
|
16333
|
+
runId: string;
|
|
16334
|
+
/** Unix millis, when the image was produced. */
|
|
16335
|
+
at: number;
|
|
16336
|
+
/** Who consented. */
|
|
16337
|
+
actor: Actor;
|
|
16338
|
+
targets: AppPublishTarget[];
|
|
16339
|
+
/** The share link: `site.origin` + `/`. What studio's Copy link copies. */
|
|
16340
|
+
shareUrl: string;
|
|
16341
|
+
/** Who can open it, in one line ("People in group support-ops who sign in at dex.apps.test"). */
|
|
16342
|
+
audience: string;
|
|
16343
|
+
/** The image in the local container engine (never pushed): its tag and its id (`sha256:…`). */
|
|
16344
|
+
image: { tag: string; id: string };
|
|
16345
|
+
/** `embed`: the iframe snippet (a public app only); otherwise `null`. */
|
|
16346
|
+
snippet: string | null;
|
|
16347
|
+
/** `teams`: the Teams app package, at `GET /api/v1/apps/:app/published/teams.zip`; otherwise `null`. */
|
|
16348
|
+
teamsPackage: { url: string; sha256: string } | null;
|
|
16349
|
+
manifestDigest: string;
|
|
16350
|
+
/** How the deployer runs it: the environment names, the volume (or `null`), the port the server listens on. */
|
|
16351
|
+
run: { env: string[]; volume: '/data' | null; port: number };
|
|
16352
|
+
}
|
|
16353
|
+
|
|
16354
|
+
// The standalone site's own routes (`wicked-apps-server`; the page's in-process host calls them). Bearer only,
|
|
16355
|
+
// no cookies; every POST needs `Origin` = the site's origin and `Content-Type: application/json`.
|
|
16356
|
+
|
|
16357
|
+
/** `GET /spec` (a token in the audience, or a public app): the published version and who is viewing. */
|
|
16358
|
+
export interface AppSiteSpecResponse {
|
|
16359
|
+
app: { slug: string; name: string; version: number };
|
|
16360
|
+
spec: AppSpec;
|
|
16361
|
+
/** What the server took from the verified token; `null` on a public site. */
|
|
16362
|
+
viewer: { email: string | null; name: string | null } | null;
|
|
16363
|
+
/** Actions run on this site (a mounted `/data`, `APPS_READ_ONLY` unset). The page still refuses them in a frame. */
|
|
16364
|
+
actions: boolean;
|
|
16365
|
+
/**
|
|
16366
|
+
* Queries and actions the server refuses NOW, each with its reason. They are judged again at every refresh (every
|
|
16367
|
+
* 10 minutes, and after a failed read): a source back as it was published clears them; a source that really
|
|
16368
|
+
* changed needs the app checked and published again.
|
|
16369
|
+
*/
|
|
16370
|
+
refused: Array<{ kind: 'query' | 'action'; id: string; reason: string }>;
|
|
16371
|
+
}
|
|
16372
|
+
|
|
16373
|
+
/**
|
|
16374
|
+
* `GET /healthz` (no sign-in): up, and what it refuses, by kind, id and a code only (`contract_changed`,
|
|
16375
|
+
* `table_changed`, `source_unavailable`, …). The reasons, which can name a source or a table, are on `GET /spec`
|
|
16376
|
+
* behind the sign-in.
|
|
16377
|
+
*/
|
|
16378
|
+
export interface AppSiteHealth {
|
|
16379
|
+
ok: boolean;
|
|
16380
|
+
app: string;
|
|
16381
|
+
version: number;
|
|
16382
|
+
refused: Array<{ kind: 'query' | 'action'; id: string; code: string }>;
|
|
16383
|
+
actions: boolean;
|
|
16384
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wicked-crew-api-types",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.186.0",
|
|
4
4
|
"description": "The wire contract of the wicked-crew daemon's /api/v1 REST surface and /ws CoreEvent frames \u2014 types only, zero runtime",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./index.d.ts",
|