@oxygen-agent/cli 1.1011.322 → 1.1011.405
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/command-manifest.js +7 -0
- package/dist/connectors-commands.d.ts +4 -1
- package/dist/connectors-commands.js +81 -10
- package/dist/contract-flags.d.ts +2 -0
- package/dist/contract-flags.js +4 -2
- package/dist/crm-support-flags.d.ts +11 -0
- package/dist/crm-support-flags.js +60 -0
- package/dist/help.js +10 -0
- package/dist/index.js +175 -65
- package/dist/settings-commands.d.ts +11 -0
- package/dist/settings-commands.js +72 -0
- package/node_modules/@oxygen/shared/dist/bounded-read-result.d.ts +4 -0
- package/node_modules/@oxygen/shared/dist/bounded-read-result.js +25 -0
- package/node_modules/@oxygen/shared/dist/capability-discovery.d.ts +30 -0
- package/node_modules/@oxygen/shared/dist/capability-discovery.js +277 -16
- package/node_modules/@oxygen/shared/dist/contracts/connectors.d.ts +32 -6
- package/node_modules/@oxygen/shared/dist/contracts/connectors.js +56 -4
- package/node_modules/@oxygen/shared/dist/contracts/crm-support.d.ts +117 -0
- package/node_modules/@oxygen/shared/dist/contracts/crm-support.js +43 -0
- package/node_modules/@oxygen/shared/dist/contracts/dashboard-tabs.d.ts +3 -0
- package/node_modules/@oxygen/shared/dist/contracts/dashboard-tabs.js +2 -0
- package/node_modules/@oxygen/shared/dist/contracts/integration-connect.d.ts +4 -0
- package/node_modules/@oxygen/shared/dist/contracts/integration-connect.js +7 -0
- package/node_modules/@oxygen/shared/dist/contracts/operations.js +8 -2
- package/node_modules/@oxygen/shared/dist/contracts/workspace-pages.d.ts +16 -0
- package/node_modules/@oxygen/shared/dist/contracts/workspace-pages.js +37 -0
- package/node_modules/@oxygen/shared/dist/decision-ledger-parser.d.ts +32 -0
- package/node_modules/@oxygen/shared/dist/decision-ledger-parser.js +303 -0
- package/node_modules/@oxygen/shared/dist/decision-ledger.d.ts +10 -0
- package/node_modules/@oxygen/shared/dist/decision-ledger.generated.d.ts +2 -0
- package/node_modules/@oxygen/shared/dist/decision-ledger.generated.js +717 -0
- package/node_modules/@oxygen/shared/dist/decision-ledger.js +20 -0
- package/node_modules/@oxygen/shared/dist/mcp-event-contract.d.ts +10 -7
- package/node_modules/@oxygen/shared/dist/mcp-event-contract.js +11 -7
- package/node_modules/@oxygen/shared/dist/mcp-table-widget.d.ts +50 -0
- package/node_modules/@oxygen/shared/dist/mcp-table-widget.js +24 -0
- package/node_modules/@oxygen/shared/dist/plan-band.d.ts +8 -0
- package/node_modules/@oxygen/shared/dist/plan-band.js +12 -0
- package/node_modules/@oxygen/shared/dist/plan-limits.d.ts +21 -0
- package/node_modules/@oxygen/shared/dist/plan-limits.js +41 -0
- package/node_modules/@oxygen/shared/dist/sequences.d.ts +33 -4
- package/node_modules/@oxygen/shared/dist/sequences.js +48 -13
- package/node_modules/@oxygen/shared/dist/user-capability-routing.js +17 -0
- package/node_modules/@oxygen/shared/dist/version.generated.d.ts +1 -1
- package/node_modules/@oxygen/shared/dist/version.generated.js +1 -1
- package/node_modules/@oxygen/shared/package.json +5 -0
- package/package.json +1 -1
|
@@ -1,10 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AGENT_RUN_APPROVED_CEILING_MAX_CREDITS } from "../plan-limits.js";
|
|
2
|
+
import { bool, int, nullable, obj, str } from "./schema.js";
|
|
2
3
|
export const CONNECTOR_UPDATE_CONTRACT = obj({
|
|
3
4
|
default_workspace: nullable(str({
|
|
4
5
|
minLength: 1,
|
|
5
6
|
maxLength: 200,
|
|
6
7
|
description: "Workspace id, slug or exact name (you must be a member). null = ask each time.",
|
|
7
8
|
})),
|
|
9
|
+
credit_ceiling: nullable(int({
|
|
10
|
+
minimum: 0,
|
|
11
|
+
maximum: AGENT_RUN_APPROVED_CEILING_MAX_CREDITS,
|
|
12
|
+
description: "Most credits the app may spend in any 24 hours while it holds event subscriptions. null = the plan default.",
|
|
13
|
+
})),
|
|
14
|
+
approve_above_default: bool({
|
|
15
|
+
description: "Approve a credit_ceiling above the plan default.",
|
|
16
|
+
}),
|
|
8
17
|
});
|
|
9
18
|
const inferMatchesRoute = true;
|
|
10
19
|
void inferMatchesRoute;
|
|
@@ -17,7 +26,7 @@ export const CONNECTOR_UPDATE_OPERATION = {
|
|
|
17
26
|
contract: CONNECTOR_UPDATE_CONTRACT,
|
|
18
27
|
cli: {
|
|
19
28
|
path: ["connectors", "set"],
|
|
20
|
-
summary: "
|
|
29
|
+
summary: "Change one connected app's settings (ChatGPT, Claude, Codex or another app connected to OXYGEN with OAuth); only that app changes. --default-workspace: where it works without asking (the same setting the app changes when you pick a workspace inside it; latest wins; --clear-default-workspace makes it ask again). --credit-ceiling: the most credits it may spend in any 24 hours while it holds event subscriptions (--clear-credit-ceiling restores the plan default; above the default also needs --approve-above-default). Free; `connectors list` shows each app's current settings.",
|
|
21
30
|
argument: {
|
|
22
31
|
name: "connection",
|
|
23
32
|
description: "The app's id from `connectors list`, or its name (e.g. ChatGPT) when you have one app of that name.",
|
|
@@ -25,8 +34,51 @@ export const CONNECTOR_UPDATE_OPERATION = {
|
|
|
25
34
|
},
|
|
26
35
|
mcp: {
|
|
27
36
|
name: "oxygen_connector_update",
|
|
28
|
-
title: "Oxygen:
|
|
29
|
-
description: "
|
|
37
|
+
title: "Oxygen: Change Connected App Settings",
|
|
38
|
+
description: "Changes one connected app's settings (ChatGPT, Claude, Codex…), leaving your other apps unchanged: default_workspace (same setting as picking a workspace inside that app; latest wins) and credit_ceiling (most credits it may spend in 24 hours while it holds event subscriptions; above the plan default also needs approve_above_default). connection: id or name from oxygen_connector_list, or \"current\" for this app. Free.",
|
|
39
|
+
pack: "workspace",
|
|
40
|
+
},
|
|
41
|
+
mutates: true,
|
|
42
|
+
spends: false,
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* `POST /api/cli/connectors/{connection}/events/revoke`: stop one connected
|
|
46
|
+
* app's MCP event subscription, or every live one it holds (ADR 0030 §10;
|
|
47
|
+
* OXP-11.5.22). Destructive and lasting: the app cannot renew a subscription
|
|
48
|
+
* revoked here. The events/* protocol methods the app itself calls stay outside
|
|
49
|
+
* this contract; they are host-driven.
|
|
50
|
+
*/
|
|
51
|
+
export const CONNECTOR_EVENTS_REVOKE_CONTRACT = obj({
|
|
52
|
+
subscription: str({
|
|
53
|
+
minLength: 1,
|
|
54
|
+
maxLength: 200,
|
|
55
|
+
description: "The subscription id from the app's event subscriptions, or \"all\" for every live one.",
|
|
56
|
+
}),
|
|
57
|
+
workspace: str({
|
|
58
|
+
minLength: 1,
|
|
59
|
+
maxLength: 200,
|
|
60
|
+
description: "Only in this workspace (id, slug or exact name). Omit for all your workspaces.",
|
|
61
|
+
}),
|
|
62
|
+
}, { required: ["subscription"] });
|
|
63
|
+
const revokeInferMatchesRoute = true;
|
|
64
|
+
void revokeInferMatchesRoute;
|
|
65
|
+
export const CONNECTOR_EVENTS_REVOKE_OPERATION = {
|
|
66
|
+
id: "connectors.events.revoke",
|
|
67
|
+
route: "/api/cli/connectors/{connection}/events/revoke",
|
|
68
|
+
method: "POST",
|
|
69
|
+
contract: CONNECTOR_EVENTS_REVOKE_CONTRACT,
|
|
70
|
+
cli: {
|
|
71
|
+
path: ["connectors", "events", "revoke"],
|
|
72
|
+
summary: "Stop OXYGEN sending events to one connected app: revoke one of its event subscriptions (--subscription <id>) or every live one (--subscription all), optionally only in one --workspace. Lasting: the app cannot renew a subscription revoked here, and nothing else about the app changes. Free; `connectors events get <app>` shows what it is subscribed to first.",
|
|
73
|
+
argument: {
|
|
74
|
+
name: "connection",
|
|
75
|
+
description: "The app's id from `connectors list`, or its name (e.g. ChatGPT) when you have one app of that name.",
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
mcp: {
|
|
79
|
+
name: "oxygen_connector_events_revoke",
|
|
80
|
+
title: "Oxygen: Revoke Connected App Event Subscriptions",
|
|
81
|
+
description: "Destructive: stops OXYGEN sending events to one connected app (ChatGPT…) by revoking one event subscription, or \"all\" of its live ones, optionally in one workspace. The app cannot renew a revoked subscription; nothing else about it changes. Read first with oxygen_connector_events_get. Free.",
|
|
30
82
|
pack: "workspace",
|
|
31
83
|
},
|
|
32
84
|
mutates: true,
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
export declare const CRM_NOTE_BODY_MAX_CHARS = 20000;
|
|
2
|
+
export declare const CRM_NOTE_TITLE_MAX_CHARS = 300;
|
|
3
|
+
export declare const CRM_FILE_LABEL_MAX_CHARS = 300;
|
|
4
|
+
export declare const CRM_NOTE_EDIT_CONTRACT: import("./schema.js").ContractObject<{
|
|
5
|
+
readonly body: import("./schema.js").StringProperty;
|
|
6
|
+
readonly title: {
|
|
7
|
+
oneOf: [import("./schema.js").StringProperty, import("./schema.js").NullProperty];
|
|
8
|
+
description?: string;
|
|
9
|
+
};
|
|
10
|
+
readonly pinned: import("./schema.js").BooleanProperty;
|
|
11
|
+
}, never>;
|
|
12
|
+
export declare const CRM_FILE_ATTACH_CONTRACT: import("./schema.js").ContractObject<{
|
|
13
|
+
readonly name: import("./schema.js").StringProperty;
|
|
14
|
+
readonly content_base64: import("./schema.js").StringProperty;
|
|
15
|
+
readonly label: {
|
|
16
|
+
oneOf: [import("./schema.js").StringProperty, import("./schema.js").NullProperty];
|
|
17
|
+
description?: string;
|
|
18
|
+
};
|
|
19
|
+
}, "content_base64" | "name">;
|
|
20
|
+
export declare const CRM_FILE_PREPARE_CONTRACT: import("./schema.js").ContractObject<{
|
|
21
|
+
readonly name: import("./schema.js").StringProperty;
|
|
22
|
+
readonly byte_length: {
|
|
23
|
+
type: "integer";
|
|
24
|
+
description?: string;
|
|
25
|
+
minimum?: number;
|
|
26
|
+
maximum?: number;
|
|
27
|
+
"x-clamp"?: true;
|
|
28
|
+
};
|
|
29
|
+
readonly sha256: import("./schema.js").StringProperty;
|
|
30
|
+
}, "byte_length" | "name" | "sha256">;
|
|
31
|
+
export declare const CRM_FILE_COMPLETE_CONTRACT: import("./schema.js").ContractObject<{
|
|
32
|
+
readonly label: {
|
|
33
|
+
oneOf: [import("./schema.js").StringProperty, import("./schema.js").NullProperty];
|
|
34
|
+
description?: string;
|
|
35
|
+
};
|
|
36
|
+
}, never>;
|
|
37
|
+
export declare const CRM_PHOTOS_CONTRACT: import("./schema.js").ContractObject<{
|
|
38
|
+
readonly mode: {
|
|
39
|
+
type: "string";
|
|
40
|
+
enum: readonly ("dry_run" | "live")[];
|
|
41
|
+
description?: string;
|
|
42
|
+
};
|
|
43
|
+
readonly live: import("./schema.js").BooleanProperty;
|
|
44
|
+
readonly limit: {
|
|
45
|
+
type: "integer";
|
|
46
|
+
description?: string;
|
|
47
|
+
minimum?: number;
|
|
48
|
+
maximum?: number;
|
|
49
|
+
"x-clamp"?: true;
|
|
50
|
+
};
|
|
51
|
+
}, never>;
|
|
52
|
+
export declare const CRM_OBJECTS_QUERY_CONTRACT: import("./schema.js").ContractObject<{
|
|
53
|
+
readonly projection: {
|
|
54
|
+
type: "string";
|
|
55
|
+
enum: readonly ("compact" | "full")[];
|
|
56
|
+
description?: string;
|
|
57
|
+
};
|
|
58
|
+
readonly cursor: import("./schema.js").StringProperty;
|
|
59
|
+
readonly limit: {
|
|
60
|
+
type: "integer";
|
|
61
|
+
description?: string;
|
|
62
|
+
minimum?: number;
|
|
63
|
+
maximum?: number;
|
|
64
|
+
"x-clamp"?: true;
|
|
65
|
+
};
|
|
66
|
+
readonly max_chars: {
|
|
67
|
+
type: "integer";
|
|
68
|
+
description?: string;
|
|
69
|
+
minimum?: number;
|
|
70
|
+
maximum?: number;
|
|
71
|
+
"x-clamp"?: true;
|
|
72
|
+
};
|
|
73
|
+
}, never>;
|
|
74
|
+
export declare const CRM_CONNECTIONS_QUERY_CONTRACT: import("./schema.js").ContractObject<{
|
|
75
|
+
readonly projection: {
|
|
76
|
+
type: "string";
|
|
77
|
+
enum: readonly ("compact" | "full")[];
|
|
78
|
+
description?: string;
|
|
79
|
+
};
|
|
80
|
+
readonly max_chars: {
|
|
81
|
+
type: "integer";
|
|
82
|
+
description?: string;
|
|
83
|
+
minimum?: number;
|
|
84
|
+
maximum?: number;
|
|
85
|
+
"x-clamp"?: true;
|
|
86
|
+
};
|
|
87
|
+
readonly conversation_limit: {
|
|
88
|
+
type: "integer";
|
|
89
|
+
description?: string;
|
|
90
|
+
minimum?: number;
|
|
91
|
+
maximum?: number;
|
|
92
|
+
"x-clamp"?: true;
|
|
93
|
+
};
|
|
94
|
+
readonly sequence_limit: {
|
|
95
|
+
type: "integer";
|
|
96
|
+
description?: string;
|
|
97
|
+
minimum?: number;
|
|
98
|
+
maximum?: number;
|
|
99
|
+
"x-clamp"?: true;
|
|
100
|
+
};
|
|
101
|
+
}, never>;
|
|
102
|
+
export declare const CRM_TASKS_QUERY_CONTRACT: import("./schema.js").ContractObject<{
|
|
103
|
+
readonly status: {
|
|
104
|
+
type: "string";
|
|
105
|
+
enum: readonly ("all" | "cancelled" | "completed" | "open")[];
|
|
106
|
+
description?: string;
|
|
107
|
+
};
|
|
108
|
+
readonly assignee: import("./schema.js").StringProperty;
|
|
109
|
+
readonly limit: {
|
|
110
|
+
type: "integer";
|
|
111
|
+
description?: string;
|
|
112
|
+
minimum?: number;
|
|
113
|
+
maximum?: number;
|
|
114
|
+
"x-clamp"?: true;
|
|
115
|
+
};
|
|
116
|
+
readonly cursor: import("./schema.js").StringProperty;
|
|
117
|
+
}, never>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { bool, enumOf, int, nullable, obj, str } from "./schema.js";
|
|
2
|
+
export const CRM_NOTE_BODY_MAX_CHARS = 20_000;
|
|
3
|
+
export const CRM_NOTE_TITLE_MAX_CHARS = 300;
|
|
4
|
+
export const CRM_FILE_LABEL_MAX_CHARS = 300;
|
|
5
|
+
export const CRM_NOTE_EDIT_CONTRACT = obj({
|
|
6
|
+
body: str({ minLength: 1, maxLength: CRM_NOTE_BODY_MAX_CHARS, description: "Replacement Markdown text." }),
|
|
7
|
+
title: nullable(str({ maxLength: CRM_NOTE_TITLE_MAX_CHARS, description: "Replacement title; null or empty clears." })),
|
|
8
|
+
pinned: bool({ description: "Whether the note is pinned; false unpins." }),
|
|
9
|
+
});
|
|
10
|
+
export const CRM_FILE_ATTACH_CONTRACT = obj({
|
|
11
|
+
name: str({ minLength: 1, description: "Original filename." }),
|
|
12
|
+
content_base64: str({ minLength: 1, description: "Inline bytes; entire JSON request must fit 2 MB. Larger files use upload prepare/complete." }),
|
|
13
|
+
label: nullable(str({ maxLength: CRM_FILE_LABEL_MAX_CHARS, description: "Optional record-local label." })),
|
|
14
|
+
}, { required: ["name", "content_base64"] });
|
|
15
|
+
export const CRM_FILE_PREPARE_CONTRACT = obj({
|
|
16
|
+
name: str({ minLength: 1, description: "Original filename." }),
|
|
17
|
+
byte_length: int({ minimum: 0, maximum: 100 * 1024 * 1024, description: "Exact byte length; maximum 100 MiB." }),
|
|
18
|
+
sha256: str({ minLength: 64, maxLength: 64, description: "Hex SHA-256 of the exact bytes to PUT." }),
|
|
19
|
+
}, { required: ["name", "byte_length", "sha256"] });
|
|
20
|
+
export const CRM_FILE_COMPLETE_CONTRACT = obj({ label: nullable(str({ maxLength: CRM_FILE_LABEL_MAX_CHARS, description: "Optional record-local label." })) });
|
|
21
|
+
export const CRM_PHOTOS_CONTRACT = obj({
|
|
22
|
+
mode: enumOf(["dry_run", "live"], { description: "Default dry_run. Inspect preview before live." }),
|
|
23
|
+
live: bool({ description: "Shortcut for mode=live; conflicts with mode=dry_run." }),
|
|
24
|
+
limit: int({ minimum: 1, maximum: 10_000, description: "Rows scanned; default 2000." }),
|
|
25
|
+
});
|
|
26
|
+
export const CRM_OBJECTS_QUERY_CONTRACT = obj({
|
|
27
|
+
projection: enumOf(["compact", "full"], { description: "compact lists names and table/identity bindings; full includes all field configuration. HTTP default full." }),
|
|
28
|
+
cursor: str({ maxLength: 2000, description: "Previous next_cursor; bound to projection." }),
|
|
29
|
+
limit: int({ minimum: 1, maximum: 100, description: "Objects in one batch; default 20 for bounded reads." }),
|
|
30
|
+
max_chars: int({ minimum: 2000, maximum: 40_000, description: "Complete response window; oversized objects refuse without advancing." }),
|
|
31
|
+
});
|
|
32
|
+
export const CRM_CONNECTIONS_QUERY_CONTRACT = obj({
|
|
33
|
+
projection: enumOf(["compact", "full"], { description: "Compact returns identifiers and short communication previews. HTTP default full." }),
|
|
34
|
+
max_chars: int({ minimum: 2000, maximum: 40_000, description: "Complete recent-window response; hasMore includes omitted links." }),
|
|
35
|
+
conversation_limit: int({ minimum: 1, maximum: 100, description: "Most recent conversation links; server maximum 100." }),
|
|
36
|
+
sequence_limit: int({ minimum: 1, maximum: 100, description: "Most recent sequence links; server maximum 100." }),
|
|
37
|
+
});
|
|
38
|
+
export const CRM_TASKS_QUERY_CONTRACT = obj({
|
|
39
|
+
status: enumOf(["open", "completed", "cancelled", "all"], { description: "Workspace default open; record default all. all omits the API filter." }),
|
|
40
|
+
assignee: str({ description: "Workspace scope only: member email, user id, or me." }),
|
|
41
|
+
limit: int({ minimum: 1, maximum: 200, description: "Maximum tasks; default 50." }),
|
|
42
|
+
cursor: str({ minLength: 1, maxLength: 500, description: "Previous nextCursor." }),
|
|
43
|
+
});
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Account selection is shared; the remaining provider-specific connect fields have separate owners. */
|
|
2
|
+
export declare const INTEGRATION_CONNECT_ACCOUNT_CONTRACT: import("./schema.js").ContractObject<{
|
|
3
|
+
readonly account_id: import("./schema.js").StringProperty;
|
|
4
|
+
}, never>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { obj, str } from "./schema.js";
|
|
2
|
+
/** Account selection is shared; the remaining provider-specific connect fields have separate owners. */
|
|
3
|
+
export const INTEGRATION_CONNECT_ACCOUNT_CONTRACT = obj({
|
|
4
|
+
account_id: str({
|
|
5
|
+
description: "Cloudflare account id from needs_account_selection. Omit for a single-account token.",
|
|
6
|
+
}),
|
|
7
|
+
});
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* The CLI command, the MCP tool and the route read the same spec, so the three
|
|
5
5
|
* cannot disagree on which fields exist. Leaf and browser-safe.
|
|
6
6
|
*/
|
|
7
|
-
import { CONNECTOR_UPDATE_OPERATION } from "./connectors.js";
|
|
7
|
+
import { CONNECTOR_EVENTS_REVOKE_OPERATION, CONNECTOR_UPDATE_OPERATION } from "./connectors.js";
|
|
8
8
|
import { SENDER_LIMITS_SET_OPERATION } from "./sender-limits.js";
|
|
9
|
+
import { WORKSPACE_PAGES_UPDATE_OPERATION } from "./workspace-pages.js";
|
|
9
10
|
/** The route with its `{param}` segments filled in, each URL-encoded. */
|
|
10
11
|
export function operationPath(spec, params) {
|
|
11
12
|
return spec.route.replace(/\{(\w+)\}/g, (_match, name) => {
|
|
@@ -15,4 +16,9 @@ export function operationPath(spec, params) {
|
|
|
15
16
|
return encodeURIComponent(value);
|
|
16
17
|
});
|
|
17
18
|
}
|
|
18
|
-
export const OPERATION_SPECS = [
|
|
19
|
+
export const OPERATION_SPECS = [
|
|
20
|
+
SENDER_LIMITS_SET_OPERATION,
|
|
21
|
+
CONNECTOR_UPDATE_OPERATION,
|
|
22
|
+
CONNECTOR_EVENTS_REVOKE_OPERATION,
|
|
23
|
+
WORKSPACE_PAGES_UPDATE_OPERATION,
|
|
24
|
+
];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `POST /api/cli/settings/pages`: the web app's sidebar pages a workspace hides
|
|
3
|
+
* for every member (Settings → Customise; Philipp, 2026-09-30). Presentation
|
|
4
|
+
* only: a hidden page leaves the sidebar and the ⌘K palette, and stays
|
|
5
|
+
* reachable by URL and deep-link. Admins and owners change it; every member
|
|
6
|
+
* reads it through `GET` on the same route.
|
|
7
|
+
*/
|
|
8
|
+
import type { OperationSpec } from "./operations.js";
|
|
9
|
+
import { type Infer } from "./schema.js";
|
|
10
|
+
export declare const WORKSPACE_PAGES_UPDATE_CONTRACT: import("./schema.js").ContractObject<{
|
|
11
|
+
readonly hide: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
12
|
+
readonly show: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
13
|
+
readonly show_all: import("./schema.js").BooleanProperty;
|
|
14
|
+
}, never>;
|
|
15
|
+
export type WorkspacePagesUpdate = Infer<typeof WORKSPACE_PAGES_UPDATE_CONTRACT>;
|
|
16
|
+
export declare const WORKSPACE_PAGES_UPDATE_OPERATION: OperationSpec<typeof WORKSPACE_PAGES_UPDATE_CONTRACT>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { arr, bool, obj, str } from "./schema.js";
|
|
2
|
+
const pageRef = str({ minLength: 1, maxLength: 200 });
|
|
3
|
+
export const WORKSPACE_PAGES_UPDATE_CONTRACT = obj({
|
|
4
|
+
hide: arr(pageRef, {
|
|
5
|
+
minItems: 1,
|
|
6
|
+
maxItems: 100,
|
|
7
|
+
description: "Pages to hide for everyone, each by its path (/unibox) or name (Unibox) from the page list. Hiding a section hides its sub-pages.",
|
|
8
|
+
}),
|
|
9
|
+
show: arr(pageRef, {
|
|
10
|
+
minItems: 1,
|
|
11
|
+
maxItems: 100,
|
|
12
|
+
description: "Hidden pages to show again, by path or name.",
|
|
13
|
+
}),
|
|
14
|
+
show_all: bool({
|
|
15
|
+
description: "Show every page again. With hide, only those pages stay hidden.",
|
|
16
|
+
}),
|
|
17
|
+
});
|
|
18
|
+
const inferMatchesRoute = true;
|
|
19
|
+
void inferMatchesRoute;
|
|
20
|
+
export const WORKSPACE_PAGES_UPDATE_OPERATION = {
|
|
21
|
+
id: "workspace_pages.update",
|
|
22
|
+
route: "/api/cli/settings/pages",
|
|
23
|
+
method: "POST",
|
|
24
|
+
contract: WORKSPACE_PAGES_UPDATE_CONTRACT,
|
|
25
|
+
cli: {
|
|
26
|
+
path: ["settings", "pages", "set"],
|
|
27
|
+
summary: "Hide or show pages in the web app's sidebar navigation menu for everyone in this workspace (Settings → Customise): --hide Unibox,Publishing, --show Unibox, --show-all. Name pages by path or name from `settings pages list`; hiding a section hides its sub-pages. Nothing is deleted and hidden pages stay reachable by URL. Admins and owners only; free.",
|
|
28
|
+
},
|
|
29
|
+
mcp: {
|
|
30
|
+
name: "oxygen_settings_pages_update",
|
|
31
|
+
title: "Oxygen: Hide or Show Sidebar Pages",
|
|
32
|
+
description: "Hides or shows pages in the OXYGEN web app's sidebar navigation for everyone in this workspace (Settings → Customise). hide/show take page paths or names from oxygen_settings_pages_get; show_all shows every page again. Nothing is deleted and hidden pages stay reachable by URL. Admins and owners only. Free.",
|
|
33
|
+
pack: "workspace",
|
|
34
|
+
},
|
|
35
|
+
mutates: true,
|
|
36
|
+
spends: false,
|
|
37
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type DecisionLedgerStatus = "ratified" | "proposed" | "open";
|
|
2
|
+
export type DecisionLedgerEntry = {
|
|
3
|
+
/** Ledger id as written, e.g. "D24" or "D34a". */
|
|
4
|
+
id: string;
|
|
5
|
+
/** The "Decision" cell as plain text. */
|
|
6
|
+
title: string;
|
|
7
|
+
/** The answer as plain text: the ratified or proposed answer, or the Open table's "Status" cell. */
|
|
8
|
+
answer: string;
|
|
9
|
+
/** In force (`ratified`), awaiting the founder (`proposed`), or undecided (`open`). */
|
|
10
|
+
status: DecisionLedgerStatus;
|
|
11
|
+
/** The table the row sits in. A Proposed row ratified in chat keeps `proposed` here. */
|
|
12
|
+
table: "ratified" | "open" | "proposed";
|
|
13
|
+
/** The ISO date (YYYY-MM-DD) it was ratified, when the ledger records one. */
|
|
14
|
+
ratifiedOn: string | null;
|
|
15
|
+
/**
|
|
16
|
+
* Where it shipped or lands: the Ratified table's "Shipped / lands" cell, the
|
|
17
|
+
* Open table's "Owner / forcing function" cell, or what follows the
|
|
18
|
+
* ratification clause in a Proposed row's status cell.
|
|
19
|
+
*/
|
|
20
|
+
lands: string | null;
|
|
21
|
+
/** Decisions that replace this one outright, sorted by id. */
|
|
22
|
+
supersededBy: string[];
|
|
23
|
+
/**
|
|
24
|
+
* Decisions that replace only part of this one while the rest stands
|
|
25
|
+
* ("Supersedes only D19(a)'s … clause", "Supersedes D55's company half",
|
|
26
|
+
* "Superseded by D29 … as a routing posture"), sorted by id. A decision that
|
|
27
|
+
* another statement calls replaced outright is listed in `supersededBy` only.
|
|
28
|
+
*/
|
|
29
|
+
partlySupersededBy: string[];
|
|
30
|
+
};
|
|
31
|
+
/** Parse the ledger markdown into entries sorted by decision id. */
|
|
32
|
+
export declare function parseDecisionLedger(markdown: string): DecisionLedgerEntry[];
|