@oxygen-agent/cli 1.1014.1464 → 1.1014.1597
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.js +2 -0
- package/dist/command-manifest.js +12 -2
- package/dist/commands/budget.js +2 -2
- package/dist/commands/capabilities.js +3 -2
- package/dist/commands/columns.js +1 -1
- package/dist/commands/companies.js +3 -0
- package/dist/commands/domains.js +122 -5
- package/dist/commands/feedback.js +1 -1
- package/dist/commands/feeds.js +34 -17
- package/dist/commands/mailboxes.js +19 -9
- package/dist/commands/publishing.js +1 -1
- package/dist/commands/senders.js +2 -2
- package/dist/commands/sequences.js +75 -12
- package/dist/commands/subscriptions.d.ts +10 -0
- package/dist/commands/subscriptions.js +203 -0
- package/dist/commands/tags.js +4 -4
- package/dist/customer-operation-commands.js +17 -0
- package/dist/mailbox-fleet-output.d.ts +3 -0
- package/dist/mailbox-fleet-output.js +80 -0
- package/dist/native-chat-host.d.ts +2 -0
- package/dist/native-chat-host.js +6 -0
- package/dist/workspace-placement-commands.js +67 -2
- package/node_modules/@oxygen/shared/dist/capability-discovery.d.ts +9 -0
- package/node_modules/@oxygen/shared/dist/capability-discovery.js +59 -11
- package/node_modules/@oxygen/shared/dist/contracts/browser-operations.js +2 -2
- package/node_modules/@oxygen/shared/dist/contracts/customer-operations.js +18 -0
- package/node_modules/@oxygen/shared/dist/contracts/guided-activation.js +4 -4
- package/node_modules/@oxygen/shared/dist/contracts/native-chat.d.ts +120 -0
- package/node_modules/@oxygen/shared/dist/contracts/native-chat.js +35 -0
- package/node_modules/@oxygen/shared/dist/contracts/sender-limits.d.ts +9 -0
- package/node_modules/@oxygen/shared/dist/contracts/sender-limits.js +6 -1
- package/node_modules/@oxygen/shared/dist/contracts/sequence-list.d.ts +5 -0
- package/node_modules/@oxygen/shared/dist/contracts/sequence-list.js +2 -1
- package/node_modules/@oxygen/shared/dist/contracts/signal-search-compatibility.d.ts +78 -0
- package/node_modules/@oxygen/shared/dist/contracts/signal-search-compatibility.js +32 -0
- package/node_modules/@oxygen/shared/dist/dnc-rules.js +14 -0
- package/node_modules/@oxygen/shared/dist/email-delivery.d.ts +150 -0
- package/node_modules/@oxygen/shared/dist/email-delivery.js +246 -0
- package/node_modules/@oxygen/shared/dist/email-dsn.d.ts +1 -0
- package/node_modules/@oxygen/shared/dist/email-dsn.js +9 -6
- package/node_modules/@oxygen/shared/dist/email-health-summary.d.ts +29 -0
- package/node_modules/@oxygen/shared/dist/email-health-summary.js +28 -0
- package/node_modules/@oxygen/shared/dist/email-subscriptions.d.ts +50 -0
- package/node_modules/@oxygen/shared/dist/email-subscriptions.js +80 -0
- package/node_modules/@oxygen/shared/dist/email-unsubscribe-token.d.ts +28 -0
- package/node_modules/@oxygen/shared/dist/email-unsubscribe-token.js +47 -0
- package/node_modules/@oxygen/shared/dist/error-redaction.d.ts +4 -16
- package/node_modules/@oxygen/shared/dist/error-redaction.js +8 -17
- package/node_modules/@oxygen/shared/dist/guided-activation.d.ts +15 -1
- package/node_modules/@oxygen/shared/dist/guided-activation.js +3 -1
- package/node_modules/@oxygen/shared/dist/linkedin-sequences.d.ts +2 -0
- package/node_modules/@oxygen/shared/dist/mailbox-standby-rollout.d.ts +5 -0
- package/node_modules/@oxygen/shared/dist/mailbox-standby-rollout.js +9 -0
- package/node_modules/@oxygen/shared/dist/mailbox-standby.d.ts +43 -0
- package/node_modules/@oxygen/shared/dist/mailbox-standby.js +52 -0
- package/node_modules/@oxygen/shared/dist/native-chat-discovery.d.ts +5 -0
- package/node_modules/@oxygen/shared/dist/native-chat-discovery.js +27 -0
- package/node_modules/@oxygen/shared/dist/native-chat.d.ts +124 -0
- package/node_modules/@oxygen/shared/dist/native-chat.js +1 -0
- package/node_modules/@oxygen/shared/dist/onboarding-plays.d.ts +14 -3
- package/node_modules/@oxygen/shared/dist/onboarding-plays.js +26 -13
- package/node_modules/@oxygen/shared/dist/onboarding-research.d.ts +11 -0
- package/node_modules/@oxygen/shared/dist/onboarding-research.js +8 -0
- package/node_modules/@oxygen/shared/dist/product-analytics-events.d.ts +6 -0
- package/node_modules/@oxygen/shared/dist/product-analytics-events.js +6 -0
- package/node_modules/@oxygen/shared/dist/select-options.js +1 -0
- package/node_modules/@oxygen/shared/dist/sequence-failures.js +6 -5
- package/node_modules/@oxygen/shared/dist/sequences.d.ts +8 -0
- package/node_modules/@oxygen/shared/dist/sequences.js +44 -2
- package/node_modules/@oxygen/shared/dist/tags.d.ts +7 -3
- package/node_modules/@oxygen/shared/dist/tags.js +31 -6
- 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-bulk.d.ts +80 -0
- package/node_modules/@oxygen/shared/dist/workspace-placement-bulk.js +68 -0
- package/node_modules/@oxygen/shared/dist/workspace-placement-view.d.ts +2 -1
- package/node_modules/@oxygen/shared/dist/workspace-placement.d.ts +11 -1
- package/node_modules/@oxygen/shared/dist/workspace-placement.js +15 -4
- package/node_modules/@oxygen/shared/dist/write-rollout.d.ts +11 -0
- package/node_modules/@oxygen/shared/dist/write-rollout.js +59 -0
- package/node_modules/@oxygen/workflows/dist/graph/manifest-schema.d.ts +176 -2
- package/node_modules/@oxygen/workflows/dist/graph/manifest-schema.js +50 -1
- package/node_modules/@oxygen/workflows/dist/index.js +108 -3
- package/package.json +1 -1
|
@@ -1114,7 +1114,11 @@ export function lintWorkflowCodeSourceSafety(source, path = "$.source") {
|
|
|
1114
1114
|
issues.push({ path, code: "empty_function_source", message: "Typed code source cannot be empty." });
|
|
1115
1115
|
return issues;
|
|
1116
1116
|
}
|
|
1117
|
-
const
|
|
1117
|
+
const scan = stripCommentsAndStrings(source);
|
|
1118
|
+
if (scan.ambiguousSlash) {
|
|
1119
|
+
return [{ path, code: "unsafe_code_source", message: "Typed code source has an ambiguous slash after a brace. Parenthesize the expression or separate statements with a semicolon." }];
|
|
1120
|
+
}
|
|
1121
|
+
const scannable = scan.source;
|
|
1118
1122
|
for (const entry of UNSAFE_WORKFLOW_CODE_SOURCE_PATTERNS) {
|
|
1119
1123
|
if (!entry.pattern.test(scannable))
|
|
1120
1124
|
continue;
|
|
@@ -1695,6 +1699,15 @@ export function validatePureFunctionSource(source, path, add) {
|
|
|
1695
1699
|
function stripCommentsAndStrings(source) {
|
|
1696
1700
|
const out = [];
|
|
1697
1701
|
const stack = [{ mode: "code", braces: 0 }];
|
|
1702
|
+
const expressionKeywords = new Set(["return", "throw", "case", "delete", "void", "typeof", "yield", "await", "in", "instanceof", "else", "do"]);
|
|
1703
|
+
const controlKeywords = new Set(["if", "while", "for", "with", "switch", "catch"]);
|
|
1704
|
+
const statementBlockKeywords = new Set(["else", "do", "try", "finally", "catch"]);
|
|
1705
|
+
const braceKinds = [];
|
|
1706
|
+
const controlParens = [];
|
|
1707
|
+
let regexAllowed = true;
|
|
1708
|
+
let ambiguousAfterBrace = false;
|
|
1709
|
+
let previousToken = "";
|
|
1710
|
+
let previousWordEnd = 0;
|
|
1698
1711
|
let i = 0;
|
|
1699
1712
|
const n = source.length;
|
|
1700
1713
|
while (i < n) {
|
|
@@ -1708,11 +1721,15 @@ function stripCommentsAndStrings(source) {
|
|
|
1708
1721
|
}
|
|
1709
1722
|
if (ch === "`") {
|
|
1710
1723
|
stack.pop();
|
|
1724
|
+
regexAllowed = false;
|
|
1725
|
+
previousToken = "literal";
|
|
1711
1726
|
i += 1;
|
|
1712
1727
|
continue;
|
|
1713
1728
|
}
|
|
1714
1729
|
if (ch === "$" && next === "{") {
|
|
1715
1730
|
stack.push({ mode: "code", braces: 0 });
|
|
1731
|
+
regexAllowed = true;
|
|
1732
|
+
previousToken = "";
|
|
1716
1733
|
out.push(" ");
|
|
1717
1734
|
i += 2;
|
|
1718
1735
|
continue;
|
|
@@ -1733,6 +1750,39 @@ function stripCommentsAndStrings(source) {
|
|
|
1733
1750
|
i = Math.min(i + 2, n);
|
|
1734
1751
|
continue;
|
|
1735
1752
|
}
|
|
1753
|
+
if (ch === "/" && ambiguousAfterBrace)
|
|
1754
|
+
return { source: out.join(""), ambiguousSlash: true };
|
|
1755
|
+
if (!/\s/.test(ch))
|
|
1756
|
+
ambiguousAfterBrace = false;
|
|
1757
|
+
// Regex quotes must not make the string scanner swallow executable code.
|
|
1758
|
+
if (ch === "/" && regexAllowed) {
|
|
1759
|
+
let end = i + 1;
|
|
1760
|
+
let characterClass = false;
|
|
1761
|
+
while (end < n && source[end] !== "\n" && source[end] !== "\r") {
|
|
1762
|
+
const current = source[end];
|
|
1763
|
+
if (current === "\\") {
|
|
1764
|
+
end += 2;
|
|
1765
|
+
continue;
|
|
1766
|
+
}
|
|
1767
|
+
if (current === "[")
|
|
1768
|
+
characterClass = true;
|
|
1769
|
+
else if (current === "]")
|
|
1770
|
+
characterClass = false;
|
|
1771
|
+
else if (current === "/" && !characterClass)
|
|
1772
|
+
break;
|
|
1773
|
+
end += 1;
|
|
1774
|
+
}
|
|
1775
|
+
if (end < n && source[end] === "/") {
|
|
1776
|
+
end += 1;
|
|
1777
|
+
while (end < n && /[a-z]/i.test(source[end]))
|
|
1778
|
+
end += 1;
|
|
1779
|
+
out.push('""');
|
|
1780
|
+
i = end;
|
|
1781
|
+
regexAllowed = false;
|
|
1782
|
+
previousToken = "literal";
|
|
1783
|
+
continue;
|
|
1784
|
+
}
|
|
1785
|
+
}
|
|
1736
1786
|
if (ch === '"' || ch === "'") {
|
|
1737
1787
|
const quote = ch;
|
|
1738
1788
|
i += 1;
|
|
@@ -1740,6 +1790,8 @@ function stripCommentsAndStrings(source) {
|
|
|
1740
1790
|
i += source[i] === "\\" ? 2 : 1;
|
|
1741
1791
|
i += 1;
|
|
1742
1792
|
out.push('""');
|
|
1793
|
+
regexAllowed = false;
|
|
1794
|
+
previousToken = "literal";
|
|
1743
1795
|
continue;
|
|
1744
1796
|
}
|
|
1745
1797
|
if (ch === "`") {
|
|
@@ -1747,12 +1799,60 @@ function stripCommentsAndStrings(source) {
|
|
|
1747
1799
|
i += 1;
|
|
1748
1800
|
continue;
|
|
1749
1801
|
}
|
|
1802
|
+
if (/[a-z_$]/i.test(ch)) {
|
|
1803
|
+
const start = i;
|
|
1804
|
+
while (i < n && /[\w$]/.test(source[i]))
|
|
1805
|
+
i += 1;
|
|
1806
|
+
const word = source.slice(start, i);
|
|
1807
|
+
out.push(word);
|
|
1808
|
+
previousToken = previousToken === "." ? "identifier" : word;
|
|
1809
|
+
previousWordEnd = i;
|
|
1810
|
+
regexAllowed = expressionKeywords.has(previousToken);
|
|
1811
|
+
continue;
|
|
1812
|
+
}
|
|
1750
1813
|
if (ch === "}" && top.braces === 0 && stack.length > 1) {
|
|
1751
1814
|
stack.pop();
|
|
1752
1815
|
out.push(" ");
|
|
1753
1816
|
i += 1;
|
|
1754
1817
|
continue;
|
|
1755
1818
|
}
|
|
1819
|
+
if (ch === "=" && next === ">") {
|
|
1820
|
+
out.push("=>");
|
|
1821
|
+
previousToken = "=>";
|
|
1822
|
+
regexAllowed = true;
|
|
1823
|
+
i += 2;
|
|
1824
|
+
continue;
|
|
1825
|
+
}
|
|
1826
|
+
if (ch === "{") {
|
|
1827
|
+
const enclosing = braceKinds[braceKinds.length - 1];
|
|
1828
|
+
let kind = "unknown";
|
|
1829
|
+
if ((previousToken === ")" && regexAllowed) || statementBlockKeywords.has(previousToken)
|
|
1830
|
+
|| previousToken === ";" || (previousToken === "{" && (enclosing === "statement" || enclosing === "function")))
|
|
1831
|
+
kind = "statement";
|
|
1832
|
+
else if (previousToken === "=>")
|
|
1833
|
+
kind = "function";
|
|
1834
|
+
else if (["=", "(", "[", ","].includes(previousToken) || (previousToken === ":" && enclosing === "object")
|
|
1835
|
+
|| (previousToken === "return" && !/[\r\n]/.test(source.slice(previousWordEnd, i))))
|
|
1836
|
+
kind = "object";
|
|
1837
|
+
braceKinds.push(kind);
|
|
1838
|
+
}
|
|
1839
|
+
if (ch === "(")
|
|
1840
|
+
controlParens.push(controlKeywords.has(previousToken));
|
|
1841
|
+
if (ch === ")")
|
|
1842
|
+
regexAllowed = controlParens.pop() ?? false;
|
|
1843
|
+
else if (ch === "}") {
|
|
1844
|
+
const kind = braceKinds.pop();
|
|
1845
|
+
regexAllowed = kind === "statement";
|
|
1846
|
+
// Other brace forms need a parser to distinguish declarations from expressions.
|
|
1847
|
+
ambiguousAfterBrace = kind === "unknown";
|
|
1848
|
+
}
|
|
1849
|
+
else if (!/\s/.test(ch)) {
|
|
1850
|
+
if (!((ch === "+" || ch === "-") && (next === ch || previousToken === ch))) {
|
|
1851
|
+
regexAllowed = /[([{,:;=!?&|+*%^~<>\/-]/.test(ch);
|
|
1852
|
+
}
|
|
1853
|
+
}
|
|
1854
|
+
if (!/\s/.test(ch))
|
|
1855
|
+
previousToken = ch;
|
|
1756
1856
|
if (ch === "{")
|
|
1757
1857
|
top.braces += 1;
|
|
1758
1858
|
else if (ch === "}")
|
|
@@ -1760,7 +1860,7 @@ function stripCommentsAndStrings(source) {
|
|
|
1760
1860
|
out.push(ch);
|
|
1761
1861
|
i += 1;
|
|
1762
1862
|
}
|
|
1763
|
-
return out.join("");
|
|
1863
|
+
return { source: out.join(""), ambiguousSlash: false };
|
|
1764
1864
|
}
|
|
1765
1865
|
function validateRecipeBundleSafety(source, path, add) {
|
|
1766
1866
|
if (!source.trim()) {
|
|
@@ -1770,7 +1870,12 @@ function validateRecipeBundleSafety(source, path, add) {
|
|
|
1770
1870
|
// Scan only real code: comments and string literals are blanked first so a
|
|
1771
1871
|
// token that merely appears in prose or data (e.g. "eval" in a comment) does
|
|
1772
1872
|
// not trip the lint, while genuine calls survive.
|
|
1773
|
-
const
|
|
1873
|
+
const scan = stripCommentsAndStrings(source);
|
|
1874
|
+
if (scan.ambiguousSlash) {
|
|
1875
|
+
add(path, "unsafe_recipe_bundle", "Durable recipe bundle has an ambiguous slash after a brace. Parenthesize the expression or separate statements with a semicolon.");
|
|
1876
|
+
return;
|
|
1877
|
+
}
|
|
1878
|
+
const scannable = scan.source;
|
|
1774
1879
|
for (const entry of UNSAFE_RECIPE_BUNDLE_PATTERNS) {
|
|
1775
1880
|
if (entry.pattern.test(scannable)) {
|
|
1776
1881
|
add(path, "unsafe_recipe_bundle", `Durable recipe bundle cannot reference '${entry.token}'. Use ctx.tools.run(), ctx.step(), ctx.now(), or ctx.uuid() instead.`);
|