@oxygen-agent/cli 1.1014.136 → 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
|
@@ -13,6 +13,34 @@ export function capabilityDiscoveryRecovery(query, surface) {
|
|
|
13
13
|
// the user-facing boundary while preserving table joins and channel-specific
|
|
14
14
|
// connection routes.
|
|
15
15
|
export function inferUserCapabilityRoute(query) {
|
|
16
|
+
const normalized = query.toLowerCase().replace(/[_-]+/g, " ");
|
|
17
|
+
if (isUnconfirmedLookupReviewIntent(normalized)) {
|
|
18
|
+
const route = getCapabilityRouteMatch("observability");
|
|
19
|
+
if (route)
|
|
20
|
+
return {
|
|
21
|
+
...route,
|
|
22
|
+
card: { ...route.card, posture: "read_only", execution: "Read the Run and its provider events. Inspect original outcomes and billing evidence before any retry; this read settles nothing and starts no provider call." },
|
|
23
|
+
recommendedTools: ["oxygen_runs_list", "oxygen_runs_get", "oxygen_observability_events"],
|
|
24
|
+
recommendedCommands: ["runs list", "runs get", "observability events"],
|
|
25
|
+
exactCommand: "oxygen runs list --limit 5 --json",
|
|
26
|
+
exactMcpCall: { tool: "oxygen_runs_list", arguments: { limit: 5 } },
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (isSignupCompanyResearchReadIntent(normalized)) {
|
|
30
|
+
const route = getCapabilityRouteMatch("knowledge-graph");
|
|
31
|
+
if (route)
|
|
32
|
+
return {
|
|
33
|
+
...route,
|
|
34
|
+
card: { ...route.card, posture: "read_only", execution: "Check saved signup company research, its Run and cited pages. Status spends no credits and starts no research." },
|
|
35
|
+
recommendedTools: ["oxygen_knowledge_bootstrap", "oxygen_runs_get", "oxygen_knowledge_page_get"],
|
|
36
|
+
recommendedCommands: ["knowledge bootstrap status", "runs get", "knowledge page get"],
|
|
37
|
+
exactCommand: "oxygen knowledge bootstrap status --json",
|
|
38
|
+
exactMcpCall: { tool: "oxygen_knowledge_bootstrap", arguments: { status: true } },
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const oxygents = oxygentsRoute(normalized);
|
|
42
|
+
if (oxygents)
|
|
43
|
+
return oxygents;
|
|
16
44
|
if (/\b(ongoing worker|ongoing session|long horizon agent|campaign monitor|watch (?:a |one |this |the |specific )?campaign)\b/i.test(query)) {
|
|
17
45
|
const route = getCapabilityRouteMatch("agents");
|
|
18
46
|
if (route)
|
|
@@ -27,6 +55,22 @@ export function inferUserCapabilityRoute(query) {
|
|
|
27
55
|
recommendedCommands: ["integrations connect", ...setup.recommendedCommands.filter((command) => command !== "integrations connect")],
|
|
28
56
|
};
|
|
29
57
|
}
|
|
58
|
+
if (isWikiMetadataInventoryIntent(query)) {
|
|
59
|
+
const knowledge = getCapabilityRouteMatch("knowledge-graph");
|
|
60
|
+
if (knowledge)
|
|
61
|
+
return {
|
|
62
|
+
...knowledge,
|
|
63
|
+
card: {
|
|
64
|
+
...knowledge.card,
|
|
65
|
+
posture: "read_only",
|
|
66
|
+
execution: "Read bounded stored wiki revision/hash metadata; follow next_cursor for remaining pages. No semantic retrieval, writes or credits.",
|
|
67
|
+
},
|
|
68
|
+
recommendedTools: ["oxygen_knowledge_sync_manifest"],
|
|
69
|
+
recommendedCommands: ["knowledge sync-manifest"],
|
|
70
|
+
exactCommand: "oxygen knowledge sync-manifest --limit 5 --json",
|
|
71
|
+
exactMcpCall: { tool: "oxygen_knowledge_sync_manifest", arguments: { limit: 5 } },
|
|
72
|
+
};
|
|
73
|
+
}
|
|
30
74
|
const route = inferCapabilityRoute(query);
|
|
31
75
|
const providerConnectionIntent = isSimpleProviderConnectionIntent(query);
|
|
32
76
|
if (!providerConnectionIntent
|
|
@@ -42,6 +86,82 @@ export function inferUserCapabilityRoute(query) {
|
|
|
42
86
|
// intent is exactly what this wrapper exists to answer.
|
|
43
87
|
return getCapabilityRouteMatch("connected-integrations") ?? route;
|
|
44
88
|
}
|
|
89
|
+
function isSignupCompanyResearchReadIntent(query) {
|
|
90
|
+
return /\bcompany research\b|\bresearch (?:the |my |our )?company\b/.test(query)
|
|
91
|
+
&& /\bsign\s?up\b|\bonboard\w*\b|\bworkspace setup\b|\bnew workspace\b/.test(query)
|
|
92
|
+
&& !/\b(?:start|execute|force|rerun|replay)\b/.test(query);
|
|
93
|
+
}
|
|
94
|
+
function isUnconfirmedLookupReviewIntent(query) {
|
|
95
|
+
return /\b(?:review|inspect|investigate|check|explain)\b/.test(query)
|
|
96
|
+
&& /\b(?:uncertain|unconfirmed|unknown|unsettled)\b/.test(query)
|
|
97
|
+
&& /\b(?:lookup|provider|supplier|research)\b/.test(query)
|
|
98
|
+
&& /\b(?:outcome|spend|cost|credits?|effect|run)\b/.test(query);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* The `oxygents` operation an ask names (its MCP verb), first match wins: a
|
|
102
|
+
* removal or copy beats the create words a name can carry ("delete the new
|
|
103
|
+
* bot"), a group beats its members' verbs, and reading or opening a chat beats
|
|
104
|
+
* the message words its object carries ("read my chat with it").
|
|
105
|
+
*/
|
|
106
|
+
const OXYGENT_VERBS = [
|
|
107
|
+
["delete", /\b(?:delet\w*|remov\w*|eras\w*|destroy\w*|get rid of)\b/],
|
|
108
|
+
["duplicate", /\b(?:cop(?:y|ies|ying)|duplicat\w*|clon\w*)\b/],
|
|
109
|
+
["notify", /\b(?:notif\w*|mute\w*|unmute\w*|silenc\w*)\b/],
|
|
110
|
+
["group_create", /\b(?:creat\w*|start\w*|new|make)\b.*\bgroups?\b|\bgroups?\b.*\b(?:creat\w*|start\w*)\b/],
|
|
111
|
+
["groups", /\bgroups?\b/],
|
|
112
|
+
["update", /\b(?:renam\w*|edit\w*|updat\w*|chang\w*)\b/],
|
|
113
|
+
["pin", /\b(?:pin|pins|pinned|pinning|unpin\w*)\b/],
|
|
114
|
+
["hide", /\b(?:hid(?:e|es|ing|den)|unhid\w*)\b/],
|
|
115
|
+
["remember", /\bremember\w*\b/],
|
|
116
|
+
["forget", /\bforget\w*\b/],
|
|
117
|
+
["memory", /\bmemor\w*\b/],
|
|
118
|
+
["notes", /\bnotes?\b/],
|
|
119
|
+
["routines", /\b(?:routines?|recurring|schedul\w*)\b/],
|
|
120
|
+
["task", /\b(?:background|tasks?)\b/],
|
|
121
|
+
["activity", /\b(?:activit\w*|work log|runs?)\b/],
|
|
122
|
+
["read", /\b(?:unread|mark\w*\b.*\bread)\b/],
|
|
123
|
+
["get", /\b(?:read|see|view|show|history|transcript)\b/],
|
|
124
|
+
["chat", /\bopen\w*\b/],
|
|
125
|
+
["message", /\b(?:message\w*|ask|tell|send|talk|chat|hand\w* off|handoff|delegat\w*)\b/],
|
|
126
|
+
["create", /\b(?:creat\w*|add|new|make|set up|spawn|hire)\b/],
|
|
127
|
+
];
|
|
128
|
+
/**
|
|
129
|
+
* Oxygents (AI teammates, ADR 0032) share the Agents card, whose gateway is the
|
|
130
|
+
* Agent commands, so an ask naming one got `agent list/create/run` and, in
|
|
131
|
+
* `commands search`, no `oxygents` command at all (blind CLI evals, 2026-10-13
|
|
132
|
+
* and 2026-10-14). Only an explicit Oxygent ask moves: a plain "agent" ask,
|
|
133
|
+
* and a person's human "teammate", keep their owners.
|
|
134
|
+
*/
|
|
135
|
+
function oxygentsRoute(normalized) {
|
|
136
|
+
if (!/\b(?:oxygents?|ai teammates?)\b/.test(normalized))
|
|
137
|
+
return null;
|
|
138
|
+
const route = getCapabilityRouteMatch("agents");
|
|
139
|
+
if (!route)
|
|
140
|
+
return null;
|
|
141
|
+
const verb = OXYGENT_VERBS.find(([, words]) => words.test(normalized))?.[0] ?? "list";
|
|
142
|
+
const verbs = [...new Set([verb, "list", "get"])];
|
|
143
|
+
return {
|
|
144
|
+
...route,
|
|
145
|
+
recommendedTools: verbs.map((name) => `oxygen_oxygents_${name}`),
|
|
146
|
+
recommendedCommands: verbs.map((name) => `oxygents ${name.replace(/_/g, "-")}`),
|
|
147
|
+
...(verb === "list"
|
|
148
|
+
? { exactCommand: "oxygen oxygents list --json", exactMcpCall: { tool: "oxygen_oxygents_list", arguments: {} } }
|
|
149
|
+
: {}),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/** Manifest reads current, unfiltered page metadata; it cannot satisfy other scopes. */
|
|
153
|
+
function isWikiMetadataInventoryIntent(query) {
|
|
154
|
+
const normalized = query.toLowerCase().replace(/[_-]+/g, " ");
|
|
155
|
+
return /\b(?:wiki|knowledge)\b/.test(normalized)
|
|
156
|
+
&& (/\b(?:inventory|manifest)\b/.test(normalized)
|
|
157
|
+
|| (/\bpages?\b/.test(normalized) && /\bcontent hash\b/.test(normalized)))
|
|
158
|
+
&& /\b(?:read|list|inspect|show|get|fetch|view|metadata|revision|content hash|cursor)\b/.test(normalized)
|
|
159
|
+
&& !/\b(?:writ\w*|rewrit\w*|updat\w*|edit\w*|chang\w*|replac\w*|renam\w*|delet\w*|remov\w*|creat\w*|import\w*|generat\w*|propos\w*|approv\w*|restor\w*|rollback|archiv\w*|append\w*|add\w*|mov\w*|pin\w*|seed\w*|sync\w*|publish\w*|unpublish\w*|api key|credentials?|connect\w*)\b/.test(normalized)
|
|
160
|
+
&& !/\b(?:histor\w*|previous|older?|repos?(?:itory|itories)?|github|mount\w*|files?|filter\w*|exclud\w*|except|tombstones?|tag\w*|status(?:es)?|drafts?|types?|only|specific|titles?|paths?|folders?|collections?)\b/.test(normalized)
|
|
161
|
+
&& !/\b(?:at|before|after)\s+(?:revision|version)\b/.test(normalized)
|
|
162
|
+
&& !/\b(?:revision|version)\s+\d/.test(normalized)
|
|
163
|
+
&& !/\b(?:body|bodies|markdown|text|rendered)\b|\bcontent\b(?!\s+hash)/.test(normalized);
|
|
164
|
+
}
|
|
45
165
|
// The words that mean "this is Tables work, not a provider connection". Hand-typing
|
|
46
166
|
// them drifted: the list covered table/row/column/dataset/join/relate but not csv,
|
|
47
167
|
// import, enrich, waterfall, formula, lookup or score -- all of which the Tables card
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const OXYGEN_BUILD_VERSION = "1.1014.
|
|
1
|
+
export declare const OXYGEN_BUILD_VERSION = "1.1014.618";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// GENERATED by scripts/ci/version-stamp.mjs from VERSION + git history. Do not edit; do not commit.
|
|
2
|
-
export const OXYGEN_BUILD_VERSION = "1.1014.
|
|
2
|
+
export const OXYGEN_BUILD_VERSION = "1.1014.618";
|
|
@@ -14,6 +14,13 @@ export type VisualRenderRequest = {
|
|
|
14
14
|
scale: 1 | 2;
|
|
15
15
|
formats: ("png" | "pdf")[];
|
|
16
16
|
};
|
|
17
|
+
/**
|
|
18
|
+
* What a render costs the customer: nothing (Tim, 2026-10-14: "the rendering
|
|
19
|
+
* shouldn't cost credits that's just stupid"). The platform's own compute stays
|
|
20
|
+
* bounded by `maxCostMicros` and the managed-spend limiter. Renders previewed
|
|
21
|
+
* before then carry the tariff they were quoted in `credits`; none is charged.
|
|
22
|
+
*/
|
|
23
|
+
export declare const VISUAL_RENDER_CREDITS = 0;
|
|
17
24
|
export type VisualRenderProfile = {
|
|
18
25
|
version: typeof VISUAL_RENDER_PROFILE;
|
|
19
26
|
renderSnapshotId: string;
|
|
@@ -23,8 +30,9 @@ export type VisualRenderProfile = {
|
|
|
23
30
|
credits: number;
|
|
24
31
|
maxCostMicros: number;
|
|
25
32
|
};
|
|
33
|
+
/** The same renderer and compute bound. The quoted credits are not part of it: no render is charged. */
|
|
26
34
|
export declare function visualRenderProfilesMatch(a: VisualRenderProfile, b: VisualRenderProfile): boolean;
|
|
27
35
|
export declare function validateVisualFileId(value: unknown): string;
|
|
28
36
|
export declare function parseVisualRenderRequest(value: Record<string, unknown>): VisualRenderRequest;
|
|
29
|
-
/** No default snapshot or
|
|
37
|
+
/** No default snapshot or compute bound: enabling this profile is an explicit deployment operation. */
|
|
30
38
|
export declare function resolveVisualRenderProfile(env: Record<string, string | undefined>, now?: number): VisualRenderProfile | null;
|
|
@@ -5,10 +5,18 @@ export const VISUAL_RENDER_LIMITS = Object.freeze({
|
|
|
5
5
|
maxSourceBytes: 2 * 1024 * 1024, maxOutputBytes: 50 * 1024 * 1024,
|
|
6
6
|
timeoutMs: 120_000,
|
|
7
7
|
});
|
|
8
|
+
/**
|
|
9
|
+
* What a render costs the customer: nothing (Tim, 2026-10-14: "the rendering
|
|
10
|
+
* shouldn't cost credits that's just stupid"). The platform's own compute stays
|
|
11
|
+
* bounded by `maxCostMicros` and the managed-spend limiter. Renders previewed
|
|
12
|
+
* before then carry the tariff they were quoted in `credits`; none is charged.
|
|
13
|
+
*/
|
|
14
|
+
export const VISUAL_RENDER_CREDITS = 0;
|
|
15
|
+
/** The same renderer and compute bound. The quoted credits are not part of it: no render is charged. */
|
|
8
16
|
export function visualRenderProfilesMatch(a, b) {
|
|
9
17
|
return a.version === b.version && a.renderSnapshotId === b.renderSnapshotId
|
|
10
18
|
&& a.validatorSnapshotId === b.validatorSnapshotId && a.rendererDigest === b.rendererDigest
|
|
11
|
-
&& a.expiresAt === b.expiresAt && a.
|
|
19
|
+
&& a.expiresAt === b.expiresAt && a.maxCostMicros === b.maxCostMicros;
|
|
12
20
|
}
|
|
13
21
|
const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
14
22
|
export function validateVisualFileId(value) {
|
|
@@ -37,19 +45,18 @@ export function parseVisualRenderRequest(value) {
|
|
|
37
45
|
}
|
|
38
46
|
return { source_file_ids, width, height, scale, formats: formats };
|
|
39
47
|
}
|
|
40
|
-
/** No default snapshot or
|
|
48
|
+
/** No default snapshot or compute bound: enabling this profile is an explicit deployment operation. */
|
|
41
49
|
export function resolveVisualRenderProfile(env, now = Date.now()) {
|
|
42
50
|
const renderSnapshotId = env.OXYGEN_VISUAL_RENDER_SNAPSHOT_ID?.trim();
|
|
43
51
|
const validatorSnapshotId = env.OXYGEN_VISUAL_VALIDATOR_SNAPSHOT_ID?.trim();
|
|
44
52
|
const rendererDigest = env.OXYGEN_VISUAL_RENDERER_DIGEST?.trim();
|
|
45
53
|
const expiresAt = env.OXYGEN_VISUAL_PROFILE_EXPIRES_AT?.trim();
|
|
46
|
-
const credits = Number(env.OXYGEN_VISUAL_RENDER_CREDITS);
|
|
47
54
|
const maxCostMicros = Number(env.OXYGEN_VISUAL_RENDER_MAX_COST_MICROS);
|
|
48
55
|
if (env.OXYGEN_VISUAL_RENDER_ENABLED !== "1" || !renderSnapshotId || !validatorSnapshotId
|
|
49
56
|
|| renderSnapshotId === validatorSnapshotId || !rendererDigest || !/^[a-f0-9]{64}$/.test(rendererDigest)
|
|
50
57
|
|| !expiresAt || !Number.isFinite(Date.parse(expiresAt)) || Date.parse(expiresAt) <= now + 180_000
|
|
51
|
-
|| !Number.isFinite(credits) || credits <= 0 || credits > 1000
|
|
52
58
|
|| !Number.isSafeInteger(maxCostMicros) || maxCostMicros < 50_000 || maxCostMicros > 1_000_000)
|
|
53
59
|
return null;
|
|
54
|
-
return { version: VISUAL_RENDER_PROFILE, renderSnapshotId, validatorSnapshotId, rendererDigest, expiresAt,
|
|
60
|
+
return { version: VISUAL_RENDER_PROFILE, renderSnapshotId, validatorSnapshotId, rendererDigest, expiresAt,
|
|
61
|
+
credits: VISUAL_RENDER_CREDITS, maxCostMicros };
|
|
55
62
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** SendKit reports placement and independent send totals, not rescues or a failure count.
|
|
2
|
+
* Normalize old caches at the shared read boundary without rewriting stored evidence.
|
|
3
|
+
* Other rails retain their explicitly reported rescue and failure counters.
|
|
4
|
+
*/
|
|
5
|
+
export declare function normalizeWarmupMetrics(record: Record<string, unknown> | null, provider?: string | null): Record<string, unknown> | null;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { isRecord } from "./type-guards.js";
|
|
2
|
+
const SPAM_PLACEMENT_KEYS = ["landed_spam", "spam", "saved_from_spam", "savedFromSpam", "spam_saved", "rescued_from_spam"];
|
|
3
|
+
const RESCUE_KEYS = SPAM_PLACEMENT_KEYS.slice(2);
|
|
4
|
+
/** SendKit reports placement and independent send totals, not rescues or a failure count.
|
|
5
|
+
* Normalize old caches at the shared read boundary without rewriting stored evidence.
|
|
6
|
+
* Other rails retain their explicitly reported rescue and failure counters.
|
|
7
|
+
*/
|
|
8
|
+
export function normalizeWarmupMetrics(record, provider) {
|
|
9
|
+
if (!record)
|
|
10
|
+
return null;
|
|
11
|
+
const managed = [record.provider, provider].some((value) => value === "sendkit" || value === "oxygen_warmup");
|
|
12
|
+
if (!managed)
|
|
13
|
+
return record;
|
|
14
|
+
const normalizeCounts = (row) => {
|
|
15
|
+
const result = { ...row };
|
|
16
|
+
const keys = "landed_spam" in row ? ["landed_spam"] : SPAM_PLACEMENT_KEYS;
|
|
17
|
+
result.landed_spam = keys.map((key) => {
|
|
18
|
+
const raw = row[key];
|
|
19
|
+
const value = typeof raw === "number" ? raw : typeof raw === "string" && raw.trim() ? Number(raw) : NaN;
|
|
20
|
+
return Number.isFinite(value) && value >= 0 ? value : null;
|
|
21
|
+
}).find((value) => value !== null) ?? null;
|
|
22
|
+
for (const key of RESCUE_KEYS)
|
|
23
|
+
delete result[key];
|
|
24
|
+
delete result.spam;
|
|
25
|
+
result.saved_from_spam = null;
|
|
26
|
+
// Even a positive difference is unproven: these totals have different windows.
|
|
27
|
+
result.failed_to_send = null;
|
|
28
|
+
result.send_counters_comparable = false;
|
|
29
|
+
return result;
|
|
30
|
+
};
|
|
31
|
+
const result = normalizeCounts(record);
|
|
32
|
+
for (const key of ["aggregate_data", "summary", "totals"]) {
|
|
33
|
+
if (isRecord(record[key]))
|
|
34
|
+
result[key] = normalizeCounts(record[key]);
|
|
35
|
+
}
|
|
36
|
+
for (const key of ["daily", "days", "per_day", "email_date_data", "date_data"]) {
|
|
37
|
+
const rows = record[key];
|
|
38
|
+
if (Array.isArray(rows))
|
|
39
|
+
result[key] = rows.map((row) => isRecord(row) ? normalizeCounts(row) : row);
|
|
40
|
+
else if (isRecord(rows))
|
|
41
|
+
result[key] = Object.fromEntries(Object.entries(rows).map(([date, row]) => [date, isRecord(row) ? normalizeCounts(row) : row]));
|
|
42
|
+
}
|
|
43
|
+
return result;
|
|
44
|
+
}
|