@otto-code/protocol 0.5.0

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.
Files changed (102) hide show
  1. package/README.md +12 -0
  2. package/dist/agent-attention-notification.d.ts +41 -0
  3. package/dist/agent-attention-notification.js +140 -0
  4. package/dist/agent-labels.d.ts +7 -0
  5. package/dist/agent-labels.js +11 -0
  6. package/dist/agent-lifecycle.d.ts +3 -0
  7. package/dist/agent-lifecycle.js +8 -0
  8. package/dist/agent-personalities.d.ts +32 -0
  9. package/dist/agent-personalities.js +69 -0
  10. package/dist/agent-state-bucket.d.ts +14 -0
  11. package/dist/agent-state-bucket.js +41 -0
  12. package/dist/agent-title-limits.d.ts +2 -0
  13. package/dist/agent-title-limits.js +2 -0
  14. package/dist/agent-types.d.ts +479 -0
  15. package/dist/agent-types.js +22 -0
  16. package/dist/artifacts/rpc-schemas.d.ts +396 -0
  17. package/dist/artifacts/rpc-schemas.js +175 -0
  18. package/dist/artifacts/types.d.ts +166 -0
  19. package/dist/artifacts/types.js +73 -0
  20. package/dist/binary-frames/demux.d.ts +11 -0
  21. package/dist/binary-frames/demux.js +23 -0
  22. package/dist/binary-frames/file-transfer.d.ts +50 -0
  23. package/dist/binary-frames/file-transfer.js +107 -0
  24. package/dist/binary-frames/index.d.ts +4 -0
  25. package/dist/binary-frames/index.js +4 -0
  26. package/dist/binary-frames/terminal.d.ts +31 -0
  27. package/dist/binary-frames/terminal.js +99 -0
  28. package/dist/branch-slug.d.ts +14 -0
  29. package/dist/branch-slug.js +49 -0
  30. package/dist/browser-automation/capabilities.d.ts +7 -0
  31. package/dist/browser-automation/capabilities.js +31 -0
  32. package/dist/browser-automation/rpc-schemas.d.ts +1329 -0
  33. package/dist/browser-automation/rpc-schemas.js +555 -0
  34. package/dist/chat/rpc-schemas.d.ts +158 -0
  35. package/dist/chat/rpc-schemas.js +103 -0
  36. package/dist/chat/types.d.ts +30 -0
  37. package/dist/chat/types.js +22 -0
  38. package/dist/client-capabilities.d.ts +8 -0
  39. package/dist/client-capabilities.js +16 -0
  40. package/dist/connection-offer.d.ts +36 -0
  41. package/dist/connection-offer.js +53 -0
  42. package/dist/daemon-endpoints.d.ts +47 -0
  43. package/dist/daemon-endpoints.js +201 -0
  44. package/dist/default-personalities.d.ts +3 -0
  45. package/dist/default-personalities.js +127 -0
  46. package/dist/effort.d.ts +32 -0
  47. package/dist/effort.js +99 -0
  48. package/dist/error-utils.d.ts +11 -0
  49. package/dist/error-utils.js +27 -0
  50. package/dist/generated/validation/ws-outbound.aot.d.ts +2 -0
  51. package/dist/generated/validation/ws-outbound.aot.js +48755 -0
  52. package/dist/git-hosting.d.ts +21 -0
  53. package/dist/git-hosting.js +36 -0
  54. package/dist/git-remote.d.ts +18 -0
  55. package/dist/git-remote.js +84 -0
  56. package/dist/host-connection-schema.d.ts +11 -0
  57. package/dist/host-connection-schema.js +9 -0
  58. package/dist/literal-union.d.ts +2 -0
  59. package/dist/literal-union.js +2 -0
  60. package/dist/loop/rpc-schemas.d.ts +636 -0
  61. package/dist/loop/rpc-schemas.js +163 -0
  62. package/dist/messages.d.ts +38505 -0
  63. package/dist/messages.js +4719 -0
  64. package/dist/otto-config-schema.d.ts +136 -0
  65. package/dist/otto-config-schema.js +96 -0
  66. package/dist/path-utils.d.ts +2 -0
  67. package/dist/path-utils.js +16 -0
  68. package/dist/provider-config.d.ts +266 -0
  69. package/dist/provider-config.js +238 -0
  70. package/dist/provider-icon-names.d.ts +5 -0
  71. package/dist/provider-icon-names.js +52 -0
  72. package/dist/provider-manifest.d.ts +34 -0
  73. package/dist/provider-manifest.js +227 -0
  74. package/dist/schedule/cron-expression.d.ts +13 -0
  75. package/dist/schedule/cron-expression.js +97 -0
  76. package/dist/schedule/rpc-schemas.d.ts +667 -0
  77. package/dist/schedule/rpc-schemas.js +155 -0
  78. package/dist/schedule/types.d.ts +236 -0
  79. package/dist/schedule/types.js +84 -0
  80. package/dist/terminal-activity.d.ts +21 -0
  81. package/dist/terminal-activity.js +25 -0
  82. package/dist/terminal-input-mode.d.ts +26 -0
  83. package/dist/terminal-input-mode.js +151 -0
  84. package/dist/terminal-key-input.d.ts +13 -0
  85. package/dist/terminal-key-input.js +201 -0
  86. package/dist/terminal-profiles.d.ts +6 -0
  87. package/dist/terminal-profiles.js +28 -0
  88. package/dist/terminal-snapshot.d.ts +3 -0
  89. package/dist/terminal-snapshot.js +178 -0
  90. package/dist/terminal-stream-protocol.d.ts +2 -0
  91. package/dist/terminal-stream-protocol.js +2 -0
  92. package/dist/terminal-subscription-key.d.ts +2 -0
  93. package/dist/terminal-subscription-key.js +9 -0
  94. package/dist/tool-call-display.d.ts +11 -0
  95. package/dist/tool-call-display.js +135 -0
  96. package/dist/tool-name-normalization.d.ts +9 -0
  97. package/dist/tool-name-normalization.js +82 -0
  98. package/dist/validation/ws-outbound-schema-metadata.d.ts +7256 -0
  99. package/dist/validation/ws-outbound-schema-metadata.js +3 -0
  100. package/dist/validation/ws-outbound.d.ts +12 -0
  101. package/dist/validation/ws-outbound.js +8 -0
  102. package/package.json +42 -0
