@oxygen-agent/cli 1.1014.135 → 1.1014.618
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/admin-primary-providers-render.js +27 -19
- package/dist/cli-output.d.ts +12 -0
- package/dist/cli-output.js +395 -0
- package/dist/cli-paths.d.ts +1 -0
- package/dist/cli-paths.js +3 -0
- package/dist/cli-profile-context.d.ts +3 -0
- package/dist/cli-profile-context.js +13 -0
- package/dist/command-manifest.d.ts +15 -0
- package/dist/command-manifest.js +23 -1
- package/dist/command-support.d.ts +438 -0
- package/dist/command-support.js +1610 -0
- package/dist/commands/action-column.d.ts +3 -0
- package/dist/commands/action-column.js +43 -0
- package/dist/commands/activation.d.ts +3 -0
- package/dist/commands/activation.js +24 -0
- package/dist/commands/admin.d.ts +3 -0
- package/dist/commands/admin.js +347 -0
- package/dist/commands/ads.d.ts +3 -0
- package/dist/commands/ads.js +62 -0
- package/dist/commands/agent.d.ts +3 -0
- package/dist/commands/agent.js +274 -0
- package/dist/commands/api-keys.d.ts +3 -0
- package/dist/commands/api-keys.js +77 -0
- package/dist/commands/approvals.d.ts +3 -0
- package/dist/commands/approvals.js +518 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.js +230 -0
- package/dist/commands/billing.d.ts +3 -0
- package/dist/commands/billing.js +357 -0
- package/dist/commands/blueprints.d.ts +3 -0
- package/dist/commands/blueprints.js +312 -0
- package/dist/commands/budget.d.ts +3 -0
- package/dist/commands/budget.js +55 -0
- package/dist/commands/callables.d.ts +3 -0
- package/dist/commands/callables.js +111 -0
- package/dist/commands/capabilities.d.ts +3 -0
- package/dist/commands/capabilities.js +44 -0
- package/dist/commands/cells.d.ts +3 -0
- package/dist/commands/cells.js +94 -0
- package/dist/commands/columns.d.ts +3 -0
- package/dist/commands/columns.js +1628 -0
- package/dist/commands/commands.d.ts +3 -0
- package/dist/commands/commands.js +45 -0
- package/dist/commands/comments.d.ts +3 -0
- package/dist/commands/comments.js +188 -0
- package/dist/commands/companies.d.ts +3 -0
- package/dist/commands/companies.js +312 -0
- package/dist/commands/connections.d.ts +3 -0
- package/dist/commands/connections.js +39 -0
- package/dist/commands/context.d.ts +3 -0
- package/dist/commands/context.js +170 -0
- package/dist/commands/copilot.d.ts +3 -0
- package/dist/commands/copilot.js +565 -0
- package/dist/commands/crm.d.ts +3 -0
- package/dist/commands/crm.js +1669 -0
- package/dist/commands/custom-integrations.d.ts +3 -0
- package/dist/commands/custom-integrations.js +140 -0
- package/dist/commands/dashboards.d.ts +3 -0
- package/dist/commands/dashboards.js +240 -0
- package/dist/commands/db.d.ts +3 -0
- package/dist/commands/db.js +190 -0
- package/dist/commands/deliverability.d.ts +3 -0
- package/dist/commands/deliverability.js +90 -0
- package/dist/commands/directory.d.ts +3 -0
- package/dist/commands/directory.js +101 -0
- package/dist/commands/domains.d.ts +3 -0
- package/dist/commands/domains.js +604 -0
- package/dist/commands/egress.d.ts +3 -0
- package/dist/commands/egress.js +130 -0
- package/dist/commands/email.d.ts +3 -0
- package/dist/commands/email.js +49 -0
- package/dist/commands/engagement.d.ts +3 -0
- package/dist/commands/engagement.js +189 -0
- package/dist/commands/enrich-column.d.ts +3 -0
- package/dist/commands/enrich-column.js +149 -0
- package/dist/commands/enrichment.d.ts +3 -0
- package/dist/commands/enrichment.js +49 -0
- package/dist/commands/feedback.d.ts +3 -0
- package/dist/commands/feedback.js +96 -0
- package/dist/commands/feeds.d.ts +3 -0
- package/dist/commands/feeds.js +486 -0
- package/dist/commands/find.d.ts +3 -0
- package/dist/commands/find.js +159 -0
- package/dist/commands/followers.d.ts +3 -0
- package/dist/commands/followers.js +39 -0
- package/dist/commands/formulas.d.ts +3 -0
- package/dist/commands/formulas.js +43 -0
- package/dist/commands/home.d.ts +3 -0
- package/dist/commands/home.js +22 -0
- package/dist/commands/inbox.d.ts +3 -0
- package/dist/commands/inbox.js +779 -0
- package/dist/commands/integrations.d.ts +3 -0
- package/dist/commands/integrations.js +290 -0
- package/dist/commands/knowledge.d.ts +3 -0
- package/dist/commands/knowledge.js +874 -0
- package/dist/commands/lead-sourcing.d.ts +3 -0
- package/dist/commands/lead-sourcing.js +52 -0
- package/dist/commands/limits.d.ts +3 -0
- package/dist/commands/limits.js +54 -0
- package/dist/commands/linkedin.d.ts +3 -0
- package/dist/commands/linkedin.js +275 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.js +347 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.js +12 -0
- package/dist/commands/mailboxes.d.ts +3 -0
- package/dist/commands/mailboxes.js +1290 -0
- package/dist/commands/managed-inboxes.d.ts +3 -0
- package/dist/commands/managed-inboxes.js +361 -0
- package/dist/commands/messages.d.ts +3 -0
- package/dist/commands/messages.js +78 -0
- package/dist/commands/notetaker.d.ts +3 -0
- package/dist/commands/notetaker.js +79 -0
- package/dist/commands/observability.d.ts +3 -0
- package/dist/commands/observability.js +125 -0
- package/dist/commands/orgs.d.ts +3 -0
- package/dist/commands/orgs.js +237 -0
- package/dist/commands/people.d.ts +3 -0
- package/dist/commands/people.js +353 -0
- package/dist/commands/posts.d.ts +3 -0
- package/dist/commands/posts.js +139 -0
- package/dist/commands/profiles.d.ts +3 -0
- package/dist/commands/profiles.js +250 -0
- package/dist/commands/projects.d.ts +3 -0
- package/dist/commands/projects.js +94 -0
- package/dist/commands/prompts.d.ts +3 -0
- package/dist/commands/prompts.js +84 -0
- package/dist/commands/publishing.d.ts +3 -0
- package/dist/commands/publishing.js +1419 -0
- package/dist/commands/recipes.d.ts +3 -0
- package/dist/commands/recipes.js +120 -0
- package/dist/commands/reviews.d.ts +3 -0
- package/dist/commands/reviews.js +75 -0
- package/dist/commands/rows.d.ts +3 -0
- package/dist/commands/rows.js +27 -0
- package/dist/commands/runs.d.ts +3 -0
- package/dist/commands/runs.js +37 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.js +182 -0
- package/dist/commands/senders.d.ts +3 -0
- package/dist/commands/senders.js +393 -0
- package/dist/commands/sequences.d.ts +3 -0
- package/dist/commands/sequences.js +2322 -0
- package/dist/commands/session.d.ts +3 -0
- package/dist/commands/session.js +109 -0
- package/dist/commands/signals.d.ts +3 -0
- package/dist/commands/signals.js +289 -0
- package/dist/commands/signup-leads.d.ts +3 -0
- package/dist/commands/signup-leads.js +46 -0
- package/dist/commands/skills.d.ts +3 -0
- package/dist/commands/skills.js +50 -0
- package/dist/commands/sourcing.d.ts +3 -0
- package/dist/commands/sourcing.js +27 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.js +51 -0
- package/dist/commands/supabase.d.ts +3 -0
- package/dist/commands/supabase.js +128 -0
- package/dist/commands/support.d.ts +3 -0
- package/dist/commands/support.js +651 -0
- package/dist/commands/suppressions.d.ts +3 -0
- package/dist/commands/suppressions.js +577 -0
- package/dist/commands/table-ingestions.d.ts +3 -0
- package/dist/commands/table-ingestions.js +145 -0
- package/dist/commands/table-runs.d.ts +3 -0
- package/dist/commands/table-runs.js +277 -0
- package/dist/commands/tables.d.ts +3 -0
- package/dist/commands/tables.js +3492 -0
- package/dist/commands/tags.d.ts +3 -0
- package/dist/commands/tags.js +147 -0
- package/dist/commands/tools.d.ts +3 -0
- package/dist/commands/tools.js +246 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.js +106 -0
- package/dist/commands/verify.d.ts +3 -0
- package/dist/commands/verify.js +27 -0
- package/dist/commands/viewers.d.ts +3 -0
- package/dist/commands/viewers.js +72 -0
- package/dist/commands/voice.d.ts +3 -0
- package/dist/commands/voice.js +351 -0
- package/dist/commands/whatsapp.d.ts +3 -0
- package/dist/commands/whatsapp.js +226 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.js +110 -0
- package/dist/commands/worker.d.ts +3 -0
- package/dist/commands/worker.js +60 -0
- package/dist/commands/workflows.d.ts +3 -0
- package/dist/commands/workflows.js +1752 -0
- package/dist/commands/workspace.d.ts +3 -0
- package/dist/commands/workspace.js +94 -0
- package/dist/compact-list-flags.d.ts +7 -0
- package/dist/compact-list-flags.js +12 -0
- package/dist/crm-support-flags.js +14 -5
- package/dist/customer-operation-commands.js +8 -6
- package/dist/diagnostic-uploader.d.ts +3 -1
- package/dist/diagnostic-uploader.js +29 -8
- package/dist/help.d.ts +5 -0
- package/dist/help.js +22 -0
- package/dist/index.d.ts +98 -1
- package/dist/index.js +331 -30719
- package/dist/local-module-loader.d.ts +4 -0
- package/dist/local-module-loader.js +156 -0
- package/dist/visual-commands.js +9 -5
- package/node_modules/@oxygen/cli-ugc/dist/commands.js +2 -2
- package/node_modules/@oxygen/shared/dist/agent-session-schedule.d.ts +36 -0
- package/node_modules/@oxygen/shared/dist/agent-session-schedule.js +69 -0
- package/node_modules/@oxygen/shared/dist/agent-sessions.d.ts +14 -5
- package/node_modules/@oxygen/shared/dist/agent-sessions.js +14 -3
- package/node_modules/@oxygen/shared/dist/capability-discovery.js +175 -14
- package/node_modules/@oxygen/shared/dist/compact-list-result.d.ts +6 -0
- package/node_modules/@oxygen/shared/dist/compact-list-result.js +27 -0
- package/node_modules/@oxygen/shared/dist/contracts/agent-sessions.d.ts +12 -1
- package/node_modules/@oxygen/shared/dist/contracts/agent-sessions.js +5 -2
- package/node_modules/@oxygen/shared/dist/contracts/browser-operations.js +4 -2
- package/node_modules/@oxygen/shared/dist/contracts/compact-list-reads.d.ts +57 -0
- package/node_modules/@oxygen/shared/dist/contracts/compact-list-reads.js +23 -0
- package/node_modules/@oxygen/shared/dist/contracts/crm-support.d.ts +52 -0
- package/node_modules/@oxygen/shared/dist/contracts/crm-support.js +43 -2
- package/node_modules/@oxygen/shared/dist/contracts/customer-operations.js +17 -14
- package/node_modules/@oxygen/shared/dist/contracts/knowledge-content-reads.js +1 -1
- package/node_modules/@oxygen/shared/dist/contracts/knowledge-proposal-reads.d.ts +49 -0
- package/node_modules/@oxygen/shared/dist/contracts/knowledge-proposal-reads.js +14 -0
- package/node_modules/@oxygen/shared/dist/contracts/knowledge-sync.js +1 -1
- package/node_modules/@oxygen/shared/dist/contracts/limits-read.js +60 -7
- package/node_modules/@oxygen/shared/dist/contracts/operations.d.ts +9 -1
- package/node_modules/@oxygen/shared/dist/contracts/operations.js +13 -5
- package/node_modules/@oxygen/shared/dist/contracts/publishing-reads.js +1 -1
- package/node_modules/@oxygen/shared/dist/contracts/teammates.d.ts +16 -0
- package/node_modules/@oxygen/shared/dist/contracts/teammates.js +115 -0
- package/node_modules/@oxygen/shared/dist/cost-estimate-view.js +21 -3
- package/node_modules/@oxygen/shared/dist/cost-estimate.d.ts +31 -1
- package/node_modules/@oxygen/shared/dist/cost-estimate.js +56 -15
- package/node_modules/@oxygen/shared/dist/diagnostic-credentials.d.ts +2 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-credentials.js +2 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-lock.js +71 -44
- package/node_modules/@oxygen/shared/dist/diagnostic-spool.d.ts +18 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-spool.js +348 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-storage-failure.d.ts +10 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-storage-failure.js +42 -0
- package/node_modules/@oxygen/shared/dist/diagnostic-storage.d.ts +1 -1
- package/node_modules/@oxygen/shared/dist/diagnostic-storage.js +59 -213
- package/node_modules/@oxygen/shared/dist/diagnostics.js +3 -2
- package/node_modules/@oxygen/shared/dist/email-dsn.d.ts +16 -5
- package/node_modules/@oxygen/shared/dist/email-dsn.js +97 -1
- package/node_modules/@oxygen/shared/dist/emailguard-placement-probe.js +5 -0
- package/node_modules/@oxygen/shared/dist/enrichment-intents.js +4 -5
- package/node_modules/@oxygen/shared/dist/file-import.js +5 -2
- package/node_modules/@oxygen/shared/dist/hosted-ai.d.ts +30 -0
- package/node_modules/@oxygen/shared/dist/hosted-ai.js +20 -0
- package/node_modules/@oxygen/shared/dist/knowledge-bootstrap.d.ts +6 -2
- package/node_modules/@oxygen/shared/dist/knowledge-seed-content.d.ts +17 -7
- package/node_modules/@oxygen/shared/dist/knowledge-seed-content.js +81 -17
- package/node_modules/@oxygen/shared/dist/langfuse.js +8 -4
- package/node_modules/@oxygen/shared/dist/mailbox-egress-ownership.d.ts +1 -1
- package/node_modules/@oxygen/shared/dist/mailbox-import.d.ts +6 -3
- package/node_modules/@oxygen/shared/dist/mailbox-import.js +9 -9
- package/node_modules/@oxygen/shared/dist/mcp-server-info.d.ts +8 -0
- package/node_modules/@oxygen/shared/dist/mcp-server-info.js +10 -0
- package/node_modules/@oxygen/shared/dist/object-storage.d.ts +10 -0
- package/node_modules/@oxygen/shared/dist/object-storage.js +14 -0
- package/node_modules/@oxygen/shared/dist/plan-limits-view.d.ts +5 -0
- package/node_modules/@oxygen/shared/dist/plan-limits-view.js +17 -1
- package/node_modules/@oxygen/shared/dist/pricing-sheet.d.ts +1 -1
- package/node_modules/@oxygen/shared/dist/pricing-sheet.js +1 -1
- package/node_modules/@oxygen/shared/dist/provider-selection.d.ts +15 -0
- package/node_modules/@oxygen/shared/dist/provider-selection.js +3 -0
- package/node_modules/@oxygen/shared/dist/repricing.d.ts +1 -1
- package/node_modules/@oxygen/shared/dist/repricing.js +2 -2
- package/node_modules/@oxygen/shared/dist/schedule-label.d.ts +6 -0
- package/node_modules/@oxygen/shared/dist/schedule-label.js +12 -0
- package/node_modules/@oxygen/shared/dist/sequence-failures.d.ts +1 -0
- package/node_modules/@oxygen/shared/dist/sequence-failures.js +20 -6
- package/node_modules/@oxygen/shared/dist/teammate-groups.d.ts +55 -0
- package/node_modules/@oxygen/shared/dist/teammate-groups.js +74 -0
- package/node_modules/@oxygen/shared/dist/teammate-messages.d.ts +52 -0
- package/node_modules/@oxygen/shared/dist/teammate-messages.js +88 -0
- package/node_modules/@oxygen/shared/dist/teammate-notes.d.ts +58 -0
- package/node_modules/@oxygen/shared/dist/teammate-notes.js +73 -0
- package/node_modules/@oxygen/shared/dist/teammate-routines.d.ts +95 -0
- package/node_modules/@oxygen/shared/dist/teammate-routines.js +266 -0
- package/node_modules/@oxygen/shared/dist/teammate-tasks.d.ts +56 -0
- package/node_modules/@oxygen/shared/dist/teammate-tasks.js +114 -0
- package/node_modules/@oxygen/shared/dist/teammates.d.ts +78 -0
- package/node_modules/@oxygen/shared/dist/teammates.js +140 -0
- package/node_modules/@oxygen/shared/dist/user-capability-routing.js +120 -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/dist/visual-render.d.ts +9 -1
- package/node_modules/@oxygen/shared/dist/visual-render.js +12 -5
- package/node_modules/@oxygen/shared/dist/warmup-metrics.d.ts +5 -0
- package/node_modules/@oxygen/shared/dist/warmup-metrics.js +44 -0
- package/package.json +1 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ContractIssue } from "./schema.js";
|
|
1
2
|
export declare const CRM_NOTE_BODY_MAX_CHARS = 20000;
|
|
2
3
|
export declare const CRM_NOTE_TITLE_MAX_CHARS = 300;
|
|
3
4
|
export declare const CRM_FILE_LABEL_MAX_CHARS = 300;
|
|
@@ -10,6 +11,15 @@ export declare const CRM_NOTE_EDIT_CONTRACT: import("./schema.js").ContractObjec
|
|
|
10
11
|
};
|
|
11
12
|
readonly pinned: import("./schema.js").BooleanProperty;
|
|
12
13
|
}, never>;
|
|
14
|
+
export declare const CRM_NOTE_EDIT_INPUT_CONTRACT: import("./schema.js").ContractObject<{
|
|
15
|
+
readonly body: import("./schema.js").StringProperty;
|
|
16
|
+
readonly title: {
|
|
17
|
+
oneOf: [import("./schema.js").StringProperty, import("./schema.js").NullProperty];
|
|
18
|
+
description?: string;
|
|
19
|
+
};
|
|
20
|
+
readonly pinned: import("./schema.js").BooleanProperty;
|
|
21
|
+
}, never>;
|
|
22
|
+
export declare function crmNoteEditInputIssues(args: Readonly<Record<string, unknown>>): readonly ContractIssue[];
|
|
13
23
|
export declare const CRM_FILE_ATTACH_CONTRACT: import("./schema.js").ContractObject<{
|
|
14
24
|
readonly name: import("./schema.js").StringProperty;
|
|
15
25
|
readonly content_base64: import("./schema.js").StringProperty;
|
|
@@ -18,6 +28,14 @@ export declare const CRM_FILE_ATTACH_CONTRACT: import("./schema.js").ContractObj
|
|
|
18
28
|
description?: string;
|
|
19
29
|
};
|
|
20
30
|
}, "content_base64" | "name">;
|
|
31
|
+
export declare const CRM_FILE_ATTACH_INPUT_CONTRACT: import("./schema.js").ContractObject<{
|
|
32
|
+
readonly name: import("./schema.js").StringProperty;
|
|
33
|
+
readonly content_base64: import("./schema.js").StringProperty;
|
|
34
|
+
readonly label: {
|
|
35
|
+
oneOf: [import("./schema.js").StringProperty, import("./schema.js").NullProperty];
|
|
36
|
+
description?: string;
|
|
37
|
+
};
|
|
38
|
+
}, "content_base64" | "name">;
|
|
21
39
|
export declare const CRM_FILE_PREPARE_CONTRACT: import("./schema.js").ContractObject<{
|
|
22
40
|
readonly name: import("./schema.js").StringProperty;
|
|
23
41
|
readonly byte_length: {
|
|
@@ -29,12 +47,30 @@ export declare const CRM_FILE_PREPARE_CONTRACT: import("./schema.js").ContractOb
|
|
|
29
47
|
};
|
|
30
48
|
readonly sha256: import("./schema.js").StringProperty;
|
|
31
49
|
}, "byte_length" | "name" | "sha256">;
|
|
50
|
+
export declare const CRM_FILE_PREPARE_INPUT_CONTRACT: import("./schema.js").ContractObject<{
|
|
51
|
+
readonly byte_length: {
|
|
52
|
+
type: "integer";
|
|
53
|
+
description?: string;
|
|
54
|
+
minimum?: number;
|
|
55
|
+
maximum?: number;
|
|
56
|
+
"x-clamp"?: true;
|
|
57
|
+
};
|
|
58
|
+
readonly name: import("./schema.js").StringProperty;
|
|
59
|
+
readonly sha256: import("./schema.js").StringProperty;
|
|
60
|
+
}, "byte_length" | "name" | "sha256">;
|
|
32
61
|
export declare const CRM_FILE_COMPLETE_CONTRACT: import("./schema.js").ContractObject<{
|
|
33
62
|
readonly label: {
|
|
34
63
|
oneOf: [import("./schema.js").StringProperty, import("./schema.js").NullProperty];
|
|
35
64
|
description?: string;
|
|
36
65
|
};
|
|
37
66
|
}, never>;
|
|
67
|
+
export declare const CRM_FILE_COMPLETE_INPUT_CONTRACT: import("./schema.js").ContractObject<{
|
|
68
|
+
readonly label: {
|
|
69
|
+
oneOf: [import("./schema.js").StringProperty, import("./schema.js").NullProperty];
|
|
70
|
+
description?: string;
|
|
71
|
+
};
|
|
72
|
+
}, never>;
|
|
73
|
+
export declare function crmFileCompleteInputIssues(args: Readonly<Record<string, unknown>>): readonly ContractIssue[];
|
|
38
74
|
export declare const CRM_PHOTOS_CONTRACT: import("./schema.js").ContractObject<{
|
|
39
75
|
readonly mode: {
|
|
40
76
|
type: "string";
|
|
@@ -130,3 +166,19 @@ export declare const CRM_TASKS_QUERY_CONTRACT: import("./schema.js").ContractObj
|
|
|
130
166
|
};
|
|
131
167
|
readonly cursor: import("./schema.js").StringProperty;
|
|
132
168
|
}, never>;
|
|
169
|
+
export declare const CRM_TASKS_QUEUE_INPUT_CONTRACT: import("./schema.js").ContractObject<{
|
|
170
|
+
readonly assignee: import("./schema.js").StringProperty;
|
|
171
|
+
readonly status: {
|
|
172
|
+
type: "string";
|
|
173
|
+
enum: readonly ("" | "all" | "cancelled" | "completed" | "open")[];
|
|
174
|
+
description?: string;
|
|
175
|
+
};
|
|
176
|
+
readonly limit: {
|
|
177
|
+
type: "integer";
|
|
178
|
+
description?: string;
|
|
179
|
+
minimum?: number;
|
|
180
|
+
maximum?: number;
|
|
181
|
+
"x-clamp"?: true;
|
|
182
|
+
};
|
|
183
|
+
readonly cursor: import("./schema.js").StringProperty;
|
|
184
|
+
}, never>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { bool, enumOf, int, nullable, obj, str } from "./schema.js";
|
|
1
|
+
import { bool, enumOf, int, nullable, obj, str, validateContract } from "./schema.js";
|
|
2
2
|
export const CRM_NOTE_BODY_MAX_CHARS = 20_000;
|
|
3
3
|
export const CRM_NOTE_TITLE_MAX_CHARS = 300;
|
|
4
4
|
export const CRM_FILE_LABEL_MAX_CHARS = 300;
|
|
@@ -8,17 +8,52 @@ export const CRM_NOTE_EDIT_CONTRACT = obj({
|
|
|
8
8
|
title: nullable(str({ maxLength: CRM_NOTE_TITLE_MAX_CHARS, description: "Replacement title; null or empty clears." })),
|
|
9
9
|
pinned: bool({ description: "Whether the note is pinned; false unpins." }),
|
|
10
10
|
});
|
|
11
|
+
// HTTP trims these fields before the native length check. Raw length bounds
|
|
12
|
+
// would reject accepted padding; empty body is ignored, even in a mixed edit.
|
|
13
|
+
export const CRM_NOTE_EDIT_INPUT_CONTRACT = obj({
|
|
14
|
+
body: str({ description: "Replacement Markdown; trimmed text maximum 20000 characters. Empty or whitespace text is ignored." }),
|
|
15
|
+
title: nullable(str({ description: "Replacement title; trimmed maximum 300 characters. Null or empty clears." })),
|
|
16
|
+
pinned: CRM_NOTE_EDIT_CONTRACT.properties.pinned,
|
|
17
|
+
});
|
|
18
|
+
export function crmNoteEditInputIssues(args) {
|
|
19
|
+
const body = typeof args.body === "string" ? args.body.trim() : "";
|
|
20
|
+
const title = typeof args.title === "string" ? args.title.trim() : "";
|
|
21
|
+
const checked = validateContract(CRM_NOTE_EDIT_CONTRACT, {
|
|
22
|
+
...(body ? { body } : {}),
|
|
23
|
+
...(args.title !== undefined ? { title: title || null } : {}),
|
|
24
|
+
...(args.pinned !== undefined ? { pinned: args.pinned } : {}),
|
|
25
|
+
}, { unknown: "reject", overMax: "reject" });
|
|
26
|
+
return checked.ok ? [] : checked.issues;
|
|
27
|
+
}
|
|
11
28
|
export const CRM_FILE_ATTACH_CONTRACT = obj({
|
|
12
29
|
name: str({ minLength: 1, description: "Original filename." }),
|
|
13
30
|
content_base64: str({ minLength: 1, description: "Inline bytes; entire JSON request must fit 2 MB. Larger files use upload prepare/complete." }),
|
|
14
31
|
label: nullable(str({ maxLength: CRM_FILE_LABEL_MAX_CHARS, description: "Optional record-local label." })),
|
|
15
32
|
}, { required: ["name", "content_base64"] });
|
|
33
|
+
export const CRM_FILE_ATTACH_INPUT_CONTRACT = obj({
|
|
34
|
+
...CRM_FILE_ATTACH_CONTRACT.properties,
|
|
35
|
+
label: nullable(str({ description: "Optional record-local label; trimmed maximum 300 characters." })),
|
|
36
|
+
}, { required: [...CRM_FILE_ATTACH_CONTRACT.required] });
|
|
16
37
|
export const CRM_FILE_PREPARE_CONTRACT = obj({
|
|
17
38
|
name: str({ minLength: 1, description: "Original filename." }),
|
|
18
39
|
byte_length: int({ minimum: 0, maximum: 100 * 1024 * 1024, description: "Exact byte length; maximum 100 MiB." }),
|
|
19
40
|
sha256: str({ minLength: 64, maxLength: 64, description: "Hex SHA-256 of the exact bytes to PUT." }),
|
|
20
41
|
}, { required: ["name", "byte_length", "sha256"] });
|
|
21
|
-
export const
|
|
42
|
+
export const CRM_FILE_PREPARE_INPUT_CONTRACT = obj({
|
|
43
|
+
...CRM_FILE_PREPARE_CONTRACT.properties,
|
|
44
|
+
name: str({ pattern: "\\S", description: "Original filename; must remain nonempty after trimming." }),
|
|
45
|
+
sha256: str({ pattern: "^\\s*[A-Fa-f0-9]{64}\\s*$", description: "Hex SHA-256 of the exact bytes to PUT; case and surrounding whitespace are normalized." }),
|
|
46
|
+
}, { required: [...CRM_FILE_PREPARE_CONTRACT.required] });
|
|
47
|
+
const CRM_FILE_COMPLETE_LABEL_DESCRIPTION = "Record-local attachment label. Omitted, null or empty preserves an existing label and leaves a new attachment unlabeled. Filename is unchanged.";
|
|
48
|
+
export const CRM_FILE_COMPLETE_CONTRACT = obj({ label: nullable(str({ maxLength: CRM_FILE_LABEL_MAX_CHARS, description: CRM_FILE_COMPLETE_LABEL_DESCRIPTION })) });
|
|
49
|
+
export const CRM_FILE_COMPLETE_INPUT_CONTRACT = obj({
|
|
50
|
+
label: nullable(str({ description: CRM_FILE_COMPLETE_LABEL_DESCRIPTION + " Trimmed maximum 300 characters." })),
|
|
51
|
+
});
|
|
52
|
+
export function crmFileCompleteInputIssues(args) {
|
|
53
|
+
const label = typeof args.label === "string" ? args.label.trim() : "";
|
|
54
|
+
const checked = validateContract(CRM_FILE_COMPLETE_CONTRACT, { label: label || null }, { unknown: "reject", overMax: "reject" });
|
|
55
|
+
return checked.ok ? [] : checked.issues;
|
|
56
|
+
}
|
|
22
57
|
export const CRM_PHOTOS_CONTRACT = obj({
|
|
23
58
|
mode: enumOf(["dry_run", "live"], { description: "Default dry_run. Inspect preview before live." }),
|
|
24
59
|
live: bool({ description: "Shortcut for mode=live; conflicts with mode=dry_run." }),
|
|
@@ -46,3 +81,9 @@ export const CRM_TASKS_QUERY_CONTRACT = obj({
|
|
|
46
81
|
limit: int({ minimum: 1, maximum: 200, description: "Maximum tasks; default 50." }),
|
|
47
82
|
cursor: str({ minLength: 1, maxLength: 500, description: "Previous nextCursor." }),
|
|
48
83
|
});
|
|
84
|
+
export const CRM_TASKS_QUEUE_INPUT_CONTRACT = obj({
|
|
85
|
+
...CRM_TASKS_QUERY_CONTRACT.properties,
|
|
86
|
+
status: enumOf([...CRM_TASKS_QUERY_CONTRACT.properties.status.enum, ""], { description: "open, completed or cancelled; all, empty or omitted reads every status." }),
|
|
87
|
+
limit: int({ minimum: 1, description: "Maximum tasks; the server clamps to 200. Default 50." }),
|
|
88
|
+
cursor: str({ description: "Previous nextCursor; empty is ignored." }),
|
|
89
|
+
});
|
|
@@ -5,7 +5,7 @@ import { WHATSAPP_DRAFTS_READ_CONTRACT } from "./whatsapp-reads.js";
|
|
|
5
5
|
import { TABLE_FAVORITE_CONTRACT, TABLE_FAVORITES_LIST_CONTRACT, TABLE_ITEM_RESOLVE_CONTRACT, TABLE_LINK_SUGGEST_CONTRACT, TABLE_RECOVER_PENDING_CONTRACT } from "./table-operations.js";
|
|
6
6
|
import { BILLING_OWNER_READ_CONTRACT } from "./billing-owner-read.js";
|
|
7
7
|
import { COPILOT_SESSIONS_LIST_CONTRACT } from "./copilot-sessions.js";
|
|
8
|
-
import {
|
|
8
|
+
import { CRM_CONNECTIONS_QUERY_CONTRACT, CRM_FILE_ATTACH_INPUT_CONTRACT, CRM_FILE_ATTACH_DESCRIPTION, CRM_FILE_COMPLETE_INPUT_CONTRACT, CRM_FILE_PREPARE_INPUT_CONTRACT, CRM_NOTE_EDIT_INPUT_CONTRACT, CRM_PHOTOS_CONTRACT, CRM_TASKS_QUEUE_INPUT_CONTRACT, crmFileCompleteInputIssues, crmNoteEditInputIssues } from "./crm-support.js";
|
|
9
9
|
import { spintaxContract } from "./spintax.js";
|
|
10
10
|
import { betaFeaturesUpdateContract, emailDomainSuppressionListContract, emailDomainSuppressionRemoveContract, emailSuppressionRemoveContract, providerLimitListContract, providerLimitSelectorContract, providerLimitUpdateContract } from "./workspace-utilities.js";
|
|
11
11
|
import { knowledgeSyncReadContract } from "./knowledge-sync.js";
|
|
@@ -38,7 +38,7 @@ export const CUSTOMER_OPERATIONS = [
|
|
|
38
38
|
operation("members.client_role", "/api/cli/collab/members/role", "POST", "approvals client grant", "oxygen_members_client_role_set", "collaboration", "Set or clear the restricted client overlay; admin only. May read pending Clerk invitations; sends no invitation. Free.", { email: text(), role: nullable(enumOf(["client"])) }, ["email", "role"], { ...mcpOnly, annotations: { openWorldHint: true } }),
|
|
39
39
|
operation("members.workspace_role", "/api/cli/collab/members/workspace-role", "POST", "orgs member-role", "oxygen_members_workspace_role_set", "collaboration", "Change a member's workspace role in Clerk; admin only, with self-role and last-administrator protection. Free.", { email: text(), role: enumOf(["admin", "member"]) }, ["email", "role"], { ...mcpOnly, annotations: { openWorldHint: true } }),
|
|
40
40
|
operation("copilot.sessions.list", "/api/cli/copilot/sessions", "GET", "copilot list", "oxygen_copilot_sessions_list", "agents", "List attended Copilot sessions in this workspace.", COPILOT_SESSIONS_LIST_CONTRACT.properties, [], mcpOnly),
|
|
41
|
-
operation("copilot.sessions.update", "/api/cli/copilot/sessions/{session_id}", "PATCH", "copilot policy set", "oxygen_copilot_session_update", "agents", "Set an attended Copilot session's approval
|
|
41
|
+
operation("copilot.sessions.update", "/api/cli/copilot/sessions/{session_id}", "PATCH", "copilot policy set", "oxygen_copilot_session_update", "agents", "Set an attended Copilot session's approval policy. Paid auto-approval is explicit standing authorization.", { auto_approve_policy: enumOf(["off", "paid"]) }, ["auto_approve_policy"], { spends: true }),
|
|
42
42
|
operation("copilot.attachments.list", "/api/cli/copilot/sessions/{session_id}/attachments", "GET", "copilot attachments list", "oxygen_copilot_attachments_list", "agents", "List sent and unsent attachments in one Copilot session.", {}, []),
|
|
43
43
|
operation("copilot.attachments.prepare", "/api/cli/copilot/sessions/{session_id}/attachments", "POST", "copilot attachments prepare", "oxygen_copilot_attachment_prepare", "agents", "Reserve a Copilot attachment and return its scoped upload URL; complete only after uploading the exact bytes.", { file_name: text(), content_type: text(), content_length: int({ minimum: 1 }) }, ["file_name", "content_length"]),
|
|
44
44
|
operation("copilot.attachments.complete", "/api/cli/copilot/sessions/{session_id}/attachments/{attachment_id}/complete", "POST", "copilot attachments complete", "oxygen_copilot_attachment_complete", "agents", "Verify and describe an uploaded Copilot attachment in its session.", {}, []),
|
|
@@ -46,13 +46,13 @@ export const CUSTOMER_OPERATIONS = [
|
|
|
46
46
|
operation("copilot.feedback", "/api/cli/copilot/sessions/{session_id}/turns/{turn_id}/feedback", "POST", "copilot feedback", "oxygen_copilot_feedback", "agents", "Rate one attended Copilot turn and optionally explain the rating.", { rating: enumOf(["up", "down"]), comment: text() }, ["rating"]),
|
|
47
47
|
operation("copilot.interrupt", "/api/cli/copilot/sessions/{session_id}/turns/{turn_id}/interrupt", "POST", "copilot interrupt", "oxygen_copilot_interrupt", "agents", "Request cancellation of one Copilot turn. Read the session again to confirm it stopped.", {}, [], mcpOnly),
|
|
48
48
|
operation("context.canonical.get", "/api/cli/context/canonical/get", "POST", "context canonical get", "oxygen_context_canonical_get", "knowledge", "Read the current canonical (pinned) voice, brand or positioning that AI copy uses, or any type's pinned asset. present=false means none is pinned; grounding_when_absent says what AI copy uses instead.", { type: text("Type to read: voice, brand or positioning (the canonical copy AI uses), or another context type such as playbook or persona.") }, ["type"], { mutates: false }),
|
|
49
|
-
operation("crm.notes.update", "/api/cli/crm/notes/{note_id}", "PATCH", "crm notes update", "oxygen_crm_note_update", "crm", "Edit a CRM note's body, title or pinned state; an empty title clears it.", {
|
|
49
|
+
operation("crm.notes.update", "/api/cli/crm/notes/{note_id}", "PATCH", "crm notes update", "oxygen_crm_note_update", "crm", "Edit a CRM note's body, title or pinned state; an empty title clears it.", {}, [], { ...mcpOnly, contract: CRM_NOTE_EDIT_INPUT_CONTRACT, inputCheck: crmNoteEditInputIssues }),
|
|
50
50
|
operation("crm.notes.delete", "/api/cli/crm/notes/{note_id}", "DELETE", "crm notes delete", "oxygen_crm_note_delete", "crm", "Delete one CRM note in this workspace.", {}, [], mcpOnly),
|
|
51
|
-
operation("crm.files.attach_inline", "/api/cli/crm/objects/{object}/records/{row_id}/files", "POST", "crm files attach-inline", "oxygen_crm_file_attach", "crm", CRM_FILE_ATTACH_DESCRIPTION,
|
|
52
|
-
operation("crm.files.prepare", "/api/cli/crm/objects/{object}/records/{row_id}/files/upload-url", "POST", "crm files prepare-upload", "oxygen_crm_file_prepare_upload", "crm", "Reserve a CRM file upload by exact name, length and SHA-256; returns a scoped upload URL.", {
|
|
53
|
-
operation("crm.files.complete", "/api/cli/crm/objects/{object}/records/{row_id}/files/{file_id}/uploaded", "POST", "crm files complete-upload", "oxygen_crm_file_complete_upload", "crm", "Verify a reserved CRM upload and attach it to its record; mismatched bytes remain pending.", {
|
|
51
|
+
operation("crm.files.attach_inline", "/api/cli/crm/objects/{object}/records/{row_id}/files", "POST", "crm files attach-inline", "oxygen_crm_file_attach", "crm", CRM_FILE_ATTACH_DESCRIPTION, {}, [], { contract: CRM_FILE_ATTACH_INPUT_CONTRACT, inputCheck: crmFileCompleteInputIssues }),
|
|
52
|
+
operation("crm.files.prepare", "/api/cli/crm/objects/{object}/records/{row_id}/files/upload-url", "POST", "crm files prepare-upload", "oxygen_crm_file_prepare_upload", "crm", "Reserve a CRM file upload by exact name, length and SHA-256; returns a scoped upload URL.", {}, [], { contract: CRM_FILE_PREPARE_INPUT_CONTRACT }),
|
|
53
|
+
operation("crm.files.complete", "/api/cli/crm/objects/{object}/records/{row_id}/files/{file_id}/uploaded", "POST", "crm files complete-upload", "oxygen_crm_file_complete_upload", "crm", "Verify a reserved CRM upload and attach it to its record; mismatched bytes remain pending.", {}, [], { contract: CRM_FILE_COMPLETE_INPUT_CONTRACT, inputCheck: crmFileCompleteInputIssues, bodyRequired: true }),
|
|
54
54
|
operation("crm.files.delete", "/api/cli/crm/files/{attachment_id}", "DELETE", "crm files detach", "oxygen_crm_file_delete", "crm", "Detach a CRM attachment by attachment_id, preserving the stored file.", {}, [], mcpOnly),
|
|
55
|
-
operation("crm.photos", "/api/cli/crm/photos", "POST", "crm photos", "oxygen_crm_photos_backfill", "crm", "Preview or fill people photos from data this workspace already holds. Free; mode defaults to dry_run.", {
|
|
55
|
+
operation("crm.photos", "/api/cli/crm/photos", "POST", "crm photos", "oxygen_crm_photos_backfill", "crm", "Preview or fill people photos from data this workspace already holds. Free; mode defaults to dry_run.", {}, [], { ...mcpOnly, contract: CRM_PHOTOS_CONTRACT, bodyRequired: true }),
|
|
56
56
|
operation("dashboards.tabs.create", "/api/cli/dashboards/{dashboard_id}/tabs", "POST", "dashboards tabs add", "oxygen_dashboard_tab_create", "signals", "Create a named tab in a workspace dashboard.", { title: text() }, ["title"], mcpOnly),
|
|
57
57
|
operation("dashboards.tabs.delete", "/api/cli/dashboards/{dashboard_id}/tabs", "DELETE", "dashboards tabs remove", "oxygen_dashboard_tab_delete", "signals", "Remove one dashboard tab by its id.", { tab: text() }, ["tab"], { ...mcpOnly, queryFields: ["tab"] }),
|
|
58
58
|
operation("integrations.custom.connect", "/api/cli/custom-integrations/connect", "POST", "custom-integrations connect", "oxygen_custom_integration_connect", "integrations", "Store an encrypted API key for an applied custom HTTP integration; the secret is never returned.", { slug: text(), api_key: text() }, ["slug", "api_key"], mcpOnly),
|
|
@@ -63,10 +63,11 @@ export const CUSTOMER_OPERATIONS = [
|
|
|
63
63
|
operation("db.cost_policy.reconcile", "/api/cli/db/reconcile-cost-policy", "POST", "db reconcile-cost-policy", "oxygen_database_cost_policy_reconcile", "workspace", "Retired Neon compatibility action: reports applied=false with no operations; does not suspend PostgreSQL. Native workspace write access applies; no preview or confirmation field. 0 credits.", { suspend_idle: bool() }, [], mcpOnly),
|
|
64
64
|
operation("directory.apply", "/api/cli/directory/apply", "POST", "directory apply", "oxygen_directory_apply", "crm", "Apply for an agency-directory listing for this workspace; reuses an existing open application.", { message: text(), website: text() }, [], mcpOnly),
|
|
65
65
|
operation("directory.logo", "/api/cli/directory/listing/logo", "POST", "directory logo upload", "oxygen_directory_logo_upload", "crm", "Upload a public agency-directory logo and read back the updated listing; PNG, JPEG, WebP or SVG, at most 2 MB.", { content_base64: text(), file_name: text(), content_type: enumOf(["image/png", "image/jpeg", "image/webp", "image/svg+xml"]) }, ["content_base64", "file_name", "content_type"], { multipart: { contentField: "content_base64", nameField: "file_name", typeField: "content_type", fileField: "file" } }),
|
|
66
|
-
operation("domains.delete", "/api/cli/domains/delete", "POST", "domains delete", "oxygen_domains_delete", "deliverability", "Preview domain
|
|
66
|
+
operation("domains.delete", "/api/cli/domains/delete", "POST", "domains delete", "oxygen_domains_delete", "deliverability", "Preview domain and inbox removal; execute with the exact plan hash and confirmation. Oxygen-bought domains stop renewing but stay registered until expiry; no refund.", { domains: list(), approved: bool(), plan_hash: text(), confirmation: text() }, ["domains"], { ...mcpOnly, annotations: { destructiveHint: true, openWorldHint: true } }),
|
|
67
67
|
operation("knowledge.pages.archive", "/api/cli/knowledge/pages/archive", "POST", "knowledge page archive", "oxygen_knowledge_page_archive", "knowledge", "Archive a knowledge page; content/history remain, links become unresolved. Pass expected_revision for the version you reviewed.", { slug: text(), id: text(), expected_revision: int({ minimum: 1 }) }, [], mcpOnly),
|
|
68
|
-
operation("knowledge.
|
|
69
|
-
operation("knowledge.sync.
|
|
68
|
+
operation("knowledge.pages.restore", "/api/cli/knowledge/pages/restore", "POST", "knowledge page restore", "oxygen_knowledge_page_restore", "knowledge", "Restore a knowledge page to an earlier revision as a new revision; history is kept. Pass expected_revision to refuse if the page changed since. Sensitive pages still need approval.", { slug: text(), id: text(), revision: int({ minimum: 1 }), expected_revision: int({ minimum: 1 }) }, ["revision"], mcpOnly),
|
|
69
|
+
operation("knowledge.sync.manifest", "/api/cli/knowledge/sync/manifest", "POST", "knowledge sync-manifest", "oxygen_knowledge_sync_manifest", "knowledge", "Read complete wiki revision/hash metadata. has_more/truncated mean more pages, not cut entries. last_cursor marks the last returned page; next_cursor resumes when more remain. Live keyset, not a snapshot.", {}, [], { contract: knowledgeSyncReadContract, mutates: false }),
|
|
70
|
+
operation("knowledge.sync.delta", "/api/cli/knowledge/sync/delta", "POST", "knowledge sync-delta", "oxygen_knowledge_sync_delta", "knowledge", "Sync complete wiki pages/tombstones; first call may seed missing starter pages. Follow next_cursor; an oversized page is refused without skipping. 0 credits.", {}, [], { contract: knowledgeSyncReadContract }),
|
|
70
71
|
operation("limits.provider.get", "/api/cli/limits/provider", "GET", "limits provider list", "oxygen_provider_limits_list", "billing", "Read provider request limits and BYOK warning defaults. MCP defaults to bounded summary pages; follow paging.next_offset with the same filter. HTTP/CLI omit pagination for the full legacy list. 0 credits.", {}, [], { contract: providerLimitListContract, generated: { cli: false, mcp: false } }),
|
|
71
72
|
operation("limits.provider.set", "/api/cli/limits/provider", "POST", "limits provider set", "oxygen_provider_limits_set", "billing", "Set an enforced provider request limit; admin or owner only. Approve the exact provider, operation and window: raising a cap may permit more provider use. 0 credits.", {}, [], { ...mcpOnly, contract: providerLimitUpdateContract }),
|
|
72
73
|
operation("limits.provider.delete", "/api/cli/limits/provider", "DELETE", "limits provider delete", "oxygen_provider_limits_delete", "billing", "Clear one provider request-limit override; admin or owner only. Approve the exact selector. Other operation overrides remain; the provider returns to its defaults, whose BYOK threshold may be observe-only. 0 credits.", {}, [], { ...mcpOnly, contract: providerLimitSelectorContract, queryFields: ["provider", "operation"] }),
|
|
@@ -102,15 +103,17 @@ export const CUSTOMER_OPERATIONS = [
|
|
|
102
103
|
operation("worker.repair", "/api/cli/worker/repair", "POST", "worker repair", "oxygen_workspace_queue_repair", "workspace", "Repair this workspace's stalled execution queues through the native bounded recovery path.", {}, [], mcpOnly),
|
|
103
104
|
operation("db.status", "/api/cli/db/status", "GET", "db status", "oxygen_workspace_database_status", "workspace", "Read this workspace's database status and latest completed provisioning/migration receipt; not a list of current pending migrations. Historical Neon fields are lineage. Hosting is plan-included; 0 credits.", {}, [], mcpOnly),
|
|
104
105
|
operation("db.provision", "/api/cli/db/provision", "POST", "db provision", "oxygen_workspace_database_provision", "workspace", "Provision or retry this workspace database immediately; already-ready workspaces retain it. No preview or confirmation field; native workspace write access applies. May outlast the connector deadline: read oxygen_workspace_database_status before retrying. Hosting is plan-included; 0 credits.", {}, [], mcpOnly),
|
|
105
|
-
operation("sessions.list", "/api/cli/sessions", "GET", "sessions list", "oxygen_sessions_list", "workspace", "List your personal CLI sessions across workspaces; OAuth or personal user session required, organization API keys are refused."),
|
|
106
|
-
operation("sessions.revoke", "/api/cli/sessions/{session_id}", "DELETE", "sessions revoke", "oxygen_sessions_revoke", "workspace", "Revoke one
|
|
106
|
+
operation("sessions.list", "/api/cli/sessions", "GET", "sessions list", "oxygen_sessions_list", "workspace", "List your personal CLI sessions across workspaces, including your organizations; OAuth or personal user session required, organization API keys are refused."),
|
|
107
|
+
operation("sessions.revoke", "/api/cli/sessions/{session_id}", "DELETE", "sessions revoke", "oxygen_sessions_revoke", "workspace", "Revoke one personal CLI session; if this client uses it, calls stop until you reconnect with a new session. OAuth or personal user session required; organization API keys are refused."),
|
|
107
108
|
operation("billing.allowance", "/api/cli/billing/allowance", "GET", "billing allowance", "oxygen_billing_allowance", "billing", "Inspect this workspace's recurring credit allowance and period; due plan grants or credit expiry may apply. 0 credits; reserves nothing.", {}, [], { ...mcpOnly, mutates: true }),
|
|
108
109
|
operation("billing.invoices", "/api/cli/billing/invoices", "GET", "billing invoices", "oxygen_billing_invoices", "billing", "Read this workspace's billing invoices and their hosted payment links.", {}, [], mcpOnly),
|
|
109
110
|
operation("billing.seats.set", "/api/cli/billing/seats", "POST", "billing seats set", "oxygen_billing_seats_set", "billing", "Set purchased legacy sending-seat quantity. Retired seats cannot increase; reducing existing seats lowers the next renewal charge.", { seat_key: enumOf(["linkedin", "whatsapp", "phone_number", "email_sender"]), quantity: int({ minimum: 0 }) }, ["seat_key", "quantity"], mcpOnly),
|
|
110
111
|
operation("collaboration.gates.list", "/api/cli/collab/gates", "GET", "approvals gate list", "oxygen_approval_gates_list", "collaboration", "Read this workspace's approval gates, optionally for one exact subject.", { subject: text() }, [], mcpOnly),
|
|
111
112
|
operation("collaboration.members.list", "/api/cli/collab/members", "GET", "approvals client list", "oxygen_workspace_members_list", "collaboration", "Read workspace member roles, with Clerk profiles and pending invitations. Free.", {}, [], { ...mcpOnly, annotations: { openWorldHint: true } }),
|
|
112
|
-
|
|
113
|
-
|
|
113
|
+
// Preserve this alias's existing over-limit admission: the API clamps each
|
|
114
|
+
// link limit to 100. Projection/window fields share the native read contract.
|
|
115
|
+
operation("crm.connections", "/api/cli/crm/objects/{object}/records/{row_id}/connections", "GET", "crm connections", "oxygen_crm_connections", "crm", "Read a CRM record's connected conversations, sequence enrollments and related activity.", { ...CRM_CONNECTIONS_QUERY_CONTRACT.properties, conversation_limit: int({ minimum: 1 }), sequence_limit: int({ minimum: 1 }) }, [], mcpOnly),
|
|
116
|
+
operation("crm.tasks.list", "/api/cli/crm/tasks", "GET", "crm tasks list", "oxygen_crm_tasks_queue", "crm", "Read the workspace task queue by status, assignee and cursor.", {}, [], { ...mcpOnly, contract: CRM_TASKS_QUEUE_INPUT_CONTRACT, queryOmitValues: { status: ["all"] } }),
|
|
114
117
|
operation("crm.files.download", "/api/cli/crm/files/{attachment_id}/download", "GET", "crm files download", "oxygen_crm_file_download", "crm", "Download a tenant-owned record attachment by attachment_id. The native authenticated response contains its exact bytes.", {}, [], { binary: { maxBytes: 50 * 1024 * 1024 } }),
|
|
115
118
|
operation("db.cost_policy.get", "/api/cli/db/cost-policy", "GET", "db cost-policy", "oxygen_database_cost_policy", "workspace", "Read this workspace's retired Neon cost-policy status. PostgreSQL has no per-workspace sleep control; stored Neon policy is historical. 0 credits.", {}, [], mcpOnly),
|
|
116
119
|
operation("egress.dedicated.get", "/api/cli/egress/dedicated", "GET", "egress dedicated status", "oxygen_dedicated_egress_status", "deliverability", "Read dedicated outbound egress status and its current monthly commitment without activating it.", {}, [], mcpOnly),
|
|
@@ -3,7 +3,7 @@ import { bool, enumOf, int, obj, str } from "./schema.js";
|
|
|
3
3
|
// Optional native windows: unqualified HTTP/CLI reads retain their legacy shape.
|
|
4
4
|
const window = {
|
|
5
5
|
cursor: str({ minLength: 1, maxLength: 4096 }),
|
|
6
|
-
max_chars: int({ minimum: 2000, maximum: 48000, description: "
|
|
6
|
+
max_chars: int({ minimum: 2000, maximum: 48000, description: "Caps: MCP 10k; Agent/Copilot 4k; HTTP/CLI 48k." }),
|
|
7
7
|
};
|
|
8
8
|
export const knowledgeIndexReadContract = obj({
|
|
9
9
|
limit: int({ minimum: 1, maximum: 1000 }),
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** Optional representation only; omitted controls keep the legacy list. */
|
|
2
|
+
export declare const knowledgeProposalWindowContract: import("./schema.js").ContractObject<{
|
|
3
|
+
readonly projection: {
|
|
4
|
+
type: "string";
|
|
5
|
+
enum: readonly ("full" | "summary" | "value")[];
|
|
6
|
+
description?: string;
|
|
7
|
+
};
|
|
8
|
+
readonly path: import("./schema.js").StringProperty;
|
|
9
|
+
readonly value_cursor: import("./schema.js").StringProperty;
|
|
10
|
+
readonly max_chars: {
|
|
11
|
+
type: "integer";
|
|
12
|
+
description?: string;
|
|
13
|
+
minimum?: number;
|
|
14
|
+
maximum?: number;
|
|
15
|
+
"x-clamp"?: true;
|
|
16
|
+
};
|
|
17
|
+
readonly cursor: import("./schema.js").StringProperty;
|
|
18
|
+
readonly proposal: import("./schema.js").StringProperty;
|
|
19
|
+
}, never>;
|
|
20
|
+
export declare const knowledgeProposalReadContract: import("./schema.js").ContractObject<{
|
|
21
|
+
readonly projection: {
|
|
22
|
+
type: "string";
|
|
23
|
+
enum: readonly ("full" | "summary" | "value")[];
|
|
24
|
+
description?: string;
|
|
25
|
+
};
|
|
26
|
+
readonly path: import("./schema.js").StringProperty;
|
|
27
|
+
readonly value_cursor: import("./schema.js").StringProperty;
|
|
28
|
+
readonly max_chars: {
|
|
29
|
+
type: "integer";
|
|
30
|
+
description?: string;
|
|
31
|
+
minimum?: number;
|
|
32
|
+
maximum?: number;
|
|
33
|
+
"x-clamp"?: true;
|
|
34
|
+
};
|
|
35
|
+
readonly cursor: import("./schema.js").StringProperty;
|
|
36
|
+
readonly proposal: import("./schema.js").StringProperty;
|
|
37
|
+
readonly status: {
|
|
38
|
+
type: "string";
|
|
39
|
+
enum: readonly ("all" | "decided" | "open")[];
|
|
40
|
+
description?: string;
|
|
41
|
+
};
|
|
42
|
+
readonly limit: {
|
|
43
|
+
type: "integer";
|
|
44
|
+
description?: string;
|
|
45
|
+
minimum?: number;
|
|
46
|
+
maximum?: number;
|
|
47
|
+
"x-clamp"?: true;
|
|
48
|
+
};
|
|
49
|
+
}, never>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { KNOWLEDGE_SLUG_MAX_LENGTH } from "../knowledge-constants.js";
|
|
2
|
+
import { enumOf, int, obj, str } from "./schema.js";
|
|
3
|
+
import { STORED_READ_WINDOW_FIELDS } from "./stored-read-window.js";
|
|
4
|
+
/** Optional representation only; omitted controls keep the legacy list. */
|
|
5
|
+
export const knowledgeProposalWindowContract = obj({
|
|
6
|
+
...STORED_READ_WINDOW_FIELDS,
|
|
7
|
+
cursor: str({ minLength: 1, maxLength: 2000, description: "Queue next_cursor; same status/projection/selection/member. Live physical keyset, not a snapshot." }),
|
|
8
|
+
proposal: str({ minLength: 1, maxLength: KNOWLEDGE_SLUG_MAX_LENGTH, description: "Exact proposal UUID or slug, required for value. Reads its raw captured patch, not the normalized display page." }),
|
|
9
|
+
});
|
|
10
|
+
export const knowledgeProposalReadContract = obj({
|
|
11
|
+
status: enumOf(["open", "decided", "all"]),
|
|
12
|
+
limit: int({ minimum: 1, maximum: 200 }),
|
|
13
|
+
...knowledgeProposalWindowContract.properties,
|
|
14
|
+
});
|
|
@@ -4,5 +4,5 @@ import { int, obj, str } from "./schema.js";
|
|
|
4
4
|
export const knowledgeSyncReadContract = obj({
|
|
5
5
|
cursor: str({ minLength: 1, maxLength: 256 }),
|
|
6
6
|
limit: int({ minimum: 1, maximum: 200 }),
|
|
7
|
-
max_chars: int({ minimum: 1000, maximum: 48000, description: "
|
|
7
|
+
max_chars: int({ minimum: 1000, maximum: 48000, description: "Response-envelope character cap; complete pages only. A single oversized page is refused; none is skipped. Surface cap applies." }),
|
|
8
8
|
});
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { PLAN_BAND_LIMITS_TIER, PLAN_BAND_ORDER } from "../plan-band.js";
|
|
2
|
+
import { planLimitsStoragePendingLine } from "../plan-limits-view.js";
|
|
1
3
|
import { enumOf, int, obj } from "./schema.js";
|
|
2
4
|
export const LIMITS_READ_SECTIONS = ["summary", "capacity", "plan", "pricing", "api", "webhooks", "spend", "sending", "workflow", "all"];
|
|
3
5
|
export const LIMITS_READ_QUERY_CONTRACT = obj({
|
|
@@ -28,13 +30,65 @@ function capacityProjection(value) {
|
|
|
28
30
|
table_warning: reconciled ? usage.table_warning ?? null : null,
|
|
29
31
|
table_limit_reached: reconciled ? usage.table_limit_reached ?? null : null,
|
|
30
32
|
} : null,
|
|
31
|
-
note: "Rows are registry counts, available only after every Table is reconciled. Database bytes combine the last measured bytes and estimated subsequent growth; the estimate flag and timestamps name that state. Object storage is separate.",
|
|
33
|
+
note: [capacity.note ?? planLimitsStoragePendingLine(capacity), "Rows are registry counts, available only after every Table is reconciled. Database bytes combine the last measured bytes and estimated subsequent growth; the estimate flag and timestamps name that state. Object storage is separate."].filter(value => typeof value === "string").join(" "),
|
|
32
34
|
};
|
|
33
35
|
}
|
|
36
|
+
/** Keys are the schedule's source contract. Unknown future keys stay unknown. */
|
|
37
|
+
function scheduleScope(key) {
|
|
38
|
+
const [area, scope] = key.split(".");
|
|
39
|
+
if (!area || !scope)
|
|
40
|
+
return null;
|
|
41
|
+
if (["storage", "spend", "workflows"].includes(area) && PLAN_BAND_ORDER.includes(scope))
|
|
42
|
+
return { plan_band: scope };
|
|
43
|
+
if (area === "agents" && Object.values(PLAN_BAND_LIMITS_TIER).some(tier => tier === scope))
|
|
44
|
+
return { limits_tier: scope };
|
|
45
|
+
if (area === "plans" && scope?.startsWith("oxygen_") && PLAN_BAND_ORDER.includes(scope.slice(7)))
|
|
46
|
+
return { plan_band: scope.slice(7) };
|
|
47
|
+
if (["topup", "sending", "seat", "overage", "byok", "enrichment"].includes(area)
|
|
48
|
+
|| (area === "workflows" && ["automation_step_credits", "steps_count_toward_max_credits"].includes(scope)))
|
|
49
|
+
return { all_plans: true };
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
function scheduleProjection(data, section, selectedBand) {
|
|
53
|
+
if (!data.pricing_schedule)
|
|
54
|
+
return null;
|
|
55
|
+
const schedule = record(data.pricing_schedule);
|
|
56
|
+
const band = selectedBand ?? String(data.plan_band ?? "");
|
|
57
|
+
const tier = selectedBand ? PLAN_BAND_LIMITS_TIER[selectedBand]
|
|
58
|
+
: data.limits_tier ?? PLAN_BAND_LIMITS_TIER[band];
|
|
59
|
+
const changes = (Array.isArray(schedule.changes) ? schedule.changes : []).map(record).filter(change => {
|
|
60
|
+
if (section === "pricing")
|
|
61
|
+
return true;
|
|
62
|
+
const key = String(change.key ?? ""), scope = scheduleScope(key);
|
|
63
|
+
if (scope?.plan_band && scope.plan_band !== band)
|
|
64
|
+
return false;
|
|
65
|
+
if (scope?.limits_tier && scope.limits_tier !== tier)
|
|
66
|
+
return false;
|
|
67
|
+
if (section === "capacity" || section === "summary")
|
|
68
|
+
return key.startsWith("storage.");
|
|
69
|
+
if (section === "spend")
|
|
70
|
+
return /^(spend|agents)\./.test(key);
|
|
71
|
+
if (section === "workflow")
|
|
72
|
+
return key.startsWith("workflows.");
|
|
73
|
+
return true;
|
|
74
|
+
}).map(change => ({
|
|
75
|
+
...pick(change, ["key", "unit", "value_before", "value_after", "value_in_force"]),
|
|
76
|
+
// Pricing compares all bands; the key and typed scope remain concise.
|
|
77
|
+
...(section !== "pricing" ? pick(change, ["description"]) : {}),
|
|
78
|
+
scope: scheduleScope(String(change.key ?? "")),
|
|
79
|
+
}));
|
|
80
|
+
return { ...pick(schedule, ["name", "effective_at", "status"]), changes,
|
|
81
|
+
note: "The date applies only to the listed changes. Scope names a plan band, a limits tier, or all plans; null means unknown. It does not activate awaiting_capacity_test targets." };
|
|
82
|
+
}
|
|
34
83
|
function pricingBand(value) {
|
|
35
84
|
const row = record(value);
|
|
85
|
+
const storage = record(row.storage);
|
|
86
|
+
const pending = planLimitsStoragePendingLine(storage);
|
|
36
87
|
return { ...pick(row, ["band", "label", "monthly_price_usd", "monthly_credits", "volume_bonus_percent", "usd_per_100_credits", "current"]),
|
|
37
|
-
storage: pick(
|
|
88
|
+
storage: { ...pick(storage, ["table_row_limit", "workspace_row_limit", "workspace_database_limit_bytes", "status", "effective_at", "target"]),
|
|
89
|
+
...(pending ? { note: storage.status === "awaiting_capacity_test"
|
|
90
|
+
? "Planned capacity is not in force; a capacity test is required and no activation date is set."
|
|
91
|
+
: pending } : {}) } };
|
|
38
92
|
}
|
|
39
93
|
/** Legacy unqualified HTTP/CLI stays full. Native callers always select a section. */
|
|
40
94
|
export function projectLimitsRead(data, query) {
|
|
@@ -64,14 +118,13 @@ export function projectLimitsRead(data, query) {
|
|
|
64
118
|
}
|
|
65
119
|
else if (section === "pricing") {
|
|
66
120
|
selected.plan_bands = bands.map(pricingBand);
|
|
67
|
-
|
|
68
|
-
selected.pricing_schedule = {
|
|
69
|
-
...pick(schedule, ["effective_at", "status"]),
|
|
70
|
-
changes: Array.isArray(schedule.changes) ? schedule.changes.map(value => pick(record(value), ["key", "value_before", "value_after", "value_in_force"])) : [],
|
|
71
|
-
};
|
|
121
|
+
selected.pricing_schedule = scheduleProjection(data, section);
|
|
72
122
|
}
|
|
73
123
|
else
|
|
74
124
|
selected[SECTION_FIELDS[section]] = data[SECTION_FIELDS[section]];
|
|
125
|
+
if (!sameSelection && ["summary", "capacity", "plan", "spend", "workflow"].includes(section)) {
|
|
126
|
+
selected.pricing_schedule = scheduleProjection(data, section, query.band);
|
|
127
|
+
}
|
|
75
128
|
if (!sameSelection && section === "all" && query.band)
|
|
76
129
|
selected.plan_bands = bands.filter(row => record(row).band === query.band);
|
|
77
130
|
// Copy before pruning: the full HTTP response and caller's source object are
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import { type ContractObject } from "./schema.js";
|
|
1
|
+
import { type ContractObject, type ContractIssue } from "./schema.js";
|
|
2
2
|
export type OperationSpec<C extends ContractObject = ContractObject> = {
|
|
3
3
|
/** Stable id, `<resource>.<verb>`. */
|
|
4
4
|
id: string;
|
|
5
5
|
/** Route template; `{name}` segments are path parameters. */
|
|
6
6
|
route: string;
|
|
7
7
|
method: "GET" | "POST" | "PATCH" | "DELETE";
|
|
8
|
+
/** Send an empty JSON object when the native route requires a JSON body. */
|
|
9
|
+
bodyRequired?: true;
|
|
10
|
+
/** Additional native checks on a normalized copy; raw wire values stay intact. */
|
|
11
|
+
inputCheck?: (args: Readonly<Record<string, unknown>>) => readonly ContractIssue[];
|
|
8
12
|
/** When set, the contract describes `body[bodyKey]` rather than the whole body. */
|
|
9
13
|
bodyKey?: string;
|
|
10
14
|
contract: C;
|
|
@@ -12,6 +16,8 @@ export type OperationSpec<C extends ContractObject = ContractObject> = {
|
|
|
12
16
|
parameters?: readonly string[];
|
|
13
17
|
/** Fields sent in the query rather than the JSON body (all fields for GET). */
|
|
14
18
|
queryFields?: readonly string[];
|
|
19
|
+
/** Client sentinels omitted only from query fields of this operation. */
|
|
20
|
+
queryOmitValues?: Readonly<Record<string, readonly string[]>>;
|
|
15
21
|
/** Array fields encoded as repeated query keys rather than a JSON string. */
|
|
16
22
|
repeatedQueryFields?: readonly string[];
|
|
17
23
|
/** Fixed discriminator fields owned by this operation, never supplied by a caller. */
|
|
@@ -73,6 +79,8 @@ export type OperationSpec<C extends ContractObject = ContractObject> = {
|
|
|
73
79
|
export declare function operationPath(spec: Pick<OperationSpec, "route">, params: Readonly<Record<string, string>>): string;
|
|
74
80
|
/** The exact public grammar, including the operation's scoped route parameters. */
|
|
75
81
|
export declare function operationInputContract(spec: OperationSpec): ContractObject;
|
|
82
|
+
/** Check the closed raw grammar before any operation-specific native checks. */
|
|
83
|
+
export declare function operationInputIssues(spec: OperationSpec, args: Record<string, unknown>): readonly ContractIssue[];
|
|
76
84
|
/** Preserve absent, false, null and empty values while assigning each field to its transport. */
|
|
77
85
|
export declare function operationRequest(spec: OperationSpec, args: Record<string, unknown>): {
|
|
78
86
|
path: string;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* cannot disagree on which fields exist. Leaf and browser-safe.
|
|
6
6
|
*/
|
|
7
7
|
import { CONNECTOR_EVENTS_REVOKE_OPERATION, CONNECTOR_UPDATE_OPERATION } from "./connectors.js";
|
|
8
|
-
import { str } from "./schema.js";
|
|
8
|
+
import { str, validateContract } from "./schema.js";
|
|
9
9
|
import { SENDER_LIMITS_SET_OPERATION } from "./sender-limits.js";
|
|
10
10
|
import { WORKSPACE_PAGES_GET_OPERATION, WORKSPACE_PAGES_UPDATE_OPERATION } from "./workspace-pages.js";
|
|
11
11
|
import { BROWSER_OPERATIONS } from "./browser-operations.js";
|
|
@@ -13,6 +13,7 @@ import { TABLE_FEED_UPDATE_OPERATION } from "./table-feed-update.js";
|
|
|
13
13
|
import { GEO_OPERATIONS } from "./geo.js";
|
|
14
14
|
import { CUSTOMER_OPERATIONS } from "./customer-operations.js";
|
|
15
15
|
import { AGENT_SESSION_OPERATIONS } from "./agent-sessions.js";
|
|
16
|
+
import { TEAMMATE_OPERATIONS } from "./teammates.js";
|
|
16
17
|
import { WORKSPACE_SKILL_OPERATIONS } from "./workspace-skills.js";
|
|
17
18
|
/** The route with its `{param}` segments filled in, each URL-encoded. */
|
|
18
19
|
export function operationPath(spec, params) {
|
|
@@ -39,6 +40,11 @@ export function operationInputContract(spec) {
|
|
|
39
40
|
required: [...parameters, ...(spec.contract.required ?? [])],
|
|
40
41
|
};
|
|
41
42
|
}
|
|
43
|
+
/** Check the closed raw grammar before any operation-specific native checks. */
|
|
44
|
+
export function operationInputIssues(spec, args) {
|
|
45
|
+
const checked = validateContract(operationInputContract(spec), args, { unknown: "reject", overMax: "reject" });
|
|
46
|
+
return checked.ok ? (spec.inputCheck?.(args) ?? []) : checked.issues;
|
|
47
|
+
}
|
|
42
48
|
/** Preserve absent, false, null and empty values while assigning each field to its transport. */
|
|
43
49
|
export function operationRequest(spec, args) {
|
|
44
50
|
const params = Object.fromEntries((spec.parameters ?? []).map((name) => [name, String(args[name] ?? "")]));
|
|
@@ -50,6 +56,8 @@ export function operationRequest(spec, args) {
|
|
|
50
56
|
if (value === undefined)
|
|
51
57
|
continue;
|
|
52
58
|
if (spec.method === "GET" || spec.queryFields?.includes(name)) {
|
|
59
|
+
if (typeof value === "string" && spec.queryOmitValues?.[name]?.includes(value))
|
|
60
|
+
continue;
|
|
53
61
|
if (spec.repeatedQueryFields?.includes(name) && Array.isArray(value)) {
|
|
54
62
|
for (const entry of value)
|
|
55
63
|
query.append(name, String(entry));
|
|
@@ -62,7 +70,7 @@ export function operationRequest(spec, args) {
|
|
|
62
70
|
}
|
|
63
71
|
if (query.size)
|
|
64
72
|
path += `?${query}`;
|
|
65
|
-
return { path, method: spec.method, ...(spec.method !== "GET" && Object.keys(body).length > 0 ? { body: spec.bodyKey ? { [spec.bodyKey]: body } : body } : {}) };
|
|
73
|
+
return { path, method: spec.method, ...(spec.method !== "GET" && (Object.keys(body).length > 0 || spec.bodyRequired) ? { body: spec.bodyKey ? { [spec.bodyKey]: body } : body } : {}) };
|
|
66
74
|
}
|
|
67
75
|
/** Decode the explicit file property and keep the native multipart API contract. */
|
|
68
76
|
export function operationFormData(spec, body) {
|
|
@@ -83,6 +91,6 @@ export function operationFormData(spec, body) {
|
|
|
83
91
|
}
|
|
84
92
|
return form;
|
|
85
93
|
}
|
|
86
|
-
export const OPERATION_SPECS = [SENDER_LIMITS_SET_OPERATION, CONNECTOR_UPDATE_OPERATION, CONNECTOR_EVENTS_REVOKE_OPERATION, WORKSPACE_PAGES_GET_OPERATION, WORKSPACE_PAGES_UPDATE_OPERATION, TABLE_FEED_UPDATE_OPERATION, ...CUSTOMER_OPERATIONS, ...GEO_OPERATIONS, ...BROWSER_OPERATIONS, ...AGENT_SESSION_OPERATIONS, ...WORKSPACE_SKILL_OPERATIONS];
|
|
87
|
-
export const CLI_OPERATIONS = [...CUSTOMER_OPERATIONS, ...GEO_OPERATIONS, ...BROWSER_OPERATIONS, ...AGENT_SESSION_OPERATIONS, ...WORKSPACE_SKILL_OPERATIONS].filter((spec) => spec.generated?.cli !== false);
|
|
88
|
-
export const MCP_OPERATIONS = [...CUSTOMER_OPERATIONS, ...GEO_OPERATIONS, ...BROWSER_OPERATIONS, ...AGENT_SESSION_OPERATIONS, ...WORKSPACE_SKILL_OPERATIONS].filter((spec) => spec.generated?.mcp !== false);
|
|
94
|
+
export const OPERATION_SPECS = [SENDER_LIMITS_SET_OPERATION, CONNECTOR_UPDATE_OPERATION, CONNECTOR_EVENTS_REVOKE_OPERATION, WORKSPACE_PAGES_GET_OPERATION, WORKSPACE_PAGES_UPDATE_OPERATION, TABLE_FEED_UPDATE_OPERATION, ...CUSTOMER_OPERATIONS, ...GEO_OPERATIONS, ...BROWSER_OPERATIONS, ...AGENT_SESSION_OPERATIONS, ...TEAMMATE_OPERATIONS, ...WORKSPACE_SKILL_OPERATIONS];
|
|
95
|
+
export const CLI_OPERATIONS = [...CUSTOMER_OPERATIONS, ...GEO_OPERATIONS, ...BROWSER_OPERATIONS, ...AGENT_SESSION_OPERATIONS, ...TEAMMATE_OPERATIONS, ...WORKSPACE_SKILL_OPERATIONS].filter((spec) => spec.generated?.cli !== false);
|
|
96
|
+
export const MCP_OPERATIONS = [...CUSTOMER_OPERATIONS, ...GEO_OPERATIONS, ...BROWSER_OPERATIONS, ...AGENT_SESSION_OPERATIONS, ...TEAMMATE_OPERATIONS, ...WORKSPACE_SKILL_OPERATIONS].filter((spec) => spec.generated?.mcp !== false);
|
|
@@ -29,7 +29,7 @@ export function isPublishingStoredRead(name, args) {
|
|
|
29
29
|
}
|
|
30
30
|
export const publishingReadProjectionContract = obj({
|
|
31
31
|
projection: { ...str({ description: "full default; summary lists exact child metadata/indices; value streams lossless canonical JSON. Follow next_cursor with the same scope." }), enum: ["full", "summary", "value"] },
|
|
32
|
-
value_path: str({ description: "
|
|
32
|
+
value_path: str({ description: "Exact RFC6901 pointer into this endpoint's native result; empty=root. Use projection=summary to discover existing child paths before selecting a value. Paths depend on the endpoint and analytics scope. No field is silently trimmed.", maxLength: 4096 }),
|
|
33
33
|
cursor: str({ description: "Signed projection continuation; repeat the same filters, projection and value_path. Changed data/scope/source refuses stale.", maxLength: 4096 }),
|
|
34
34
|
});
|
|
35
35
|
export const publishingReadWindowContract = obj({
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { OperationSpec } from "./operations.js";
|
|
2
|
+
export declare const TEAMMATE_PROFILE_FIELDS: {
|
|
3
|
+
name: import("./schema.js").StringProperty;
|
|
4
|
+
description: import("./schema.js").StringProperty;
|
|
5
|
+
avatar_key: {
|
|
6
|
+
type: "string";
|
|
7
|
+
enum: readonly ("atom" | "bubbles" | "clover" | "comet" | "crown" | "mark" | "o2" | "orbit" | "pill" | "trio" | "tripod" | "twin")[];
|
|
8
|
+
description?: string;
|
|
9
|
+
};
|
|
10
|
+
avatar_color: {
|
|
11
|
+
type: "string";
|
|
12
|
+
enum: readonly ("amber" | "aqua" | "blue" | "brown" | "forest" | "green" | "magenta" | "orange" | "purple" | "red" | "slate" | "violet")[];
|
|
13
|
+
description?: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export declare const TEAMMATE_OPERATIONS: readonly OperationSpec[];
|