@picked/app-protocol 0.0.0-stage → 0.0.115-next.2

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.
@@ -0,0 +1,132 @@
1
+ /**
2
+ * @file The app manifest: what an app version declares to Picked, and the parser
3
+ * the API and the CLI both run over it.
4
+ */
5
+ /** The dashboard locations an app can render a slot into. */
6
+ export declare const APP_SLOT_LOCATIONS: readonly ['app-home', 'workspace-prepublish-actions', 'workspace-postpublish-actions'];
7
+ /** A dashboard location an app can render a slot into. */
8
+ export type AppSlotLocation = (typeof APP_SLOT_LOCATIONS)[number];
9
+ /** The events an app can subscribe to: Picked POSTs each to `<endpoint>/events`. */
10
+ export declare const APP_EVENTS: readonly ['workspace.published'];
11
+ /** An event an app can subscribe to. */
12
+ export type AppEventName = (typeof APP_EVENTS)[number];
13
+ /** The value types a workflow tool argument or output field takes. */
14
+ export declare const APP_VALUE_TYPES: readonly ['string', 'number', 'boolean', 'json'];
15
+ /** A value type a workflow tool argument or output field takes. */
16
+ export type AppValueType = (typeof APP_VALUE_TYPES)[number];
17
+ /** One iframe an app renders at a dashboard location. */
18
+ export interface AppSlot {
19
+ /** Where the slot renders. */
20
+ location: AppSlotLocation;
21
+ /** The page the iframe loads. HTTPS, or `http://localhost` while developing. */
22
+ url: string;
23
+ /** The heading the dashboard shows above the iframe. */
24
+ title?: string;
25
+ /** The iframe's starting height in pixels; the frame can resize itself. */
26
+ height?: number;
27
+ }
28
+ /** One argument a workflow tool takes. */
29
+ export interface AppToolArgument {
30
+ /** The argument's name for authors. */
31
+ label: string;
32
+ /** The value type the argument takes. */
33
+ type: AppValueType;
34
+ /** What the argument means, shown under the field. */
35
+ description?: string;
36
+ /** Whether a node must set the argument. */
37
+ required?: boolean;
38
+ /** The values a `string` argument is limited to. */
39
+ options?: string[];
40
+ }
41
+ /** One property a workflow tool records for later nodes. */
42
+ export interface AppToolOutputField {
43
+ /** The property's name for authors. */
44
+ label: string;
45
+ /** The value type the property holds. */
46
+ type: AppValueType;
47
+ /** What the property holds. */
48
+ description?: string;
49
+ /** Whether a call can leave the property out. */
50
+ optional?: boolean;
51
+ }
52
+ /** A workflow tool whose calls Picked POSTs to the app's endpoint. */
53
+ export interface AppWorkflowTool {
54
+ /** The tool's name within the app: lower-case letters, digits and underscores. */
55
+ name: string;
56
+ /** The tool's name for authors. */
57
+ label: string;
58
+ /** What the tool does, for authors. */
59
+ description: string;
60
+ /** `write` when a call changes something outside the run; a test run skips writes. */
61
+ effect: 'read' | 'write';
62
+ /** The arguments a node sets, by name. */
63
+ arguments: Record<string, AppToolArgument>;
64
+ /** What a call records for later nodes, by property name. */
65
+ output: Record<string, AppToolOutputField>;
66
+ }
67
+ /** What an app version declares. */
68
+ export interface AppManifest {
69
+ /** The app's handle, unique in its organisation: lower-case letters, digits and hyphens. */
70
+ handle: string;
71
+ /** The app's name. */
72
+ name: string;
73
+ /** A sentence on what the app does. */
74
+ description?: string;
75
+ /**
76
+ * The base URL Picked appends request paths to: `/lifecycle`, `/events` and
77
+ * `/tools/<name>`. An app with no endpoint has slots, an MCP server, or both.
78
+ */
79
+ endpoint?: string;
80
+ /** The Picked API scopes the installation token carries, such as `organization_leads/read`. */
81
+ scopes?: string[];
82
+ /** The iframes the app renders in the dashboard. */
83
+ slots?: AppSlot[];
84
+ /** The workflow tools the app adds to every project it is installed on. */
85
+ workflowTools?: AppWorkflowTool[];
86
+ /** An MCP server the dashboard agent can use, at an https `url`. */
87
+ mcp?: {
88
+ url: string;
89
+ };
90
+ /** The events Picked sends the app for every project it is installed on. */
91
+ events?: AppEventName[];
92
+ /**
93
+ * Whether the app mints installation tokens on its own, outside a request from Picked, such
94
+ * as for a scheduled sync. The installing user consents to it. Without it, the app calls
95
+ * Picked with the token each request from Picked carries.
96
+ */
97
+ offlineAccess?: boolean;
98
+ }
99
+ /** The result of parsing a manifest: the manifest, or every issue found. */
100
+ export type ParseManifestResult = {
101
+ ok: true;
102
+ manifest: AppManifest;
103
+ } | {
104
+ ok: false;
105
+ issues: string[];
106
+ };
107
+ /**
108
+ * Checks a URL is HTTPS, or HTTP on a loopback host.
109
+ *
110
+ * @param {unknown} value - The candidate URL.
111
+ * @returns {boolean} Whether Picked may load or call it.
112
+ * @example isAppUrl('https://example.com') // true
113
+ */
114
+ export declare function isAppUrl(value: unknown): value is string;
115
+ /**
116
+ * Removes every trailing occurrence of a character.
117
+ *
118
+ * @param {string} text - The text.
119
+ * @param {string} char - The character, such as `/`.
120
+ * @returns {string} The text without it at the end.
121
+ * @example trimTrailing('https://x.dev//', '/') // 'https://x.dev'
122
+ */
123
+ export declare function trimTrailing(text: string, char: string): string;
124
+ /**
125
+ * Parses a manifest, reporting every issue rather than the first.
126
+ *
127
+ * @param {unknown} value - The candidate manifest, such as a JSON body.
128
+ * @returns {ParseManifestResult} The manifest, or the issues.
129
+ * @example parseManifest({ handle: 'acme', name: 'Acme' })
130
+ */
131
+ export declare function parseManifest(value: unknown): ParseManifestResult;
132
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * @file What Picked sends an app and what the app answers: lifecycle events, workflow tool
3
+ * calls, app events, and the signatures and session tokens both sides check.
4
+ *
5
+ * Every request Picked sends carries `picked-signature: t=<unix seconds>,kid=<key id>,v1=<sig>`,
6
+ * the base64url Ed25519 signature of `<t>.<body>` by Picked's key, whose public half Picked
7
+ * publishes at {@link PICKED_KEYS_PATH}. Session tokens are EdDSA JWTs Picked signs the same
8
+ * way. An app calls Picked with an app assertion: a JWT it signs with its own key, whose
9
+ * public half it registered on deploy.
10
+ */
11
+ import { type PublicKeySet, type Signer } from './keys';
12
+ /** The header a signed request carries. */
13
+ export declare const SIGNATURE_HEADER = "picked-signature";
14
+ /** The header naming the installation a request is for. */
15
+ export declare const INSTALLATION_HEADER = "picked-installation-id";
16
+ /** The header an app sends its app assertion in. */
17
+ export declare const APP_ASSERTION_HEADER = "picked-app-assertion";
18
+ /**
19
+ * The header an MCP request carries its installation in: the base64url JSON of an
20
+ * {@link InstallationRef}, which the request's signature covers with the body.
21
+ */
22
+ export declare const CONTEXT_HEADER = "picked-context";
23
+ /** Where Picked publishes the public keys it signs with, beneath its API origin. */
24
+ export declare const PICKED_KEYS_PATH = "/.well-known/picked-app-keys.json";
25
+ /** Where an installation lives, and the Picked API it calls back. */
26
+ export interface InstallationRef {
27
+ installationId: string;
28
+ organizationId: string;
29
+ projectId: string;
30
+ /** The origin of the Picked API that sent this, which the installation calls back. */
31
+ apiUrl: string;
32
+ /**
33
+ * A one-hour token carrying the installation's scopes, on every request from Picked. It
34
+ * reaches the installation's own labels.
35
+ */
36
+ token?: string;
37
+ /** When `token` expires. */
38
+ tokenExpiresAt?: string;
39
+ }
40
+ /** Sent when the app is installed on a project. */
41
+ export interface InstallationCreatedEvent extends InstallationRef {
42
+ type: 'installation.created';
43
+ /** The scopes the installation's tokens carry. */
44
+ scopes: string[];
45
+ }
46
+ /** Sent when an installation moves to another version of the app. */
47
+ export interface InstallationUpgradedEvent extends InstallationRef {
48
+ type: 'installation.upgraded';
49
+ /** The version the installation now runs. */
50
+ version: number;
51
+ /** The scopes the installation's tokens now carry. */
52
+ scopes: string[];
53
+ }
54
+ /** Sent when the app is removed from a project, just before its tokens and labels go. */
55
+ export interface InstallationDeletedEvent extends InstallationRef {
56
+ type: 'installation.deleted';
57
+ }
58
+ /** A lifecycle event. */
59
+ export type LifecycleEvent = InstallationCreatedEvent | InstallationUpgradedEvent | InstallationDeletedEvent;
60
+ /** Sent to an app that subscribes to `workspace.published` when a project's workspace publishes. */
61
+ export interface WorkspacePublishedEvent extends InstallationRef {
62
+ type: 'workspace.published';
63
+ /** The id the event carries across redeliveries. */
64
+ eventId: string;
65
+ workspaceId: string;
66
+ /** The version the publish wrote. */
67
+ workspaceVersionId: string;
68
+ /** When it published, as an ISO 8601 timestamp. */
69
+ occurredAt: string;
70
+ }
71
+ /** An event an app subscribes to in its manifest's `events`. */
72
+ export type AppEvent = WorkspacePublishedEvent;
73
+ /** A workflow node calling one of the app's tools. */
74
+ export interface ToolCall extends InstallationRef {
75
+ type: 'workflow_tool.call';
76
+ /** The tool's name, as the manifest declares it. */
77
+ tool: string;
78
+ /** The node's resolved arguments. */
79
+ arguments: Record<string, unknown>;
80
+ /** Identifies the call across retries; the same key means the same call. */
81
+ idempotencyKey: string;
82
+ /** The run the call belongs to. */
83
+ run: {
84
+ runId: string;
85
+ nodeId: string;
86
+ test: boolean;
87
+ };
88
+ }
89
+ /** What a tool answers: its output, or why it failed. */
90
+ export type ToolResult = {
91
+ output: Record<string, unknown>;
92
+ } | {
93
+ error: {
94
+ message: string;
95
+ retryable?: boolean;
96
+ };
97
+ };
98
+ /** What a session token asserts: who is looking at the app's frame, where. */
99
+ export interface SessionClaims extends InstallationRef {
100
+ /** The signed-in dashboard user. */
101
+ userId: string;
102
+ /** Expiry, in unix seconds. */
103
+ exp: number;
104
+ }
105
+ /**
106
+ * Signs a request body for the `picked-signature` header.
107
+ *
108
+ * @param {Signer} signer - Picked's key.
109
+ * @param {string} body - The exact body sent.
110
+ * @param {number} [timestamp] - Unix seconds; now when absent.
111
+ * @returns {Promise<string>} The header value.
112
+ * @example await signBody(signer, '{}')
113
+ */
114
+ export declare function signBody(signer: Signer, body: string, timestamp?: number): Promise<string>;
115
+ /**
116
+ * Checks a `picked-signature` header against a body.
117
+ *
118
+ * @param {PublicKeySet} keys - Picked's public keys.
119
+ * @param {string} body - The exact body received.
120
+ * @param {string | null} header - The header value.
121
+ * @returns {Promise<boolean>} Whether Picked signed the body recently.
122
+ * @example await verifyBody(keys, '{}', request.headers.get('picked-signature'))
123
+ */
124
+ export declare function verifyBody(keys: PublicKeySet, body: string, header: string | null): Promise<boolean>;
125
+ /**
126
+ * Signs an MCP request Picked forwards to an app: the signature covers the installation it
127
+ * is for as well as the JSON-RPC body, which does not name it.
128
+ *
129
+ * @param {Signer} signer - Picked's key.
130
+ * @param {InstallationRef} ref - The installation.
131
+ * @param {string} body - The exact body forwarded.
132
+ * @returns {Promise<Record<string, string>>} The headers to send.
133
+ * @example await signMcpRequest(signer, ref, body)
134
+ */
135
+ export declare function signMcpRequest(signer: Signer, ref: InstallationRef, body: string): Promise<Record<string, string>>;
136
+ /**
137
+ * Checks an MCP request's signature and reads the installation it is for.
138
+ *
139
+ * @param {PublicKeySet} keys - Picked's public keys.
140
+ * @param {Headers} headers - The request's headers.
141
+ * @param {string} body - The exact body received.
142
+ * @returns {Promise<InstallationRef | null>} The installation, or null when the request is not Picked's.
143
+ * @example await verifyMcpRequest(keys, request.headers, body)
144
+ */
145
+ export declare function verifyMcpRequest(keys: PublicKeySet, headers: Headers, body: string): Promise<InstallationRef | null>;
146
+ /**
147
+ * Mints a session token: an EdDSA JWT of the claims, signed by Picked.
148
+ *
149
+ * @param {Signer} signer - Picked's key.
150
+ * @param {SessionClaims} claims - What the token asserts.
151
+ * @returns {Promise<string>} The token.
152
+ * @example await createSessionToken(signer, claims)
153
+ */
154
+ export declare function createSessionToken(signer: Signer, claims: SessionClaims): Promise<string>;
155
+ /**
156
+ * Checks a session token and reads its claims.
157
+ *
158
+ * @param {PublicKeySet} keys - Picked's public keys.
159
+ * @param {string} token - The token the frame was handed.
160
+ * @returns {Promise<SessionClaims | null>} The claims, or null when the token is forged or expired.
161
+ * @example await verifySessionToken(keys, token)
162
+ */
163
+ export declare function verifySessionToken(keys: PublicKeySet, token: string): Promise<SessionClaims | null>;
164
+ /** What an app assertion asserts. */
165
+ export interface AppAssertionClaims {
166
+ /** The installation the app acts for. */
167
+ installationId: string;
168
+ /** The assertion's id, which Picked accepts once. */
169
+ jti: string;
170
+ /** Expiry, in unix seconds. */
171
+ exp: number;
172
+ }
173
+ /**
174
+ * Makes an app assertion: a JWT, signed with the app's key, naming the installation the app
175
+ * acts for and the Picked API it calls. It lives one minute.
176
+ *
177
+ * @param {Signer} signer - The app's key.
178
+ * @param {object} options - What it asserts.
179
+ * @param {string} options.installationId - The installation.
180
+ * @param {string} options.audience - The origin of the Picked API it is sent to.
181
+ * @returns {Promise<string>} The assertion, for the `picked-app-assertion` header.
182
+ * @example await createAppAssertion(signer, { installationId, audience: apiUrl })
183
+ */
184
+ export declare function createAppAssertion(signer: Signer, options: {
185
+ installationId: string;
186
+ audience: string;
187
+ }): Promise<string>;
188
+ /**
189
+ * Checks an app assertion for an audience. One that lives longer than five minutes fails, so
190
+ * a verifier remembers each `jti` for at most that long.
191
+ *
192
+ * @param {PublicKeySet} keys - The app's public keys.
193
+ * @param {string} assertion - The assertion.
194
+ * @param {object} options - What it must assert.
195
+ * @param {string} options.audience - The origin of the Picked API verifying it.
196
+ * @returns {Promise<AppAssertionClaims | null>} Its claims, or null when it fails.
197
+ * @example await verifyAppAssertion(keys, assertion, { audience })
198
+ */
199
+ export declare function verifyAppAssertion(keys: PublicKeySet, assertion: string, options: {
200
+ audience: string;
201
+ }): Promise<AppAssertionClaims | null>;
202
+ /**
203
+ * Reads the installation an app assertion names, without checking it. A verifier uses it to
204
+ * find the app whose keys must then verify the assertion.
205
+ *
206
+ * @param {string} assertion - The assertion.
207
+ * @returns {string | null} The installation, or null when the assertion names none.
208
+ * @example unverifiedAssertionSubject(assertion)
209
+ */
210
+ export declare function unverifiedAssertionSubject(assertion: string): string | null;
211
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,63 @@
1
1
  {
2
2
  "name": "@picked/app-protocol",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "description": "The Picked app contract: the app manifest, Ed25519 keys and the signed requests Picked and an app exchange",
4
+ "version": "0.0.115-next.2",
5
+ "dependencies": {},
6
+ "devDependencies": {
7
+ "@repo/eslint-config": "workspace:*",
8
+ "@repo/typescript-config": "workspace:*",
9
+ "@repo/vitest-config": "workspace:*",
10
+ "@types/node": "^24",
11
+ "@vitest/coverage-v8": "^5.0.1",
12
+ "vite": "^8.2.0",
13
+ "vitest": "^5.0.1"
14
+ },
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/types/index.d.ts",
18
+ "import": "./dist/esm/index.js",
19
+ "require": "./dist/cjs/index.js",
20
+ "default": "./dist/esm/index.js"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "knip": {
27
+ "ignoreBinaries": [
28
+ "knip",
29
+ "jscpd",
30
+ "eslint",
31
+ "tsgo"
32
+ ],
33
+ "ignoreDependencies": [
34
+ "@repo/eslint-config",
35
+ "@repo/typescript-config",
36
+ "@repo/vitest-config",
37
+ "@vitest/coverage-v8"
38
+ ],
39
+ "ignore": [
40
+ "eslint.config.js"
41
+ ]
42
+ },
43
+ "license": "SEE LICENSE IN LICENSE",
44
+ "main": "./dist/cjs/index.js",
45
+ "module": "./dist/esm/index.js",
46
+ "private": false,
47
+ "publishConfig": {
48
+ "access": "public"
49
+ },
50
+ "scripts": {
51
+ "build": "vite build && tsgo -p tsconfig.build.json",
52
+ "dev": "node ../../scripts/sdk-watch-build.mjs",
53
+ "lint": "eslint .",
54
+ "lint-files": "eslint",
55
+ "lint:report": "eslint . -o './.reports/eslint.json' -f json || true",
56
+ "test": "vitest run",
57
+ "test:coverage": "../../scripts/vitest-coverage.sh",
58
+ "type-check": "tsgo -p . --noEmit"
59
+ },
60
+ "type": "module",
61
+ "types": "./dist/types/index.d.ts",
62
+ "sideEffects": false
63
+ }