@@ -0,0 +1,135 @@
1
+ import { getOttoToolLeafName, isOttoToolName } from "./tool-name-normalization.js";
2
+ import { stripCwdPrefix } from "./path-utils.js";
3
+ function isRecord(value) {
4
+ return typeof value === "object" && value !== null && !Array.isArray(value);
5
+ }
6
+ function readString(value) {
7
+ return typeof value === "string" && value.length > 0 ? value : undefined;
8
+ }
9
+ function humanizeToolName(name) {
10
+ const trimmed = name.trim();
11
+ if (!trimmed) {
12
+ return name;
13
+ }
14
+ if (isOttoToolName(trimmed)) {
15
+ const leaf = getOttoToolLeafName(trimmed);
16
+ if (leaf) {
17
+ return humanizeToolName(leaf);
18
+ }
19
+ }
20
+ if (/[:./]/.test(trimmed) || trimmed.includes("__")) {
21
+ return trimmed;
22
+ }
23
+ return trimmed
24
+ .replace(/[._-]+/g, " ")
25
+ .split(" ")
26
+ .filter((segment) => segment.length > 0)
27
+ .map((segment) => `${segment[0]?.toUpperCase() ?? ""}${segment.slice(1)}`)
28
+ .join(" ");
29
+ }
30
+ function formatErrorText(error) {
31
+ if (error === null || error === undefined) {
32
+ return undefined;
33
+ }
34
+ if (typeof error === "string") {
35
+ return error;
36
+ }
37
+ if (isRecord(error) && typeof error.content === "string") {
38
+ return error.content;
39
+ }
40
+ try {
41
+ return JSON.stringify(error, null, 2);
42
+ }
43
+ catch {
44
+ return String(error);
45
+ }
46
+ }
47
+ function buildFilePathDisplay(displayName, filePath, cwd) {
48
+ return {
49
+ displayName,
50
+ summary: stripCwdPrefix(filePath, cwd),
51
+ };
52
+ }
53
+ function buildCanonicalDetailDisplay(input) {
54
+ switch (input.detail.type) {
55
+ case "shell":
56
+ return {
57
+ displayName: "Shell",
58
+ summary: input.detail.command,
59
+ };
60
+ case "read":
61
+ return buildFilePathDisplay("Read", input.detail.filePath, input.cwd);
62
+ case "edit":
63
+ return buildFilePathDisplay("Edit", input.detail.filePath, input.cwd);
64
+ case "write":
65
+ return buildFilePathDisplay("Write", input.detail.filePath, input.cwd);
66
+ case "search":
67
+ return {
68
+ displayName: "Search",
69
+ summary: input.detail.query,
70
+ };
71
+ case "fetch":
72
+ return {
73
+ displayName: "Fetch",
74
+ summary: input.detail.url,
75
+ };
76
+ case "worktree_setup":
77
+ return {
78
+ displayName: "Worktree Setup",
79
+ summary: input.detail.branchName,
80
+ };
81
+ case "sub_agent":
82
+ return {
83
+ displayName: readString(input.detail.subAgentType) ?? "Task",
84
+ summary: readString(input.detail.description),
85
+ };
86
+ case "plain_text":
87
+ return {
88
+ summary: input.detail.label,
89
+ };
90
+ case "plan":
91
+ return {
92
+ displayName: "Plan",
93
+ };
94
+ case "unknown":
95
+ return {};
96
+ default:
97
+ throw new Error("unreachable");
98
+ }
99
+ }
100
+ function buildUnknownDetailOverride(input) {
101
+ const lowerName = input.name.trim().toLowerCase();
102
+ if (input.detail.type === "unknown" && lowerName === "task") {
103
+ return {
104
+ displayName: "Task",
105
+ summary: isRecord(input.metadata) ? readString(input.metadata.subAgentActivity) : undefined,
106
+ };
107
+ }
108
+ if (input.detail.type === "unknown" && lowerName === "thinking") {
109
+ return {
110
+ displayName: "Thinking",
111
+ };
112
+ }
113
+ if (lowerName === "terminal") {
114
+ return {
115
+ displayName: "Terminal",
116
+ summary: input.detail.type === "plain_text" ? readString(input.detail.label) : undefined,
117
+ };
118
+ }
119
+ return {};
120
+ }
121
+ export function buildToolCallDisplayModel(input) {
122
+ const canonicalDisplay = buildCanonicalDetailDisplay(input);
123
+ const unknownDetailOverride = buildUnknownDetailOverride(input);
124
+ const displayName = unknownDetailOverride.displayName ??
125
+ canonicalDisplay.displayName ??
126
+ humanizeToolName(input.name);
127
+ const summary = unknownDetailOverride.summary ?? canonicalDisplay.summary;
128
+ const errorText = input.status === "failed" ? formatErrorText(input.error) : undefined;
129
+ return {
130
+ displayName,
131
+ ...(summary ? { summary } : {}),
132
+ ...(errorText ? { errorText } : {}),
133
+ };
134
+ }
135
+ //# sourceMappingURL=tool-call-display.js.map
@@ -0,0 +1,9 @@
1
+ export declare function normalizeToolName(name: string): string;
2
+ export declare function tokenizeToolName(name: string): string[];
3
+ export declare function getToolLeafName(name: string): string | null;
4
+ export declare function isSpeakToolName(name: string): boolean;
5
+ export declare function isLikelyNamespacedToolName(name: string): boolean;
6
+ export declare function isOttoToolName(name: string): boolean;
7
+ export declare function getOttoToolLeafName(name: string): string | null;
8
+ export declare function isLikelyExternalToolName(name: string): boolean;
9
+ //# sourceMappingURL=tool-name-normalization.d.ts.map
@@ -0,0 +1,82 @@
1
+ const TOOL_TOKEN_REGEX = /[a-z0-9]+/g;
2
+ const STANDARD_NAMESPACE_SEPARATOR_REGEX = /[.:/]/;
3
+ export function normalizeToolName(name) {
4
+ return name.trim().toLowerCase();
5
+ }
6
+ export function tokenizeToolName(name) {
7
+ const normalized = normalizeToolName(name);
8
+ return normalized.match(TOOL_TOKEN_REGEX) ?? [];
9
+ }
10
+ export function getToolLeafName(name) {
11
+ const tokens = tokenizeToolName(name);
12
+ return tokens.length > 0 ? tokens[tokens.length - 1] : null;
13
+ }
14
+ export function isSpeakToolName(name) {
15
+ return getToolLeafName(name) === "speak";
16
+ }
17
+ export function isLikelyNamespacedToolName(name) {
18
+ const normalized = normalizeToolName(name);
19
+ if (STANDARD_NAMESPACE_SEPARATOR_REGEX.test(normalized)) {
20
+ return true;
21
+ }
22
+ if (!normalized.includes("__")) {
23
+ return false;
24
+ }
25
+ // Keep `__` handling strict to avoid false positives on arbitrary custom names.
26
+ const segments = normalized.split("__").filter((segment) => segment.length > 0);
27
+ if (segments.length >= 3) {
28
+ return true;
29
+ }
30
+ if (segments.length === 2 && segments[1].includes("_")) {
31
+ return true;
32
+ }
33
+ return false;
34
+ }
35
+ export function isOttoToolName(name) {
36
+ const normalized = normalizeToolName(name);
37
+ if (isSpeakToolName(normalized)) {
38
+ return false;
39
+ }
40
+ if (normalized.includes("__")) {
41
+ const segments = normalized.split("__").filter((s) => s.length > 0);
42
+ return (segments.length >= 3 &&
43
+ segments[0] === "mcp" &&
44
+ (segments[1] === "otto" || segments[1].startsWith("otto_")));
45
+ }
46
+ if (normalized.includes(".")) {
47
+ const firstSegment = normalized.split(".")[0];
48
+ return firstSegment === "otto" || firstSegment.startsWith("otto_");
49
+ }
50
+ return false;
51
+ }
52
+ export function getOttoToolLeafName(name) {
53
+ const normalized = normalizeToolName(name);
54
+ if (normalized.includes("__")) {
55
+ const segments = normalized.split("__").filter((s) => s.length > 0);
56
+ if (segments.length >= 3 &&
57
+ segments[0] === "mcp" &&
58
+ (segments[1] === "otto" || segments[1].startsWith("otto_"))) {
59
+ return segments.slice(2).join("__");
60
+ }
61
+ return null;
62
+ }
63
+ if (normalized.includes(".")) {
64
+ const firstSegment = normalized.split(".")[0];
65
+ if (firstSegment === "otto" || firstSegment.startsWith("otto_")) {
66
+ return normalized.split(".").slice(1).join(".");
67
+ }
68
+ return null;
69
+ }
70
+ return null;
71
+ }
72
+ export function isLikelyExternalToolName(name) {
73
+ const normalized = normalizeToolName(name);
74
+ if (!normalized) {
75
+ return false;
76
+ }
77
+ if (isSpeakToolName(normalized)) {
78
+ return true;
79
+ }
80
+ return isLikelyNamespacedToolName(normalized);
81
+ }
82
+ //# sourceMappingURL=tool-name-normalization.js.map