@oxygen-agent/cli 1.1014.985 → 1.1014.1087
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-families/program.d.ts +2 -0
- package/dist/command-families/program.js +241 -0
- package/dist/command-families/tables/automation.d.ts +22 -0
- package/dist/command-families/tables/automation.js +250 -0
- package/dist/command-families/tables/bundle-export.d.ts +7 -0
- package/dist/command-families/tables/bundle-export.js +198 -0
- package/dist/command-families/tables/bundle-format.d.ts +66 -0
- package/dist/command-families/tables/bundle-format.js +274 -0
- package/dist/command-families/tables/bundle-import.d.ts +20 -0
- package/dist/command-families/tables/bundle-import.js +260 -0
- package/dist/command-families/tables/display.d.ts +107 -0
- package/dist/command-families/tables/display.js +229 -0
- package/dist/command-families/tables/import-batches.d.ts +26 -0
- package/dist/command-families/tables/import-batches.js +94 -0
- package/dist/command-families/tables/import-columns.d.ts +24 -0
- package/dist/command-families/tables/import-columns.js +131 -0
- package/dist/command-families/tables/import-upload.d.ts +30 -0
- package/dist/command-families/tables/import-upload.js +203 -0
- package/dist/command-families/tables/import-values.d.ts +10 -0
- package/dist/command-families/tables/import-values.js +60 -0
- package/dist/command-families/tables/imports.d.ts +19 -0
- package/dist/command-families/tables/imports.js +200 -0
- package/dist/command-families/tables/options.d.ts +314 -0
- package/dist/command-families/tables/options.js +1 -0
- package/dist/command-families/tables/register-automation.d.ts +2 -0
- package/dist/command-families/tables/register-automation.js +127 -0
- package/dist/command-families/tables/register-external-imports.d.ts +2 -0
- package/dist/command-families/tables/register-external-imports.js +293 -0
- package/dist/command-families/tables/register-files.d.ts +2 -0
- package/dist/command-families/tables/register-files.js +72 -0
- package/dist/command-families/tables/register-followers.d.ts +2 -0
- package/dist/command-families/tables/register-followers.js +73 -0
- package/dist/command-families/tables/register-lifecycle.d.ts +2 -0
- package/dist/command-families/tables/register-lifecycle.js +114 -0
- package/dist/command-families/tables/register-reads.d.ts +2 -0
- package/dist/command-families/tables/register-reads.js +187 -0
- package/dist/command-families/tables/register-relations.d.ts +2 -0
- package/dist/command-families/tables/register-relations.js +244 -0
- package/dist/command-families/tables/register-row-actions.d.ts +2 -0
- package/dist/command-families/tables/register-row-actions.js +53 -0
- package/dist/command-families/tables/register-row-writes.d.ts +2 -0
- package/dist/command-families/tables/register-row-writes.js +140 -0
- package/dist/command-families/tables/register-views.d.ts +2 -0
- package/dist/command-families/tables/register-views.js +83 -0
- package/dist/command-families/tables/register-watchers.d.ts +2 -0
- package/dist/command-families/tables/register-watchers.js +65 -0
- package/dist/command-families/tables/register-webhooks.d.ts +2 -0
- package/dist/command-families/tables/register-webhooks.js +126 -0
- package/dist/command-families/tables/registration-context.d.ts +8 -0
- package/dist/command-families/tables/registration-context.js +1 -0
- package/dist/command-families/tables/registration.d.ts +3 -0
- package/dist/command-families/tables/registration.js +30 -0
- package/dist/command-families/tables/row-selection.d.ts +5 -0
- package/dist/command-families/tables/row-selection.js +82 -0
- package/dist/command-families/tables/send.d.ts +6 -0
- package/dist/command-families/tables/send.js +111 -0
- package/dist/command-manifest.js +1 -0
- package/dist/commands/copilot.js +8 -0
- package/dist/commands/deliverability.js +4 -2
- package/dist/commands/sequences.js +30 -2
- package/dist/commands/tables.d.ts +1 -3
- package/dist/commands/tables.js +1 -3505
- package/dist/credentials.js +1 -1
- package/dist/customer-operation-commands.js +62 -3
- package/dist/help.js +1 -1
- package/dist/index.d.ts +1 -99
- package/dist/index.js +5 -337
- package/dist/knowledge-mirror.js +1 -1
- package/dist/skills.js +4 -2
- package/dist/update.js +2 -1
- package/dist/workspace-placement-commands.d.ts +3 -0
- package/dist/workspace-placement-commands.js +32 -0
- package/node_modules/@oxygen/shared/dist/agent-sessions.d.ts +4 -0
- package/node_modules/@oxygen/shared/dist/agent-sessions.js +11 -3
- package/node_modules/@oxygen/shared/dist/agents-enabled.d.ts +29 -0
- package/node_modules/@oxygen/shared/dist/agents-enabled.js +51 -0
- package/node_modules/@oxygen/shared/dist/capability-discovery.js +39 -2
- package/node_modules/@oxygen/shared/dist/contracts/agent-sessions.js +1 -1
- package/node_modules/@oxygen/shared/dist/contracts/customer-operations.js +1 -1
- package/node_modules/@oxygen/shared/dist/contracts/guided-activation.js +5 -5
- package/node_modules/@oxygen/shared/dist/contracts/guided-company-files.d.ts +30 -0
- package/node_modules/@oxygen/shared/dist/contracts/guided-company-files.js +53 -0
- package/node_modules/@oxygen/shared/dist/contracts/guided-first-sourcing.d.ts +120 -0
- package/node_modules/@oxygen/shared/dist/contracts/guided-first-sourcing.js +48 -0
- package/node_modules/@oxygen/shared/dist/contracts/guided-onboarding-journey.d.ts +267 -0
- package/node_modules/@oxygen/shared/dist/contracts/guided-onboarding-journey.js +63 -0
- package/node_modules/@oxygen/shared/dist/contracts/operations.d.ts +6 -0
- package/node_modules/@oxygen/shared/dist/contracts/operations.js +9 -4
- package/node_modules/@oxygen/shared/dist/contracts/table-query-raw.d.ts +2 -0
- package/node_modules/@oxygen/shared/dist/contracts/table-query-raw.js +3 -0
- package/node_modules/@oxygen/shared/dist/contracts/teammates.js +17 -15
- package/node_modules/@oxygen/shared/dist/email-tracking-token.d.ts +2 -0
- package/node_modules/@oxygen/shared/dist/email-tracking-token.js +1 -0
- package/node_modules/@oxygen/shared/dist/feature-gates.d.ts +4 -0
- package/node_modules/@oxygen/shared/dist/feature-gates.js +5 -0
- package/node_modules/@oxygen/shared/dist/file-import.d.ts +46 -0
- package/node_modules/@oxygen/shared/dist/file-import.js +138 -0
- package/node_modules/@oxygen/shared/dist/guided-activation.d.ts +8 -0
- package/node_modules/@oxygen/shared/dist/guided-company-files.d.ts +13 -0
- package/node_modules/@oxygen/shared/dist/guided-company-files.js +14 -0
- package/node_modules/@oxygen/shared/dist/guided-first-sourcing.d.ts +116 -0
- package/node_modules/@oxygen/shared/dist/guided-first-sourcing.js +11 -0
- package/node_modules/@oxygen/shared/dist/guided-onboarding-answers.d.ts +4 -0
- package/node_modules/@oxygen/shared/dist/guided-onboarding-answers.js +42 -0
- package/node_modules/@oxygen/shared/dist/guided-onboarding-company-context.d.ts +22 -0
- package/node_modules/@oxygen/shared/dist/guided-onboarding-company-context.js +38 -0
- package/node_modules/@oxygen/shared/dist/guided-onboarding-journey.d.ts +147 -0
- package/node_modules/@oxygen/shared/dist/guided-onboarding-journey.fixture.d.ts +12 -0
- package/node_modules/@oxygen/shared/dist/guided-onboarding-journey.fixture.js +83 -0
- package/node_modules/@oxygen/shared/dist/guided-onboarding-journey.js +44 -0
- package/node_modules/@oxygen/shared/dist/guided-onboarding-prospects.d.ts +7 -0
- package/node_modules/@oxygen/shared/dist/guided-onboarding-prospects.js +13 -0
- package/node_modules/@oxygen/shared/dist/guided-onboarding-signals.d.ts +4 -0
- package/node_modules/@oxygen/shared/dist/guided-onboarding-signals.js +34 -0
- package/node_modules/@oxygen/shared/dist/guided-trial-billing.d.ts +26 -0
- package/node_modules/@oxygen/shared/dist/guided-trial-billing.js +19 -0
- package/node_modules/@oxygen/shared/dist/index.d.ts +0 -1
- package/node_modules/@oxygen/shared/dist/index.js +0 -6
- package/node_modules/@oxygen/shared/dist/table-limits.d.ts +1 -0
- package/node_modules/@oxygen/shared/dist/table-limits.js +6 -0
- package/node_modules/@oxygen/shared/dist/teammates.d.ts +13 -8
- package/node_modules/@oxygen/shared/dist/teammates.js +20 -11
- package/node_modules/@oxygen/shared/dist/user-capability-routing.js +78 -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/workspace-placement-view.d.ts +149 -0
- package/node_modules/@oxygen/shared/dist/workspace-placement-view.js +101 -0
- package/node_modules/@oxygen/shared/dist/workspace-placement.d.ts +77 -0
- package/node_modules/@oxygen/shared/dist/workspace-placement.js +94 -0
- package/package.json +1 -1
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/** Hiring roles remain strings. Technology identity includes its relationship. */
|
|
2
|
+
export declare const GUIDED_ONBOARDING_SIGNALS_CONTRACT: import("./schema.js").ContractObject<{
|
|
3
|
+
readonly hiring: import("./schema.js").ContractObject<{
|
|
4
|
+
readonly mode: {
|
|
5
|
+
type: "string";
|
|
6
|
+
enum: readonly ("none" | "selected")[];
|
|
7
|
+
description?: string;
|
|
8
|
+
};
|
|
9
|
+
readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
10
|
+
}, "mode" | "values">;
|
|
11
|
+
readonly technology: import("./schema.js").ContractObject<{
|
|
12
|
+
readonly mode: {
|
|
13
|
+
type: "string";
|
|
14
|
+
enum: readonly ("none" | "selected")[];
|
|
15
|
+
description?: string;
|
|
16
|
+
};
|
|
17
|
+
readonly values: import("./schema.js").ArrayProperty<import("./schema.js").ContractObject<{
|
|
18
|
+
readonly name: import("./schema.js").StringProperty;
|
|
19
|
+
readonly relationship: {
|
|
20
|
+
type: "string";
|
|
21
|
+
enum: readonly ("integrates_with" | "replaces" | "uses")[];
|
|
22
|
+
description?: string;
|
|
23
|
+
};
|
|
24
|
+
}, "name" | "relationship">>;
|
|
25
|
+
}, "mode" | "values">;
|
|
26
|
+
}, "hiring" | "technology">;
|
|
27
|
+
export declare const GUIDED_ONBOARDING_ANSWERS_CONTRACT: import("./schema.js").ContractObject<{
|
|
28
|
+
readonly company_context: import("./schema.js").ContractObject<{
|
|
29
|
+
readonly website: {
|
|
30
|
+
oneOf: [import("./schema.js").StringProperty, import("./schema.js").NullProperty];
|
|
31
|
+
description?: string;
|
|
32
|
+
};
|
|
33
|
+
readonly name: import("./schema.js").StringProperty;
|
|
34
|
+
readonly description: import("./schema.js").StringProperty;
|
|
35
|
+
readonly context_links: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
36
|
+
readonly file_ids: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
37
|
+
}, "context_links" | "description" | "file_ids" | "name" | "website">;
|
|
38
|
+
readonly company_review: import("./schema.js").ContractObject<{
|
|
39
|
+
readonly statement: import("./schema.js").StringProperty;
|
|
40
|
+
readonly profile_revision: import("./schema.js").StringProperty;
|
|
41
|
+
}, "profile_revision" | "statement">;
|
|
42
|
+
readonly audience_company_size: import("./schema.js").ContractObject<{
|
|
43
|
+
readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
44
|
+
}, "values">;
|
|
45
|
+
readonly audience_markets: import("./schema.js").ContractObject<{
|
|
46
|
+
readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
47
|
+
}, "values">;
|
|
48
|
+
readonly audience_industries: import("./schema.js").ContractObject<{
|
|
49
|
+
readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
50
|
+
}, "values">;
|
|
51
|
+
readonly audience_personas: import("./schema.js").ContractObject<{
|
|
52
|
+
readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
53
|
+
}, "values">;
|
|
54
|
+
readonly signals: import("./schema.js").ContractObject<{
|
|
55
|
+
readonly hiring: import("./schema.js").ContractObject<{
|
|
56
|
+
readonly mode: {
|
|
57
|
+
type: "string";
|
|
58
|
+
enum: readonly ("none" | "selected")[];
|
|
59
|
+
description?: string;
|
|
60
|
+
};
|
|
61
|
+
readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
62
|
+
}, "mode" | "values">;
|
|
63
|
+
readonly technology: import("./schema.js").ContractObject<{
|
|
64
|
+
readonly mode: {
|
|
65
|
+
type: "string";
|
|
66
|
+
enum: readonly ("none" | "selected")[];
|
|
67
|
+
description?: string;
|
|
68
|
+
};
|
|
69
|
+
readonly values: import("./schema.js").ArrayProperty<import("./schema.js").ContractObject<{
|
|
70
|
+
readonly name: import("./schema.js").StringProperty;
|
|
71
|
+
readonly relationship: {
|
|
72
|
+
type: "string";
|
|
73
|
+
enum: readonly ("integrates_with" | "replaces" | "uses")[];
|
|
74
|
+
description?: string;
|
|
75
|
+
};
|
|
76
|
+
}, "name" | "relationship">>;
|
|
77
|
+
}, "mode" | "values">;
|
|
78
|
+
}, "hiring" | "technology">;
|
|
79
|
+
readonly prospects: import("./schema.js").ContractObject<{
|
|
80
|
+
readonly decision: {
|
|
81
|
+
type: "string";
|
|
82
|
+
enum: readonly ("continue" | "refine")[];
|
|
83
|
+
description?: string;
|
|
84
|
+
};
|
|
85
|
+
readonly feedback: import("./schema.js").StringProperty;
|
|
86
|
+
}, "decision" | "feedback">;
|
|
87
|
+
readonly linkedin: import("./schema.js").ContractObject<{
|
|
88
|
+
readonly choice: {
|
|
89
|
+
type: "string";
|
|
90
|
+
enum: readonly ("connect" | "skip")[];
|
|
91
|
+
description?: string;
|
|
92
|
+
};
|
|
93
|
+
}, "choice">;
|
|
94
|
+
readonly sequence: import("./schema.js").ContractObject<{
|
|
95
|
+
readonly decision: {
|
|
96
|
+
type: "string";
|
|
97
|
+
enum: readonly ("keep_draft" | "review")[];
|
|
98
|
+
description?: string;
|
|
99
|
+
};
|
|
100
|
+
}, "decision">;
|
|
101
|
+
readonly tour: import("./schema.js").ContractObject<{
|
|
102
|
+
readonly visited: import("./schema.js").ArrayProperty<{
|
|
103
|
+
type: "string";
|
|
104
|
+
enum: readonly ("leads" | "overview" | "sequence" | "sourcing")[];
|
|
105
|
+
description?: string;
|
|
106
|
+
}>;
|
|
107
|
+
}, "visited">;
|
|
108
|
+
}, never>;
|
|
109
|
+
export declare const GUIDED_ONBOARDING_MUTATION_CONTRACT: import("./schema.js").ContractObject<{
|
|
110
|
+
revision: {
|
|
111
|
+
type: "integer";
|
|
112
|
+
description?: string;
|
|
113
|
+
minimum?: number;
|
|
114
|
+
maximum?: number;
|
|
115
|
+
"x-clamp"?: true;
|
|
116
|
+
};
|
|
117
|
+
mutation_id: import("./schema.js").StringProperty;
|
|
118
|
+
}, "mutation_id" | "revision">;
|
|
119
|
+
export declare const GUIDED_ONBOARDING_ADVANCE_CONTRACT: import("./schema.js").ContractObject<{
|
|
120
|
+
readonly revision: {
|
|
121
|
+
type: "integer";
|
|
122
|
+
description?: string;
|
|
123
|
+
minimum?: number;
|
|
124
|
+
maximum?: number;
|
|
125
|
+
"x-clamp"?: true;
|
|
126
|
+
};
|
|
127
|
+
readonly mutation_id: import("./schema.js").StringProperty;
|
|
128
|
+
readonly step: {
|
|
129
|
+
type: "string";
|
|
130
|
+
enum: readonly ("audience_company_size" | "audience_industries" | "audience_markets" | "audience_personas" | "campaign" | "company_context" | "company_research" | "company_review" | "complete" | "daily_rhythm" | "linkedin" | "prospects" | "routines" | "sequence" | "signals" | "tour" | "trial" | "welcome")[];
|
|
131
|
+
description?: string;
|
|
132
|
+
};
|
|
133
|
+
}, "mutation_id" | "revision" | "step">;
|
|
134
|
+
export declare const GUIDED_ONBOARDING_SAVE_CONTRACT: import("./schema.js").ContractObject<{
|
|
135
|
+
readonly revision: {
|
|
136
|
+
type: "integer";
|
|
137
|
+
description?: string;
|
|
138
|
+
minimum?: number;
|
|
139
|
+
maximum?: number;
|
|
140
|
+
"x-clamp"?: true;
|
|
141
|
+
};
|
|
142
|
+
readonly mutation_id: import("./schema.js").StringProperty;
|
|
143
|
+
readonly step: {
|
|
144
|
+
type: "string";
|
|
145
|
+
enum: readonly ("audience_company_size" | "audience_industries" | "audience_markets" | "audience_personas" | "campaign" | "company_context" | "company_research" | "company_review" | "complete" | "daily_rhythm" | "linkedin" | "prospects" | "routines" | "sequence" | "signals" | "tour" | "trial" | "welcome")[];
|
|
146
|
+
description?: string;
|
|
147
|
+
};
|
|
148
|
+
readonly answers: import("./schema.js").ContractObject<{
|
|
149
|
+
readonly company_context: import("./schema.js").ContractObject<{
|
|
150
|
+
readonly website: {
|
|
151
|
+
oneOf: [import("./schema.js").StringProperty, import("./schema.js").NullProperty];
|
|
152
|
+
description?: string;
|
|
153
|
+
};
|
|
154
|
+
readonly name: import("./schema.js").StringProperty;
|
|
155
|
+
readonly description: import("./schema.js").StringProperty;
|
|
156
|
+
readonly context_links: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
157
|
+
readonly file_ids: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
158
|
+
}, "context_links" | "description" | "file_ids" | "name" | "website">;
|
|
159
|
+
readonly company_review: import("./schema.js").ContractObject<{
|
|
160
|
+
readonly statement: import("./schema.js").StringProperty;
|
|
161
|
+
readonly profile_revision: import("./schema.js").StringProperty;
|
|
162
|
+
}, "profile_revision" | "statement">;
|
|
163
|
+
readonly audience_company_size: import("./schema.js").ContractObject<{
|
|
164
|
+
readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
165
|
+
}, "values">;
|
|
166
|
+
readonly audience_markets: import("./schema.js").ContractObject<{
|
|
167
|
+
readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
168
|
+
}, "values">;
|
|
169
|
+
readonly audience_industries: import("./schema.js").ContractObject<{
|
|
170
|
+
readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
171
|
+
}, "values">;
|
|
172
|
+
readonly audience_personas: import("./schema.js").ContractObject<{
|
|
173
|
+
readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
174
|
+
}, "values">;
|
|
175
|
+
readonly signals: import("./schema.js").ContractObject<{
|
|
176
|
+
readonly hiring: import("./schema.js").ContractObject<{
|
|
177
|
+
readonly mode: {
|
|
178
|
+
type: "string";
|
|
179
|
+
enum: readonly ("none" | "selected")[];
|
|
180
|
+
description?: string;
|
|
181
|
+
};
|
|
182
|
+
readonly values: import("./schema.js").ArrayProperty<import("./schema.js").StringProperty>;
|
|
183
|
+
}, "mode" | "values">;
|
|
184
|
+
readonly technology: import("./schema.js").ContractObject<{
|
|
185
|
+
readonly mode: {
|
|
186
|
+
type: "string";
|
|
187
|
+
enum: readonly ("none" | "selected")[];
|
|
188
|
+
description?: string;
|
|
189
|
+
};
|
|
190
|
+
readonly values: import("./schema.js").ArrayProperty<import("./schema.js").ContractObject<{
|
|
191
|
+
readonly name: import("./schema.js").StringProperty;
|
|
192
|
+
readonly relationship: {
|
|
193
|
+
type: "string";
|
|
194
|
+
enum: readonly ("integrates_with" | "replaces" | "uses")[];
|
|
195
|
+
description?: string;
|
|
196
|
+
};
|
|
197
|
+
}, "name" | "relationship">>;
|
|
198
|
+
}, "mode" | "values">;
|
|
199
|
+
}, "hiring" | "technology">;
|
|
200
|
+
readonly prospects: import("./schema.js").ContractObject<{
|
|
201
|
+
readonly decision: {
|
|
202
|
+
type: "string";
|
|
203
|
+
enum: readonly ("continue" | "refine")[];
|
|
204
|
+
description?: string;
|
|
205
|
+
};
|
|
206
|
+
readonly feedback: import("./schema.js").StringProperty;
|
|
207
|
+
}, "decision" | "feedback">;
|
|
208
|
+
readonly linkedin: import("./schema.js").ContractObject<{
|
|
209
|
+
readonly choice: {
|
|
210
|
+
type: "string";
|
|
211
|
+
enum: readonly ("connect" | "skip")[];
|
|
212
|
+
description?: string;
|
|
213
|
+
};
|
|
214
|
+
}, "choice">;
|
|
215
|
+
readonly sequence: import("./schema.js").ContractObject<{
|
|
216
|
+
readonly decision: {
|
|
217
|
+
type: "string";
|
|
218
|
+
enum: readonly ("keep_draft" | "review")[];
|
|
219
|
+
description?: string;
|
|
220
|
+
};
|
|
221
|
+
}, "decision">;
|
|
222
|
+
readonly tour: import("./schema.js").ContractObject<{
|
|
223
|
+
readonly visited: import("./schema.js").ArrayProperty<{
|
|
224
|
+
type: "string";
|
|
225
|
+
enum: readonly ("leads" | "overview" | "sequence" | "sourcing")[];
|
|
226
|
+
description?: string;
|
|
227
|
+
}>;
|
|
228
|
+
}, "visited">;
|
|
229
|
+
}, never>;
|
|
230
|
+
readonly advance: import("./schema.js").BooleanProperty;
|
|
231
|
+
}, "answers" | "mutation_id" | "revision" | "step">;
|
|
232
|
+
export declare const GUIDED_ONBOARDING_NAVIGATION_CONTRACT: import("./schema.js").ContractObject<{
|
|
233
|
+
readonly revision: {
|
|
234
|
+
type: "integer";
|
|
235
|
+
description?: string;
|
|
236
|
+
minimum?: number;
|
|
237
|
+
maximum?: number;
|
|
238
|
+
"x-clamp"?: true;
|
|
239
|
+
};
|
|
240
|
+
readonly mutation_id: import("./schema.js").StringProperty;
|
|
241
|
+
readonly step: {
|
|
242
|
+
type: "string";
|
|
243
|
+
enum: readonly ("audience_company_size" | "audience_industries" | "audience_markets" | "audience_personas" | "campaign" | "company_context" | "company_research" | "company_review" | "complete" | "daily_rhythm" | "linkedin" | "prospects" | "routines" | "sequence" | "signals" | "tour" | "trial" | "welcome")[];
|
|
244
|
+
description?: string;
|
|
245
|
+
};
|
|
246
|
+
readonly paused: import("./schema.js").BooleanProperty;
|
|
247
|
+
readonly tour_active_stop: {
|
|
248
|
+
type: "string";
|
|
249
|
+
enum: readonly ("leads" | "overview" | "sequence" | "sourcing")[];
|
|
250
|
+
description?: string;
|
|
251
|
+
};
|
|
252
|
+
}, "mutation_id" | "paused" | "revision" | "step">;
|
|
253
|
+
export declare const GUIDED_ONBOARDING_CHECKOUT_CONTRACT: import("./schema.js").ContractObject<{
|
|
254
|
+
readonly revision: {
|
|
255
|
+
type: "integer";
|
|
256
|
+
description?: string;
|
|
257
|
+
minimum?: number;
|
|
258
|
+
maximum?: number;
|
|
259
|
+
"x-clamp"?: true;
|
|
260
|
+
};
|
|
261
|
+
readonly mutation_id: import("./schema.js").StringProperty;
|
|
262
|
+
readonly approved: import("./schema.js").BooleanProperty;
|
|
263
|
+
}, "approved" | "mutation_id" | "revision">;
|
|
264
|
+
export declare const GUIDED_ONBOARDING_JOURNEY_ACTIONS: readonly ["get", "save", "advance", "back", "restart", "billing", "checkout", "navigation", "prospects_preview"];
|
|
265
|
+
export type GuidedOnboardingJourneyAction = typeof GUIDED_ONBOARDING_JOURNEY_ACTIONS[number];
|
|
266
|
+
import type { OperationSpec } from "./operations.js";
|
|
267
|
+
export declare const GUIDED_ONBOARDING_JOURNEY_OPERATIONS: readonly OperationSpec[];
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { arr, bool, enumOf, int, obj, str } from "./schema.js";
|
|
2
|
+
import { GUIDED_ONBOARDING_COMPANY_CONTEXT_CONTRACT } from "../guided-onboarding-company-context.js";
|
|
3
|
+
import { GUIDED_ONBOARDING_STEPS, GUIDED_ONBOARDING_TECHNOLOGY_RELATIONSHIPS } from "../guided-onboarding-journey.js";
|
|
4
|
+
const mode = () => enumOf(["none", "selected"]);
|
|
5
|
+
const name = () => str({ minLength: 1, maxLength: 160 });
|
|
6
|
+
/** Hiring roles remain strings. Technology identity includes its relationship. */
|
|
7
|
+
export const GUIDED_ONBOARDING_SIGNALS_CONTRACT = obj({
|
|
8
|
+
hiring: obj({ mode: mode(), values: arr(name(), { maxItems: 40 }) }, { required: ["mode", "values"] }),
|
|
9
|
+
technology: obj({
|
|
10
|
+
mode: mode(),
|
|
11
|
+
values: arr(obj({ name: name(), relationship: enumOf(GUIDED_ONBOARDING_TECHNOLOGY_RELATIONSHIPS) }, { required: ["name", "relationship"] }), { maxItems: 40 }),
|
|
12
|
+
}, { required: ["mode", "values"] }),
|
|
13
|
+
}, { required: ["hiring", "technology"] });
|
|
14
|
+
const choice = () => obj({ values: arr(name(), { minItems: 1, maxItems: 40 }) }, { required: ["values"] });
|
|
15
|
+
export const GUIDED_ONBOARDING_ANSWERS_CONTRACT = obj({
|
|
16
|
+
company_context: GUIDED_ONBOARDING_COMPANY_CONTEXT_CONTRACT,
|
|
17
|
+
company_review: obj({ statement: str({ minLength: 1, maxLength: 12000 }), profile_revision: str({ minLength: 1, maxLength: 160 }) }, { required: ["statement", "profile_revision"] }),
|
|
18
|
+
audience_company_size: choice(), audience_markets: choice(), audience_industries: choice(), audience_personas: choice(),
|
|
19
|
+
signals: GUIDED_ONBOARDING_SIGNALS_CONTRACT,
|
|
20
|
+
prospects: obj({ decision: enumOf(["continue", "refine"]), feedback: str({ maxLength: 4000 }) }, { required: ["decision", "feedback"] }),
|
|
21
|
+
linkedin: obj({ choice: enumOf(["connect", "skip"]) }, { required: ["choice"] }),
|
|
22
|
+
sequence: obj({ decision: enumOf(["review", "keep_draft"]) }, { required: ["decision"] }),
|
|
23
|
+
tour: obj({ visited: arr(enumOf(["overview", "leads", "sourcing", "sequence"]), { maxItems: 4 }) }, { required: ["visited"] }),
|
|
24
|
+
});
|
|
25
|
+
const mutation = { revision: int({ minimum: 1 }), mutation_id: str({ minLength: 1, maxLength: 160, pattern: "^[a-zA-Z0-9_.:-]+$" }) };
|
|
26
|
+
export const GUIDED_ONBOARDING_MUTATION_CONTRACT = obj(mutation, { required: ["revision", "mutation_id"] });
|
|
27
|
+
export const GUIDED_ONBOARDING_ADVANCE_CONTRACT = obj({ ...mutation, step: enumOf(GUIDED_ONBOARDING_STEPS) }, { required: ["revision", "mutation_id", "step"] });
|
|
28
|
+
export const GUIDED_ONBOARDING_SAVE_CONTRACT = obj({ ...mutation, step: enumOf(GUIDED_ONBOARDING_STEPS),
|
|
29
|
+
answers: GUIDED_ONBOARDING_ANSWERS_CONTRACT, advance: bool({ description: "Save and advance in one native transaction after checking this step. No provider action or implicit activation." }) }, { required: ["revision", "mutation_id", "step", "answers"] });
|
|
30
|
+
export const GUIDED_ONBOARDING_NAVIGATION_CONTRACT = obj({ ...mutation, step: enumOf(GUIDED_ONBOARDING_STEPS), paused: bool(),
|
|
31
|
+
tour_active_stop: enumOf(["overview", "leads", "sourcing", "sequence"]) }, { required: ["revision", "mutation_id", "step", "paused"] });
|
|
32
|
+
export const GUIDED_ONBOARDING_CHECKOUT_CONTRACT = obj({ ...mutation, approved: bool() }, { required: ["revision", "mutation_id", "approved"] });
|
|
33
|
+
export const GUIDED_ONBOARDING_JOURNEY_ACTIONS = ["get", "save", "advance", "back", "restart", "billing", "checkout", "navigation", "prospects_preview"];
|
|
34
|
+
const base = "/api/cli/onboarding/activation/{activationId}/journey";
|
|
35
|
+
export const GUIDED_ONBOARDING_JOURNEY_OPERATIONS = [
|
|
36
|
+
{ id: "onboarding.journey.get", route: base, method: "GET", contract: obj({}), parameters: ["activationId"],
|
|
37
|
+
cli: { path: ["onboarding", "journey", "get"], summary: "Read your private resumable onboarding answers and native progress." },
|
|
38
|
+
mcp: { name: "oxygen_onboarding_journey_get", title: "Oxygen: Read onboarding journey", description: "Read your activationId journey and saved answers. Creator-private; enabled genuine DEV only. No research, model call or message send.", pack: "agents" }, mutates: false, spends: false },
|
|
39
|
+
{ id: "onboarding.journey.save", route: base, method: "POST", parameters: ["activationId"], contract: GUIDED_ONBOARDING_SAVE_CONTRACT,
|
|
40
|
+
cli: { path: ["onboarding", "journey", "save"], summary: "Save reviewed answers and optionally advance atomically. Free; no model, send or routine execution." },
|
|
41
|
+
mcp: { name: "oxygen_onboarding_journey_save", title: "Oxygen: Onboarding save", description: "Creator-private DEV onboarding save for activationId. Requires current revision and stable mutation_id. Save accepts only current step answers; company context prepares native sources and records existing bounded research consent. Advance checks native readiness and billing. No paid turn, synchronous research, outreach or routine activation.", pack: "agents", annotations: { destructiveHint: false, openWorldHint: false, idempotentHint: true } }, mutates: true, spends: false },
|
|
42
|
+
{ id: "onboarding.journey.advance", route: `${base}/advance`, method: "POST", parameters: ["activationId"], contract: GUIDED_ONBOARDING_ADVANCE_CONTRACT,
|
|
43
|
+
cli: { path: ["onboarding", "journey", "advance"], summary: "Advance after native readiness checks. Free; no model, send or routine execution." },
|
|
44
|
+
mcp: { name: "oxygen_onboarding_journey_advance", title: "Oxygen: Onboarding advance", description: "Creator-private DEV onboarding advance for activationId. Requires current revision and stable mutation_id. Save accepts only current step answers; advance checks native readiness and billing. Restart preserves resources and consumed funding. No paid turn, research, outreach or routine activation.", pack: "agents", annotations: { destructiveHint: false, openWorldHint: false, idempotentHint: true } }, mutates: true, spends: false },
|
|
45
|
+
{ id: "onboarding.journey.back", route: `${base}/back`, method: "POST", parameters: ["activationId"], contract: GUIDED_ONBOARDING_MUTATION_CONTRACT,
|
|
46
|
+
cli: { path: ["onboarding", "journey", "back"], summary: "Return to the previous step with saved answers. Free; no model, send or routine execution." },
|
|
47
|
+
mcp: { name: "oxygen_onboarding_journey_back", title: "Oxygen: Onboarding back", description: "Creator-private DEV onboarding back for activationId. Requires current revision and stable mutation_id. Save accepts only current step answers; advance checks native readiness and billing. Restart preserves resources and consumed funding. No paid turn, research, outreach or routine activation.", pack: "agents", annotations: { destructiveHint: false, openWorldHint: false, idempotentHint: true } }, mutates: true, spends: false },
|
|
48
|
+
{ id: "onboarding.journey.restart", route: `${base}/restart`, method: "POST", parameters: ["activationId"], contract: GUIDED_ONBOARDING_MUTATION_CONTRACT,
|
|
49
|
+
cli: { path: ["onboarding", "journey", "restart"], summary: "Restart progress, preserving Knowledge, chats, campaigns and billing. Free; no model, send or routine execution." },
|
|
50
|
+
mcp: { name: "oxygen_onboarding_journey_restart", title: "Oxygen: Onboarding restart", description: "Creator-private DEV onboarding restart for activationId. Requires current revision and stable mutation_id. Save accepts only current step answers; advance checks native readiness and billing. Restart preserves resources and consumed funding. No paid turn, research, outreach or routine activation.", pack: "agents", annotations: { destructiveHint: false, openWorldHint: false, idempotentHint: true } }, mutates: true, spends: false },
|
|
51
|
+
{ id: "onboarding.journey.prospects_preview", route: `${base}/prospects/preview`, method: "POST", parameters: ["activationId"], contract: GUIDED_ONBOARDING_MUTATION_CONTRACT,
|
|
52
|
+
cli: { path: ["onboarding", "journey", "prospects-preview"], summary: "Preview up to five real people for saved targeting through the native free source; persist inspectable native results." },
|
|
53
|
+
mcp: { name: "oxygen_onboarding_journey_prospects_preview", title: "Oxygen: Preview onboarding prospects", description: "At the prospects step, use current revision and stable mutation_id to preview up to five people from saved targeting. Native free source read and manual preview Table writes; cached retries, no paid fallback, inference, enrollment or outreach. Unsupported criteria remain explicit diagnostics, never verified fit.", pack: "agents", annotations: { openWorldHint: true, destructiveHint: false, idempotentHint: true } }, mutates: true, spends: false },
|
|
54
|
+
{ id: "onboarding.journey.navigation", route: `${base}/navigation`, method: "POST", parameters: ["activationId"], contract: GUIDED_ONBOARDING_NAVIGATION_CONTRACT,
|
|
55
|
+
cli: { path: ["onboarding", "journey", "navigation"], summary: "Save pause/resume and exact tour position, retaining the current journey step and visited history." },
|
|
56
|
+
mcp: { name: "oxygen_onboarding_journey_navigation", title: "Oxygen: Save onboarding position", description: "Persist paused and optional tour_active_stop at current step/revision with stable mutation_id. Position is separate from visited history. No step advance, research, send or routine activation.", pack: "agents" }, mutates: true, spends: false },
|
|
57
|
+
{ id: "onboarding.journey.billing", route: `${base}/billing`, method: "GET", contract: obj({}), parameters: ["activationId"],
|
|
58
|
+
cli: { path: ["onboarding", "journey", "billing"], summary: "Read native trial eligibility; may reconcile an already-earned trial credit grant." },
|
|
59
|
+
mcp: { name: "oxygen_onboarding_journey_billing", title: "Oxygen: Onboarding billing", description: "Read native TEST trial/paid eligibility for your activationId. May reconcile an already-earned native credit grant, so this is a mutating call. No new subscription or charge; errors remain errors.", pack: "agents", annotations: { openWorldHint: true } }, mutates: true, spends: false },
|
|
60
|
+
{ id: "onboarding.journey.checkout", route: `${base}/checkout`, method: "POST", contract: GUIDED_ONBOARDING_CHECKOUT_CONTRACT, parameters: ["activationId"],
|
|
61
|
+
cli: { path: ["onboarding", "journey", "checkout"], summary: "Open approved DEV TEST Checkout as current workspace admin/owner, or reuse existing eligible billing." },
|
|
62
|
+
mcp: { name: "oxygen_onboarding_journey_checkout", title: "Oxygen: Onboarding test Checkout", description: "Current DEV admin/owner only: approved=true, revision and stable mutation_id open card-required TEST Checkout, $0 for seven days then $49/month, once-only 2000 trial credits. Reuses eligible existing paid/trial. No live Stripe fallback or early charge.", pack: "agents", annotations: { openWorldHint: true } }, mutates: true, spends: false },
|
|
63
|
+
];
|
|
@@ -33,6 +33,12 @@ export type OperationSpec<C extends ContractObject = ContractObject> = {
|
|
|
33
33
|
nameField: string;
|
|
34
34
|
typeField: string;
|
|
35
35
|
fileField: string;
|
|
36
|
+
/** Opt-in metadata derived from the original --file bytes. Explicit caller
|
|
37
|
+
* assertions must match; required native fields remain required on the wire. */
|
|
38
|
+
fileMetadata?: {
|
|
39
|
+
sha256Field: string;
|
|
40
|
+
sizeBytesField: string;
|
|
41
|
+
};
|
|
36
42
|
};
|
|
37
43
|
/** Download bytes through the same authenticated route; never follow redirects. */
|
|
38
44
|
binary?: {
|
|
@@ -12,6 +12,9 @@ import { BROWSER_OPERATIONS } from "./browser-operations.js";
|
|
|
12
12
|
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
|
+
import { GUIDED_ONBOARDING_JOURNEY_OPERATIONS } from "./guided-onboarding-journey.js";
|
|
16
|
+
import { GUIDED_FIRST_SOURCING_OPERATIONS } from "./guided-first-sourcing.js";
|
|
17
|
+
import { GUIDED_COMPANY_FILE_UPLOAD_OPERATION } from "./guided-company-files.js";
|
|
15
18
|
import { GUIDED_ACTIVATION_OPERATIONS } from "./guided-activation.js";
|
|
16
19
|
import { AGENT_SESSION_OPERATIONS } from "./agent-sessions.js";
|
|
17
20
|
import { TEAMMATE_OPERATIONS } from "./teammates.js";
|
|
@@ -79,7 +82,9 @@ export function operationFormData(spec, body) {
|
|
|
79
82
|
if (!fields)
|
|
80
83
|
throw new Error("This operation does not accept a file.");
|
|
81
84
|
const encoded = body[fields.contentField];
|
|
82
|
-
|
|
85
|
+
// A repeated capture over multi-megabyte uploads can overflow V8's regexp
|
|
86
|
+
// stack. Validate the same alphabet, length and terminal padding separately.
|
|
87
|
+
if (typeof encoded !== "string" || !encoded || encoded.length % 4 !== 0 || /[^A-Za-z0-9+/]/u.test(encoded.replace(/={1,2}$/u, ""))) {
|
|
83
88
|
throw new Error(`${fields.contentField} must contain valid non-empty base64 file bytes.`);
|
|
84
89
|
}
|
|
85
90
|
const bytes = Uint8Array.from(atob(encoded), (character) => character.charCodeAt(0));
|
|
@@ -92,6 +97,6 @@ export function operationFormData(spec, body) {
|
|
|
92
97
|
}
|
|
93
98
|
return form;
|
|
94
99
|
}
|
|
95
|
-
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, ...GUIDED_ACTIVATION_OPERATIONS, ...TEAMMATE_OPERATIONS, ...WORKSPACE_SKILL_OPERATIONS];
|
|
96
|
-
export const CLI_OPERATIONS = [...CUSTOMER_OPERATIONS, ...GEO_OPERATIONS, ...BROWSER_OPERATIONS, ...AGENT_SESSION_OPERATIONS, ...GUIDED_ACTIVATION_OPERATIONS, ...TEAMMATE_OPERATIONS, ...WORKSPACE_SKILL_OPERATIONS].filter((spec) => spec.generated?.cli !== false);
|
|
97
|
-
export const MCP_OPERATIONS = [...CUSTOMER_OPERATIONS, ...GEO_OPERATIONS, ...BROWSER_OPERATIONS, ...AGENT_SESSION_OPERATIONS, ...GUIDED_ACTIVATION_OPERATIONS, ...TEAMMATE_OPERATIONS, ...WORKSPACE_SKILL_OPERATIONS].filter((spec) => spec.generated?.mcp !== false);
|
|
100
|
+
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, ...GUIDED_ACTIVATION_OPERATIONS, ...GUIDED_ONBOARDING_JOURNEY_OPERATIONS, ...GUIDED_FIRST_SOURCING_OPERATIONS, GUIDED_COMPANY_FILE_UPLOAD_OPERATION, ...TEAMMATE_OPERATIONS, ...WORKSPACE_SKILL_OPERATIONS];
|
|
101
|
+
export const CLI_OPERATIONS = [...CUSTOMER_OPERATIONS, ...GEO_OPERATIONS, ...BROWSER_OPERATIONS, ...AGENT_SESSION_OPERATIONS, ...GUIDED_ACTIVATION_OPERATIONS, ...GUIDED_ONBOARDING_JOURNEY_OPERATIONS, ...GUIDED_FIRST_SOURCING_OPERATIONS, GUIDED_COMPANY_FILE_UPLOAD_OPERATION, ...TEAMMATE_OPERATIONS, ...WORKSPACE_SKILL_OPERATIONS].filter((spec) => spec.generated?.cli !== false);
|
|
102
|
+
export const MCP_OPERATIONS = [...CUSTOMER_OPERATIONS, ...GEO_OPERATIONS, ...BROWSER_OPERATIONS, ...AGENT_SESSION_OPERATIONS, ...GUIDED_ACTIVATION_OPERATIONS, ...GUIDED_ONBOARDING_JOURNEY_OPERATIONS, ...GUIDED_FIRST_SOURCING_OPERATIONS, GUIDED_COMPANY_FILE_UPLOAD_OPERATION, ...TEAMMATE_OPERATIONS, ...WORKSPACE_SKILL_OPERATIONS].filter((spec) => spec.generated?.mcp !== false);
|
|
@@ -11,4 +11,6 @@ export declare const TABLE_QUERY_RAW_CONTRACT: import("./schema.js").ContractObj
|
|
|
11
11
|
export declare const TABLE_QUERY_CLI_DEFAULT_LIMIT = 20;
|
|
12
12
|
export declare const TABLE_QUERY_CLI_DEFAULT_MAX_CHARS = 12000;
|
|
13
13
|
export declare function tableQueryRawResultFits(data: Record<string, unknown>, maxChars: number | undefined): boolean;
|
|
14
|
+
/** What a page shortened to fit its result window says to do next (CLI, MCP and API alike). */
|
|
15
|
+
export declare const TABLE_QUERY_RESULT_WINDOW_NEXT_STEP: string;
|
|
14
16
|
export declare function tableQueryRawRecovery(table: string, row?: string): Record<string, unknown>;
|
|
@@ -9,6 +9,9 @@ export const TABLE_QUERY_CLI_DEFAULT_MAX_CHARS = 12_000;
|
|
|
9
9
|
export function tableQueryRawResultFits(data, maxChars) {
|
|
10
10
|
return maxChars === undefined || JSON.stringify(success("tables query", data)).length <= maxChars;
|
|
11
11
|
}
|
|
12
|
+
/** What a page shortened to fit its result window says to do next (CLI, MCP and API alike). */
|
|
13
|
+
export const TABLE_QUERY_RESULT_WINDOW_NEXT_STEP = "This page holds fewer rows than the limit so it fits the result window; every value is complete. "
|
|
14
|
+
+ "Continue with nextCursor (same table, filters, sorts and fields), or select fewer fields for more rows per page.";
|
|
12
15
|
export function tableQueryRawRecovery(table, row) {
|
|
13
16
|
return {
|
|
14
17
|
table,
|
|
@@ -4,8 +4,8 @@ import { TEAMMATE_TASK_LIMITS } from "../teammate-tasks.js";
|
|
|
4
4
|
import { NEW_TEAMMATE_NAME, TEAMMATE_AVATAR_COLORS, TEAMMATE_AVATAR_KEYS, TEAMMATE_DESCRIPTION_MAX_CHARS, TEAMMATE_NAME_MAX_CHARS, TEAMMATE_SHARE_ROLES, } from "../teammates.js";
|
|
5
5
|
import { arr, bool, enumOf, int, obj, str } from "./schema.js";
|
|
6
6
|
/**
|
|
7
|
-
* AI teammates (ADR 0032), branded Oxygents: Agents
|
|
8
|
-
*
|
|
7
|
+
* AI teammates (ADR 0032), branded Oxygents: Agents with one ongoing chat,
|
|
8
|
+
* shared by default or Personal, the workspace's first one ("New Bot" until named) and
|
|
9
9
|
* any others added, none with a role (Tim, 2026-10-13). Staff on dev only.
|
|
10
10
|
* The people-facing names say Oxygent (`oxygen oxygents`, `oxygen_oxygents_*`,
|
|
11
11
|
* Tim 2026-10-12); the HTTP family and the code keep "teammates".
|
|
@@ -53,32 +53,34 @@ export const TEAMMATE_OPERATIONS = [
|
|
|
53
53
|
// Adding a teammate (phase 7): a custom Agent that can chat at once and run
|
|
54
54
|
// on its own, under a policy that asks before any write, send or spend. As in
|
|
55
55
|
// Grok Bot, it can start as just "New Bot" and learn its job in the chat.
|
|
56
|
-
teammateOperation("teammates.create", "create", "POST", "", `Add an Oxygent to the workspace, named "${NEW_TEAMMATE_NAME}" unless you name it; tell it its job in your chat with it. It can chat at once and run on its own (background tasks, routines), reading freely and asking before anything that writes, sends or spends. You own it
|
|
56
|
+
teammateOperation("teammates.create", "create", "POST", "", `Add an Oxygent to the workspace, named "${NEW_TEAMMATE_NAME}" unless you name it; tell it its job in your chat with it. It can chat at once and run on its own (background tasks, routines), reading freely and asking before anything that writes, sends or spends. You own it. Workspace access as collaborators and a shared chat are the default; choose personal for creator-only access. Free: adding one starts no inference.`, {
|
|
57
57
|
...TEAMMATE_PROFILE_FIELDS,
|
|
58
|
+
visibility: enumOf(["workspace", "personal"], { description: "Workspace (default) shares one chat history with everyone who has access. Personal is accessible only to its creator here, including against workspace admins. Explicitly saving to team memory publishes that entry to the workspace. An API key acts as the person who issued it." }),
|
|
58
59
|
slug: str({ minLength: 2, maxLength: 49, pattern: TEAMMATE_SLUG_PATTERN, description: "Its permanent handle in commands and links; made from the name when omitted." }),
|
|
59
60
|
}),
|
|
60
|
-
teammateOperation("teammates.get", "get", "GET", "/{slug}", "Read one Oxygent's profile and
|
|
61
|
-
teammateOperation("teammates.update", "update", "PATCH", "/{slug}", "Edit an Oxygent's
|
|
61
|
+
teammateOperation("teammates.get", "get", "GET", "/{slug}", "Read one Oxygent's profile and its ongoing chat and visibility."),
|
|
62
|
+
teammateOperation("teammates.update", "update", "PATCH", "/{slug}", "Edit an Oxygent's profile, or change visibility as its owner with confirm_visibility. Owners, managers and workspace admins can edit profiles. History is kept in both directions: Workspace shares it all; Personal removes others' future access but cannot retract what they saw. Home (the first Oxygent) stays Workspace. Free.", { ...TEAMMATE_PROFILE_FIELDS, visibility: enumOf(["workspace", "personal"], { description: "Only the owner can change visibility. Workspace grants everyone collaborator access and shares the complete history; Personal retains all messages, removes additional grants and everyone else's future access. Explicitly saving to team memory publishes that entry to the workspace. Home (the first Oxygent) stays Workspace." }), confirm_visibility: bool({ description: "Required when changing visibility: publishing shares all history; making personal removes everyone else's future access but cannot retract what they saw." }) }),
|
|
62
63
|
// Sharing (Tim, 2026-10-14: "make agents accessible to your team mates"), the
|
|
63
64
|
// way Grok Bot shares a Bot: everyone in the workspace, or people by email,
|
|
64
|
-
// each as a collaborator or a manager
|
|
65
|
-
teammateOperation("teammates.access", "access", "GET", "/{slug}/access", "Read
|
|
66
|
-
teammateOperation("teammates.share", "share", "POST", "/{slug}/access", "Share an Oxygent with teammates, or stop sharing it: with everyone in the workspace (everyone), or with people by their workspace email (add, as role; remove).
|
|
65
|
+
// each as a collaborator or a manager, with one ongoing shared chat.
|
|
66
|
+
teammateOperation("teammates.access", "access", "GET", "/{slug}/access", "Read access (visibility, owner, everyone, named people with roles, fixed and your permissions), without chat history. A collaborator uses its shared chat; a manager also changes its profile and access. Personal is creator-only; Home (the first Oxygent) is fixed. Free."),
|
|
67
|
+
teammateOperation("teammates.share", "share", "POST", "/{slug}/access", "Share an Oxygent with teammates, or stop sharing it: with everyone in the workspace (everyone), or with people by their workspace email (add, as role; remove). Everyone with access reads the same chat history. Personal Oxygents cannot be shared; change visibility explicitly first. Its owner, its managers or a workspace admin only; never the first Oxygent, which is everyone's. Free.", {
|
|
67
68
|
everyone: enumOf([...TEAMMATE_SHARE_ROLES, "off"], {
|
|
68
|
-
description: "
|
|
69
|
+
description: "Workspace-wide role: collaborator (the default), manager, or off (owner and named people, with workspace admins retaining management access). This restricts a Workspace Oxygent's audience; it does not make it Personal or split its shared chat.",
|
|
69
70
|
}),
|
|
70
71
|
add: arr(str({ minLength: 3, maxLength: 320 }), { maxItems: 50, description: "People to share it with, by their workspace email." }),
|
|
71
72
|
role: enumOf([...TEAMMATE_SHARE_ROLES], {
|
|
72
|
-
description: "What the people in add become: collaborator (the default), who
|
|
73
|
+
description: "What the people in add become: collaborator (the default), who uses the same shared chat, or manager, who also changes its profile and access. Adding someone already listed changes their role.",
|
|
73
74
|
}),
|
|
74
75
|
remove: arr(str({ minLength: 3, maxLength: 320 }), {
|
|
75
76
|
maxItems: 50,
|
|
76
|
-
description: "
|
|
77
|
+
description: "Remove named grants by workspace email or the user_id access lists for former members. All messages stay in the shared history. Workspace-wide access still applies; use everyone off to remove that grant too.",
|
|
77
78
|
}),
|
|
78
79
|
}),
|
|
79
80
|
// Copy and delete (Tim, 2026-10-13: "CRUD actions ... through the right
|
|
80
81
|
// click"; "'delete' should be 'full delete'"), as Grok Bot's Bot menu has.
|
|
81
|
-
teammateOperation("teammates.duplicate", "duplicate", "POST", "/{slug}/duplicate", `Copy an Oxygent as a new one you own, named "<name> copy" unless you name it: its job, look, instructions, skills and tool settings, but not its chats, memory, routines or who it is shared with.
|
|
82
|
+
teammateOperation("teammates.duplicate", "duplicate", "POST", "/{slug}/duplicate", `Copy an Oxygent as a new one you own, named "<name> copy" unless you name it: its job, look, instructions, skills and tool settings, but not its chats, memory, routines or who it is shared with. The copy defaults to Workspace; choose Personal for creator-only access. Free.`, {
|
|
83
|
+
visibility: enumOf(["workspace", "personal"], { description: "Visibility of the copy; Workspace by default. No history is copied. Explicitly saving to team memory publishes that entry to the workspace." }),
|
|
82
84
|
name: str({
|
|
83
85
|
minLength: 1, maxLength: TEAMMATE_NAME_MAX_CHARS,
|
|
84
86
|
description: "What everyone calls the copy. Its slug is made from the name, and a deleted Oxygent's slug stays taken, so a copy can get a numbered one (scout-2).",
|
|
@@ -88,8 +90,8 @@ export const TEAMMATE_OPERATIONS = [
|
|
|
88
90
|
preview: bool({ description: "Only say what would go: its chats and the people they belong to, group chats, the group chats with other people it would leave, routines, runs, attached files and team memory entries." }),
|
|
89
91
|
confirm: str({ maxLength: 49, description: "Its slug, repeated, to delete it." }),
|
|
90
92
|
}),
|
|
91
|
-
teammateOperation("teammates.chat", "chat", "POST", "/{slug}/chat", "Open
|
|
92
|
-
teammateOperation("teammates.message", "message", "POST", "/{slug}/messages", "Send a message in
|
|
93
|
+
teammateOperation("teammates.chat", "chat", "POST", "/{slug}/chat", "Open the ongoing chat with an Oxygent, creating it the first time. Starts no inference."),
|
|
94
|
+
teammateOperation("teammates.message", "message", "POST", "/{slug}/messages", "Send a message in the ongoing chat with an Oxygent. Starts a turn billed from workspace credits; paid or external actions still need approval.", { message: str({ minLength: 1, maxLength: 16000 }) }, ["message"], true),
|
|
93
95
|
// Read state is the reader's own: a person's client may mark it, a runtime
|
|
94
96
|
// acting in a chat never does (platform-denied, and refused at the route).
|
|
95
97
|
teammateOperation("teammates.read", "read", "POST", "/{slug}/read", "Mark your chat with an Oxygent read up to its newest turn (or turn_index), or mark its newest turn unread again. Free.", { turn_index: int({ minimum: 0 }), unread: bool({ description: "On marks its newest turn unread again." }) }),
|
|
@@ -113,7 +115,7 @@ export const TEAMMATE_OPERATIONS = [
|
|
|
113
115
|
teammateOperation("teammates.memory", "memory", "GET", "/{slug}/memory", "List what the team asked an Oxygent to remember. Every chat with it reads this; it is a Knowledge page."),
|
|
114
116
|
teammateOperation("teammates.remember", "remember", "POST", "/{slug}/memory", "Add one thing to an Oxygent's team memory: every chat with it reads it, and the whole workspace can see it. Free.", { text: str({ minLength: 1, maxLength: 500 }) }, ["text"]),
|
|
115
117
|
teammateOperation("teammates.forget", "forget", "DELETE", "/{slug}/memory/{entry_id}", "Remove one entry from an Oxygent's team memory."),
|
|
116
|
-
teammateOperation("teammates.notes", "notes", "GET", "/{slug}/notes", "Read what an Oxygent keeps about you
|
|
118
|
+
teammateOperation("teammates.notes", "notes", "GET", "/{slug}/notes", "Read what an Oxygent keeps about you. Private to you; never included in shared Workspace or multi-person group chats."),
|
|
117
119
|
teammateOperation("teammates.notes_set", "notes_set", "POST", "/{slug}/notes", "Replace what an Oxygent keeps about you; empty clears it. Private to you.", { notes: str({ maxLength: 4000 }) }, ["notes"]),
|
|
118
120
|
teammateOperation("teammates.activity", "activity", "GET", "/{slug}/activity", "List an Oxygent's recent work: its runs and the actions taken in its chats, as metadata only (no goals or messages)."),
|
|
119
121
|
teammateGroupOperation("teammate_groups.list", "groups", "GET", "", "List the group chats you are in: name, Oxygents, people (each an admin or member) and the chat (working or waiting for you, unread, the latest words and who said them). Candidates are the teammates a new group chat could bring in."),
|
|
@@ -37,6 +37,8 @@ export type EmailTrackingTokenPayload = {
|
|
|
37
37
|
enr?: string;
|
|
38
38
|
/** Issued-at (epoch ms), recorded as provenance. */
|
|
39
39
|
iat: number;
|
|
40
|
+
/** Diagnostic copy test: preserve transport rendering without campaign analytics. */
|
|
41
|
+
diagnostic?: true;
|
|
40
42
|
};
|
|
41
43
|
/** SHA-256 hex of a destination URL — the value bound into a click token's `uh`. */
|
|
42
44
|
export declare function hashTrackingUrl(url: string): string;
|
|
@@ -45,6 +45,7 @@ function parseTokenPayload(body) {
|
|
|
45
45
|
...(uh ? { uh } : {}),
|
|
46
46
|
...(typeof candidate.seq === "string" && candidate.seq ? { seq: candidate.seq } : {}),
|
|
47
47
|
...(typeof candidate.enr === "string" && candidate.enr ? { enr: candidate.enr } : {}),
|
|
48
|
+
...(candidate.diagnostic === true ? { diagnostic: true } : {}),
|
|
48
49
|
iat: typeof candidate.iat === "number" && Number.isFinite(candidate.iat) ? candidate.iat : 0,
|
|
49
50
|
};
|
|
50
51
|
}
|
|
@@ -71,6 +71,10 @@ export type FeatureGateResolution = {
|
|
|
71
71
|
* - OXYGEN_AGENTS_ENABLED — (b). Authorizes autonomous Agent run execution —
|
|
72
72
|
* tool authority AND credit spend (`apps/web/src/lib/agent-runtime.ts`,
|
|
73
73
|
* `apps/worker/src/agent-cycle.ts`). Same class as publishing.
|
|
74
|
+
* - OXYGEN_AGENTS_WORKSPACE_IDS — (b). Which workspaces that execution may run
|
|
75
|
+
* in (`packages/shared/src/agents-enabled.ts`); production also requires its
|
|
76
|
+
* reviewed PRODUCTION_AGENT_WORKSPACE_IDS, so a wrong "on" for a customer's
|
|
77
|
+
* workspace there needs a code change as well.
|
|
74
78
|
* - OXYGEN_REPRICING_2026_09_EFFECTIVE_AT — (b). The instant every held price
|
|
75
79
|
* rise and limit cut of the 2026-09 repricing takes effect
|
|
76
80
|
* (`packages/shared/src/repricing.ts`). A remotely flippable value would let
|
|
@@ -62,6 +62,10 @@
|
|
|
62
62
|
* - OXYGEN_AGENTS_ENABLED — (b). Authorizes autonomous Agent run execution —
|
|
63
63
|
* tool authority AND credit spend (`apps/web/src/lib/agent-runtime.ts`,
|
|
64
64
|
* `apps/worker/src/agent-cycle.ts`). Same class as publishing.
|
|
65
|
+
* - OXYGEN_AGENTS_WORKSPACE_IDS — (b). Which workspaces that execution may run
|
|
66
|
+
* in (`packages/shared/src/agents-enabled.ts`); production also requires its
|
|
67
|
+
* reviewed PRODUCTION_AGENT_WORKSPACE_IDS, so a wrong "on" for a customer's
|
|
68
|
+
* workspace there needs a code change as well.
|
|
65
69
|
* - OXYGEN_REPRICING_2026_09_EFFECTIVE_AT — (b). The instant every held price
|
|
66
70
|
* rise and limit cut of the 2026-09 repricing takes effect
|
|
67
71
|
* (`packages/shared/src/repricing.ts`). A remotely flippable value would let
|
|
@@ -90,6 +94,7 @@ export const NEVER_FLAGGABLE = [
|
|
|
90
94
|
"OXYGEN_PUBLISHING_ENABLED",
|
|
91
95
|
"OXYGEN_UGC_ENABLED",
|
|
92
96
|
"OXYGEN_AGENTS_ENABLED",
|
|
97
|
+
"OXYGEN_AGENTS_WORKSPACE_IDS",
|
|
93
98
|
"OXYGEN_TELEMETRY_ENABLED",
|
|
94
99
|
"OXYGEN_LOG_SHIPPING_ENABLED",
|
|
95
100
|
"OXYGEN_LLM_TRACING_ENABLED",
|
|
@@ -76,6 +76,52 @@ export declare function normalizeRowsForNewTable(rows: Record<string, unknown>[]
|
|
|
76
76
|
*/
|
|
77
77
|
export declare function dropBlankImportCells(row: Record<string, unknown>, keepKey?: string | null): Record<string, unknown>;
|
|
78
78
|
export declare function normalizeImportColumnKey(value: string): string;
|
|
79
|
+
/**
|
|
80
|
+
* Read `ignore_source_keys`: the headers a mapping step set to "Don't import".
|
|
81
|
+
* A JSON array (staged body) or its JSON text (multipart form field); headers
|
|
82
|
+
* are matched verbatim, so they are not trimmed. Anything malformed reads as
|
|
83
|
+
* no choice at all, never as a reason to fail the import.
|
|
84
|
+
*/
|
|
85
|
+
export declare function readImportHeaderList(value: unknown): string[];
|
|
86
|
+
/** A column of the table an import writes into. */
|
|
87
|
+
export type ImportTargetColumn = {
|
|
88
|
+
key: string;
|
|
89
|
+
label?: string | null;
|
|
90
|
+
};
|
|
91
|
+
/** Why a file column was not written. */
|
|
92
|
+
export type IgnoredImportHeaderReason = "not_selected" | "no_matching_column" | "duplicate_target" | "system_column";
|
|
93
|
+
export type IgnoredImportHeader = {
|
|
94
|
+
header: string;
|
|
95
|
+
reason: IgnoredImportHeaderReason;
|
|
96
|
+
column?: string;
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Decide, once per file header, which column of an EXISTING table it lands in.
|
|
100
|
+
*
|
|
101
|
+
* File imports used to hand every header to the row writer verbatim, and the
|
|
102
|
+
* writer refuses an unknown key for the whole chunk. A standard export carries
|
|
103
|
+
* columns the table does not have — Baserow puts an `id` first — so on
|
|
104
|
+
* 2026-10-12 and 2026-10-15 three workspaces' CRM imports wrote nothing at all
|
|
105
|
+
* and showed only `invalid_row_values`. Headers now resolve in a fixed order:
|
|
106
|
+
* an explicit choice (`explicitMap`, `ignore`) first, then the column key, then
|
|
107
|
+
* the column's label or the normalized key. A header that resolves to no
|
|
108
|
+
* column, or to a column another header already fills, is left out and
|
|
109
|
+
* reported, never guessed: two headers writing one column would overwrite each
|
|
110
|
+
* other. Rows keep their cells; only the keys are renamed or dropped.
|
|
111
|
+
*/
|
|
112
|
+
export declare function createImportHeaderProjector(input: {
|
|
113
|
+
columns: readonly ImportTargetColumn[];
|
|
114
|
+
explicitMap?: Readonly<Record<string, string>> | null;
|
|
115
|
+
ignore?: readonly string[] | null;
|
|
116
|
+
}): {
|
|
117
|
+
/** Resolve any headers first seen in these rows; earlier decisions stand. */
|
|
118
|
+
observe(rows: readonly Record<string, unknown>[]): void;
|
|
119
|
+
/** The row with every key renamed to its column, unwritten headers dropped. */
|
|
120
|
+
project(row: Record<string, unknown>): Record<string, unknown>;
|
|
121
|
+
/** header → column for every header that writes; for a preview or a receipt. */
|
|
122
|
+
mapping(): Record<string, string>;
|
|
123
|
+
ignored(): IgnoredImportHeader[];
|
|
124
|
+
};
|
|
79
125
|
/**
|
|
80
126
|
* Refuse a JSON or XLSX file over the buffered-parse ceiling before anything is
|
|
81
127
|
* uploaded or queued. CSV and JSONL stream, so they pass at any size and only
|