@opengeni/contracts 1.0.1 → 2.2.0-canary.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 (112) hide show
  1. package/dist/agent-authored-durable-text.d.ts +64 -0
  2. package/dist/atlassian.d.ts +1 -0
  3. package/dist/atlassian.js +14 -13
  4. package/dist/{chunk-Y3MLSLB4.js → chunk-3SIZGL3O.js} +42 -30
  5. package/dist/chunk-3SIZGL3O.js.map +1 -0
  6. package/dist/{chunk-JBCIY7QD.js → chunk-7RMTKFJW.js} +45 -22
  7. package/dist/chunk-7RMTKFJW.js.map +1 -0
  8. package/dist/{chunk-NX5JNF4L.js → chunk-7ZZ3R27P.js} +9322 -5798
  9. package/dist/chunk-7ZZ3R27P.js.map +1 -0
  10. package/dist/{chunk-5UDNP7AO.js → chunk-MRWYRAS5.js} +56 -8
  11. package/dist/chunk-MRWYRAS5.js.map +1 -0
  12. package/dist/{chunk-LW7OH6CS.js → chunk-N6GRVXAJ.js} +6 -5
  13. package/dist/chunk-N6GRVXAJ.js.map +1 -0
  14. package/dist/{chunk-TZ6YEYN4.js → chunk-NVJMJWLL.js} +3 -1
  15. package/dist/chunk-NVJMJWLL.js.map +1 -0
  16. package/dist/chunk-PX3VCKAU.js +29 -0
  17. package/dist/chunk-PX3VCKAU.js.map +1 -0
  18. package/dist/{chunk-LSB7GRLG.js → chunk-TXTQIYCV.js} +15 -11
  19. package/dist/chunk-TXTQIYCV.js.map +1 -0
  20. package/dist/{chunk-CADSX6UN.js → chunk-Y3KNXVTD.js} +2 -2
  21. package/dist/chunk-YBW5JSA3.js +251 -0
  22. package/dist/chunk-YBW5JSA3.js.map +1 -0
  23. package/dist/company-brain-governed-writes.d.ts +475 -0
  24. package/dist/company-brain.d.ts +398 -0
  25. package/dist/company-profile.d.ts +268 -0
  26. package/dist/connection-authority.d.ts +501 -0
  27. package/dist/connection-authority.js +364 -0
  28. package/dist/connection-authority.js.map +1 -0
  29. package/dist/connector-attachments.d.ts +95 -0
  30. package/dist/connector-attachments.js +51 -0
  31. package/dist/connector-attachments.js.map +1 -0
  32. package/dist/editable-artifact-codec-registry.d.ts +16 -7
  33. package/dist/editable-artifact-codec-registry.js +18 -8
  34. package/dist/editable-artifact-committed-transaction.d.ts +2 -2
  35. package/dist/editable-artifact-committed-transaction.js +2 -2
  36. package/dist/editable-artifact-live.d.ts +11 -12
  37. package/dist/editable-artifact-live.js +111 -46
  38. package/dist/editable-artifact-live.js.map +1 -1
  39. package/dist/editable-artifact-serialized-commit.d.ts +2 -1
  40. package/dist/editable-artifact-serialized-commit.js +9 -8
  41. package/dist/editable-artifact-versions.d.ts +20 -5
  42. package/dist/editable-artifact-versions.js +23 -5
  43. package/dist/editable-artifacts.d.ts +2 -0
  44. package/dist/editable-artifacts.js +51 -39
  45. package/dist/google-drive.d.ts +1 -0
  46. package/dist/google-drive.js +14 -13
  47. package/dist/google-drive.js.map +1 -1
  48. package/dist/governed-learning-activation.d.ts +154 -0
  49. package/dist/governed-learning-evaluator.d.ts +152 -0
  50. package/dist/index.d.ts +12224 -1328
  51. package/dist/index.js +831 -115
  52. package/dist/interaction.d.ts +68 -0
  53. package/dist/knowledge.d.ts +119 -0
  54. package/dist/organization-membership-lifecycle.d.ts +516 -0
  55. package/dist/permissions.d.ts +52 -0
  56. package/dist/personal-github.d.ts +319 -0
  57. package/dist/personal-github.js +209 -0
  58. package/dist/personal-github.js.map +1 -0
  59. package/dist/preference-registry.d.ts +17 -0
  60. package/dist/remember.d.ts +331 -0
  61. package/dist/sandbox-file-artifacts.d.ts +56 -0
  62. package/dist/sandbox-snapshots.d.ts +21 -0
  63. package/dist/slack-bot-scopes.d.ts +34 -14
  64. package/dist/slack-bot-scopes.js +5 -1
  65. package/dist/spreadsheet-artifact-commands.d.ts +2 -3
  66. package/dist/spreadsheet-artifact-commands.js +4 -2
  67. package/dist/spreadsheet-artifact-query.js +3 -2
  68. package/dist/task-notes.d.ts +42 -1
  69. package/dist/tool-result-spill.d.ts +16 -0
  70. package/dist/workspace-instruction-policies.d.ts +81 -0
  71. package/dist/workspace-learning-administration.d.ts +289 -0
  72. package/package.json +13 -1
  73. package/src/agent-authored-durable-text.ts +105 -0
  74. package/src/company-brain-governed-writes.ts +356 -0
  75. package/src/company-brain.ts +201 -0
  76. package/src/company-profile.ts +122 -1
  77. package/src/connection-authority.ts +413 -0
  78. package/src/connector-attachments.ts +327 -0
  79. package/src/editable-artifact-codec-registry.ts +55 -17
  80. package/src/editable-artifact-committed-transaction.ts +44 -31
  81. package/src/editable-artifact-live.ts +123 -57
  82. package/src/editable-artifact-serialized-commit.ts +2 -1
  83. package/src/editable-artifact-versions.ts +26 -5
  84. package/src/editable-artifacts.ts +2 -0
  85. package/src/governed-learning-activation.ts +191 -0
  86. package/src/governed-learning-evaluator.ts +176 -0
  87. package/src/index.ts +3033 -392
  88. package/src/interaction.ts +55 -1
  89. package/src/knowledge.ts +118 -6
  90. package/src/organization-membership-lifecycle.ts +330 -0
  91. package/src/permissions.ts +55 -0
  92. package/src/personal-github.ts +267 -0
  93. package/src/preference-registry.ts +17 -0
  94. package/src/remember.ts +242 -0
  95. package/src/sandbox-file-artifacts.ts +65 -0
  96. package/src/sandbox-snapshots.ts +78 -0
  97. package/src/slack-bot-scopes.ts +81 -9
  98. package/src/spreadsheet-artifact-commands.ts +12 -13
  99. package/src/task-notes.ts +14 -1
  100. package/src/tool-result-spill.ts +35 -0
  101. package/src/workspace-instruction-policies.ts +30 -0
  102. package/src/workspace-learning-administration.ts +88 -0
  103. package/dist/chunk-5UDNP7AO.js.map +0 -1
  104. package/dist/chunk-BVGIYW7D.js +0 -11
  105. package/dist/chunk-BVGIYW7D.js.map +0 -1
  106. package/dist/chunk-JBCIY7QD.js.map +0 -1
  107. package/dist/chunk-LSB7GRLG.js.map +0 -1
  108. package/dist/chunk-LW7OH6CS.js.map +0 -1
  109. package/dist/chunk-NX5JNF4L.js.map +0 -1
  110. package/dist/chunk-TZ6YEYN4.js.map +0 -1
  111. package/dist/chunk-Y3MLSLB4.js.map +0 -1
  112. /package/dist/{chunk-CADSX6UN.js.map → chunk-Y3KNXVTD.js.map} +0 -0
@@ -19,20 +19,35 @@ export const OPENGENI_SLACK_BOT_REQUIRED_SCOPES = [
19
19
  /** Read-only scope needed only for the optional emoji-reaction summon surface. */
20
20
  export const OPENGENI_SLACK_REACTION_REQUIRED_SCOPE = "reactions:read" as const;
21
21
 
22
+ /**
23
+ * Bot-token search scopes for Slack's Real-time Search API
24
+ * (`assistant.search.context`). Slack accepts these as BOT scopes, so
25
+ * workspace-wide public search runs under the bot identity and never needs a
26
+ * human proxy token. Private-channel, DM, and MPIM search remain user-token
27
+ * only and belong exclusively to the personal hosted-MCP grant.
28
+ */
29
+ export const OPENGENI_SLACK_BOT_SEARCH_SCOPES = [
30
+ "search:read.public",
31
+ "search:read.files",
32
+ "search:read.users",
33
+ ] as const;
34
+
22
35
  /**
23
36
  * Scopes requested by the managed and generated self-hosted manifests.
24
37
  *
25
- * `reactions:read` is deliberately not part of the base eligibility contract:
26
- * legacy installations may continue using existing Slack interactions and
27
- * tools while the reaction setting stays disabled and the UI asks an admin to
28
- * reinstall.
38
+ * `reactions:read` and the bot search scopes are deliberately not part of the
39
+ * base eligibility contract: legacy installations may continue using existing
40
+ * Slack interactions and tools while the reaction setting stays disabled, bot
41
+ * search stays unavailable, and the UI asks an admin to reinstall.
29
42
  */
30
43
  export const OPENGENI_SLACK_BOT_REQUESTED_SCOPES = [
31
44
  ...OPENGENI_SLACK_BOT_REQUIRED_SCOPES,
32
45
  OPENGENI_SLACK_REACTION_REQUIRED_SCOPE,
46
+ ...OPENGENI_SLACK_BOT_SEARCH_SCOPES,
33
47
  ] as const;
34
48
 
35
49
  export const OPENGENI_SLACK_BOT_EVENTS = [
50
+ "app_home_opened",
36
51
  "app_mention",
37
52
  "message.channels",
38
53
  "message.groups",
@@ -72,6 +87,36 @@ export const OPENGENI_SLACK_MCP_USER_SCOPES = [
72
87
 
73
88
  export const OPENGENI_MANAGED_PUBLIC_BASE_URL = "https://app.opengeni.ai" as const;
74
89
 
90
+ export type OpenGeniSlackBotManifestOptions = Readonly<{
91
+ appName?: string;
92
+ botDisplayName?: string;
93
+ slashCommand?: string;
94
+ shortcutName?: string;
95
+ }>;
96
+
97
+ function normalizedSlackManifestText(
98
+ value: string | undefined,
99
+ fallback: string,
100
+ label: string,
101
+ maxLength: number,
102
+ ): string {
103
+ const normalized = value?.trim() || fallback;
104
+ if (normalized.length > maxLength || /[\r\n\0]/u.test(normalized)) {
105
+ throw new Error(`Slack bot manifest ${label} must be at most ${maxLength} plain characters`);
106
+ }
107
+ return normalized;
108
+ }
109
+
110
+ function normalizedSlackCommand(value: string | undefined): string {
111
+ const command = value?.trim() || "/opengeni";
112
+ if (!/^\/[a-z0-9_-]{1,31}$/u.test(command)) {
113
+ throw new Error(
114
+ "Slack bot manifest slash command must start with / and contain at most 31 lowercase letters, digits, hyphens, or underscores",
115
+ );
116
+ }
117
+ return command;
118
+ }
119
+
75
120
  function normalizedSlackManifestBaseUrl(publicBaseUrl: string): string {
76
121
  const parsed = new URL(publicBaseUrl);
77
122
  if (parsed.protocol !== "https:" || parsed.username || parsed.password) {
@@ -84,15 +129,37 @@ function normalizedSlackManifestBaseUrl(publicBaseUrl: string): string {
84
129
  }
85
130
 
86
131
  /** Canonical managed/self-hosted Slack app manifest. Slack accepts JSON manifests. */
87
- export function buildOpenGeniSlackBotManifest(publicBaseUrl: string) {
132
+ export function buildOpenGeniSlackBotManifest(
133
+ publicBaseUrl: string,
134
+ options: OpenGeniSlackBotManifestOptions = {},
135
+ ) {
88
136
  const baseUrl = normalizedSlackManifestBaseUrl(publicBaseUrl);
137
+ const appName = normalizedSlackManifestText(options.appName, "OpenGeni", "app name", 35);
138
+ const botDisplayName = normalizedSlackManifestText(
139
+ options.botDisplayName,
140
+ "OpenGeni",
141
+ "bot display name",
142
+ 80,
143
+ );
144
+ const slashCommand = normalizedSlackCommand(options.slashCommand);
145
+ const shortcutName = normalizedSlackManifestText(
146
+ options.shortcutName,
147
+ "Open in OpenGeni",
148
+ "shortcut name",
149
+ 35,
150
+ );
89
151
  return {
90
- display_information: { name: "OpenGeni" },
152
+ display_information: { name: appName },
91
153
  features: {
92
- bot_user: { display_name: "OpenGeni", always_online: false },
154
+ app_home: {
155
+ home_tab_enabled: true,
156
+ messages_tab_enabled: true,
157
+ messages_tab_read_only_enabled: false,
158
+ },
159
+ bot_user: { display_name: botDisplayName, always_online: false },
93
160
  slash_commands: [
94
161
  {
95
- command: "/opengeni",
162
+ command: slashCommand,
96
163
  description: "Start an OpenGeni task in this channel",
97
164
  should_escape: false,
98
165
  url: `${baseUrl}/v1/integrations/slack/commands`,
@@ -102,7 +169,7 @@ export function buildOpenGeniSlackBotManifest(publicBaseUrl: string) {
102
169
  {
103
170
  callback_id: "opengeni_message",
104
171
  description: "Start an OpenGeni task from this Slack message",
105
- name: "Open in OpenGeni",
172
+ name: shortcutName,
106
173
  type: "message",
107
174
  },
108
175
  ],
@@ -142,8 +209,13 @@ export function buildOpenGeniSlackBotManifest(publicBaseUrl: string) {
142
209
  export const OPENGENI_SLACK_BOT_SAFE_OPTIONAL_SCOPES = [
143
210
  "team:read",
144
211
  OPENGENI_SLACK_REACTION_REQUIRED_SCOPE,
212
+ ...OPENGENI_SLACK_BOT_SEARCH_SCOPES,
145
213
  ] as const;
146
214
 
215
+ export function hasOpenGeniSlackBotSearchScopes(grantedScopes: readonly string[]): boolean {
216
+ return OPENGENI_SLACK_BOT_SEARCH_SCOPES.every((scope) => grantedScopes.includes(scope));
217
+ }
218
+
147
219
  /** @deprecated Use evaluateOpenGeniSlackBotScopes; an allowlist is the policy. */
148
220
  export const OPENGENI_SLACK_BOT_FORBIDDEN_SCOPES = ["channels:join", "chat:write.public"] as const;
149
221
 
@@ -2,6 +2,7 @@ import {
2
2
  canonicalSpreadsheetDateFromMilliseconds,
3
3
  canonicalSpreadsheetDateMilliseconds,
4
4
  } from "./spreadsheet-artifact-date";
5
+ import { SPREADSHEET_ARTIFACT_COMMAND_VERSION } from "./editable-artifact-versions";
5
6
 
6
7
  /**
7
8
  * Canonical, identity-free spreadsheet mutation commands nested inside
@@ -10,14 +11,14 @@ import {
10
11
  * authority.
11
12
  */
12
13
 
13
- export const SPREADSHEET_ARTIFACT_COMMAND_VERSION = 1 as const;
14
+ export { SPREADSHEET_ARTIFACT_COMMAND_VERSION } from "./editable-artifact-versions";
14
15
  export const SPREADSHEET_ARTIFACT_COMMAND_MAX_BYTES = 4 * 1024 * 1024;
15
16
  export const SPREADSHEET_ARTIFACT_COMMAND_MAX_COMMANDS = 4_096;
16
17
  export const SPREADSHEET_ARTIFACT_COMMAND_MAX_CELLS = 1_000_000;
17
18
  export const SPREADSHEET_ARTIFACT_COMMAND_MAX_STRING_BYTES = 1 * 1024 * 1024;
18
19
  export const SPREADSHEET_ARTIFACT_SHEET_NAME_MAX_UTF16_UNITS = 31;
19
20
 
20
- const MAGIC = new TextEncoder().encode("OGASC001");
21
+ const MAGIC = new TextEncoder().encode("OGASC002");
21
22
  const HEADER_BYTES = 8 + 2 + 2 + 4 + 8;
22
23
  const CHECKSUM_BYTES = 8;
23
24
  const textEncoder = new TextEncoder();
@@ -78,7 +79,6 @@ export type SpreadsheetCellScalar =
78
79
  | SpreadsheetFormulaError;
79
80
  export type SpreadsheetFormulaCell = Readonly<{
80
81
  formula: string;
81
- cached: SpreadsheetCellScalar;
82
82
  }>;
83
83
  export type SpreadsheetCellInput = SpreadsheetCellScalar | SpreadsheetFormulaCell;
84
84
 
@@ -491,7 +491,7 @@ function batchRecord(input: unknown): SpreadsheetArtifactCommandBatch {
491
491
  const batch = plainRecord(input, "spreadsheet command batch");
492
492
  exactKeys(batch, ["commands", "version"], "spreadsheet command batch");
493
493
  if (batch.version !== SPREADSHEET_ARTIFACT_COMMAND_VERSION) {
494
- throw new TypeError("spreadsheet command batch version must be 1");
494
+ throw new TypeError("spreadsheet command batch version must be 2");
495
495
  }
496
496
  if (!Array.isArray(batch.commands)) throw new TypeError("commands must be an array");
497
497
  if (
@@ -770,13 +770,12 @@ class BinaryWriter {
770
770
  cell(value: unknown): void {
771
771
  if (isFormulaCell(value)) {
772
772
  const cell = plainRecord(value, "formula cell");
773
- exactKeys(cell, ["cached", "formula"], "formula cell");
773
+ exactKeys(cell, ["formula"], "formula cell");
774
774
  if (typeof cell.formula !== "string" || cell.formula.length === 0) {
775
775
  throw new TypeError("formula source must be a nonempty string");
776
776
  }
777
777
  this.u8(1);
778
778
  this.string(cell.formula, SPREADSHEET_ARTIFACT_COMMAND_MAX_STRING_BYTES);
779
- this.scalar(cell.cached);
780
779
  return;
781
780
  }
782
781
  this.u8(0);
@@ -902,12 +901,12 @@ class BinaryReader {
902
901
  cell(): SpreadsheetCellInput {
903
902
  const formulaTag = this.u8();
904
903
  if (formulaTag > 1) throw new TypeError("spreadsheet formula presence tag is invalid");
905
- const formula =
906
- formulaTag === 1
907
- ? this.nonemptyFormula(this.string(SPREADSHEET_ARTIFACT_COMMAND_MAX_STRING_BYTES))
908
- : null;
909
- const cached = this.scalar();
910
- return formula === null ? cached : Object.freeze({ formula, cached });
904
+ if (formulaTag === 1) {
905
+ return Object.freeze({
906
+ formula: this.nonemptyFormula(this.string(SPREADSHEET_ARTIFACT_COMMAND_MAX_STRING_BYTES)),
907
+ });
908
+ }
909
+ return this.scalar();
911
910
  }
912
911
 
913
912
  done(message: string): void {
@@ -981,7 +980,7 @@ function isFormulaError(value: unknown): value is SpreadsheetFormulaError {
981
980
  typeof value === "object" &&
982
981
  value !== null &&
983
982
  !Array.isArray(value) &&
984
- typeof (value as Record<string, unknown>).error === "string"
983
+ Object.hasOwn(value, "error")
985
984
  );
986
985
  }
987
986
 
package/src/task-notes.ts CHANGED
@@ -2,7 +2,7 @@ import { z } from "zod";
2
2
 
3
3
  export const TASK_NOTE_TEXT_MAX_BYTES = 4_096;
4
4
  export const TASK_NOTE_REASON_MAX_BYTES = 2_048;
5
- export const TASK_NOTE_MAX_LIFETIME_DAYS = 30;
5
+ export const TASK_NOTE_MAX_LIFETIME_DAYS = 90;
6
6
  export const TASK_NOTE_ACTIVE_RECORD_CAP = 500;
7
7
  export const TASK_NOTE_LIST_DEFAULT_LIMIT = 10;
8
8
  export const TASK_NOTE_LIST_MAX_LIMIT = 20;
@@ -77,6 +77,19 @@ export const TaskNoteMutationResult = z.object({
77
77
  });
78
78
  export type TaskNoteMutationResult = z.infer<typeof TaskNoteMutationResult>;
79
79
 
80
+ /** Atomic correction lineage: archive one exact v1 note and create one v1 replacement. */
81
+ export const TaskNoteReplacementResult = z.object({
82
+ operationId: z.string().uuid(),
83
+ inputHash: z.string().regex(/^[0-9a-f]{64}$/),
84
+ replaces: z.object({
85
+ noteId: z.string().uuid(),
86
+ archivedVersion: z.literal(2),
87
+ }),
88
+ replacement: TaskNote,
89
+ replayed: z.boolean(),
90
+ });
91
+ export type TaskNoteReplacementResult = z.infer<typeof TaskNoteReplacementResult>;
92
+
80
93
  export const TaskNoteListResponse = z
81
94
  .object({
82
95
  notes: z.array(TaskNote).max(TASK_NOTE_LIST_MAX_LIMIT),
@@ -0,0 +1,35 @@
1
+ import { z } from "zod";
2
+
3
+ /** Model-visible overflow of one tool result. Exact bytes live on a workspace File. */
4
+ export const TOOL_RESULT_SPILLED_TYPE = "tool_result_spilled" as const;
5
+ export const TOOL_RESULT_SPILL_MEDIA_TYPE = "application/json" as const;
6
+ export const TOOL_RESULT_SPILL_MOUNT_PATH = "tool-results" as const;
7
+
8
+ const LOWERCASE_UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
9
+
10
+ export const ToolResultSpilledReceipt = z
11
+ .object({
12
+ type: z.literal(TOOL_RESULT_SPILLED_TYPE),
13
+ sandboxPath: z.string().min(1).max(4_096).nullable(),
14
+ fileId: z.string().regex(LOWERCASE_UUID),
15
+ byteSize: z.number().int().positive().safe(),
16
+ mediaType: z.literal(TOOL_RESULT_SPILL_MEDIA_TYPE),
17
+ })
18
+ .strict();
19
+ export type ToolResultSpilledReceipt = z.infer<typeof ToolResultSpilledReceipt>;
20
+
21
+ export function isToolResultSpilledReceipt(value: unknown): value is ToolResultSpilledReceipt {
22
+ return ToolResultSpilledReceipt.safeParse(value).success;
23
+ }
24
+
25
+ export function toolResultSpillSandboxPath(filename: string): string {
26
+ return `/workspace/${TOOL_RESULT_SPILL_MOUNT_PATH}/${filename}`;
27
+ }
28
+
29
+ export function toolResultSpillFilename(operationId: string): string {
30
+ const normalized = operationId.toLowerCase();
31
+ if (!LOWERCASE_UUID.test(normalized)) {
32
+ throw new Error("tool result spill filename requires a lowercase UUID operation id");
33
+ }
34
+ return `${normalized}.json`;
35
+ }
@@ -154,6 +154,16 @@ export const WorkspaceInstructionPolicyHead = z.object({
154
154
  });
155
155
  export type WorkspaceInstructionPolicyHead = z.infer<typeof WorkspaceInstructionPolicyHead>;
156
156
 
157
+ export const WorkspaceInstructionPolicyInactiveHead = z.object({
158
+ workspaceId: z.string().uuid(),
159
+ ...targetShape,
160
+ activationVersion: z.number().int().positive(),
161
+ deactivatedAt: z.string().datetime(),
162
+ });
163
+ export type WorkspaceInstructionPolicyInactiveHead = z.infer<
164
+ typeof WorkspaceInstructionPolicyInactiveHead
165
+ >;
166
+
157
167
  export const WorkspaceInstructionPolicySnapshotProvenance = z.object({
158
168
  source: WorkspaceInstructionPolicyProvenanceSource,
159
169
  sourceIdHash: z
@@ -230,6 +240,23 @@ export type WorkspaceInstructionPolicyActivationEvent = z.infer<
230
240
  typeof WorkspaceInstructionPolicyActivationEvent
231
241
  >;
232
242
 
243
+ export const WorkspaceInstructionPolicyDeactivationEvent = z.object({
244
+ id: z.string().uuid(),
245
+ operationId: z.string().uuid(),
246
+ accountId: z.string().uuid(),
247
+ workspaceId: z.string().uuid(),
248
+ ...targetShape,
249
+ type: z.literal("automatic_deactivate"),
250
+ activationVersion: z.number().int().positive(),
251
+ oldRevision: WorkspaceInstructionPolicyRevisionIdentity,
252
+ actorSubjectId: z.string().min(1),
253
+ reason: z.string().min(1).max(WORKSPACE_INSTRUCTION_POLICY_REASON_MAX_CHARS),
254
+ createdAt: z.string().datetime(),
255
+ });
256
+ export type WorkspaceInstructionPolicyDeactivationEvent = z.infer<
257
+ typeof WorkspaceInstructionPolicyDeactivationEvent
258
+ >;
259
+
233
260
  export const CreateWorkspaceInstructionPolicyDraftRequest = z
234
261
  .object({
235
262
  operationId: z.string().uuid().optional(),
@@ -279,7 +306,10 @@ export type WorkspaceInstructionPolicyListQuery = z.infer<
279
306
  export const WorkspaceInstructionPolicyListResponse = z.object({
280
307
  revisions: z.array(WorkspaceInstructionPolicyRevision),
281
308
  activeHeads: z.array(WorkspaceInstructionPolicyHead),
309
+ inactiveHeads: z.array(WorkspaceInstructionPolicyInactiveHead).default([]),
310
+ inactiveHeadsTruncated: z.boolean().default(false),
282
311
  activationEvents: z.array(WorkspaceInstructionPolicyActivationEvent),
312
+ deactivationEvents: z.array(WorkspaceInstructionPolicyDeactivationEvent).default([]),
283
313
  nextAfterRevision: z.number().int().positive().nullable(),
284
314
  });
285
315
  export type WorkspaceInstructionPolicyListResponse = z.infer<
@@ -0,0 +1,88 @@
1
+ import { z } from "zod";
2
+ import {
3
+ GovernedLearningActivationReceipt,
4
+ GovernedLearningActivationUndoReceipt,
5
+ UndoGovernedLearningActivationRequest,
6
+ } from "./governed-learning-activation";
7
+ import { GovernedLearningDecisionReceipt } from "./governed-learning-evaluator";
8
+ import {
9
+ WorkspaceLearningMode,
10
+ WorkspaceLearningPolicyActivationEvent,
11
+ WorkspaceLearningPolicyHead,
12
+ WorkspaceLearningPolicyRevision,
13
+ WorkspaceLearningSourceOverrideInput,
14
+ WORKSPACE_LEARNING_POLICY_REASON_MAX_CHARS,
15
+ } from "./workspace-learning-policy";
16
+
17
+ export const WORKSPACE_LEARNING_HISTORY_MAX_ITEMS = 100;
18
+
19
+ export const WorkspaceLearningPolicyHistoryQuery = z.object({
20
+ limit: z.coerce.number().int().min(1).max(WORKSPACE_LEARNING_HISTORY_MAX_ITEMS).default(50),
21
+ });
22
+ export type WorkspaceLearningPolicyHistoryQuery = z.infer<
23
+ typeof WorkspaceLearningPolicyHistoryQuery
24
+ >;
25
+
26
+ export const CreateWorkspaceLearningPolicyRevisionRequest = z
27
+ .object({
28
+ operationId: z.string().uuid().optional(),
29
+ workspaceMode: WorkspaceLearningMode,
30
+ sourceOverrides: z.array(WorkspaceLearningSourceOverrideInput).optional().default([]),
31
+ supersedesRevisionId: z.string().uuid().nullable().optional().default(null),
32
+ })
33
+ .strict();
34
+ export type CreateWorkspaceLearningPolicyRevisionRequest = z.infer<
35
+ typeof CreateWorkspaceLearningPolicyRevisionRequest
36
+ >;
37
+
38
+ export const ActivateWorkspaceLearningPolicyRevisionRequest = z
39
+ .object({
40
+ operationId: z.string().uuid().optional(),
41
+ expectedCurrentRevisionId: z.string().uuid().nullable(),
42
+ expectedActivationVersion: z.number().int().nonnegative(),
43
+ reason: z.string().trim().min(1).max(WORKSPACE_LEARNING_POLICY_REASON_MAX_CHARS),
44
+ })
45
+ .strict();
46
+ export type ActivateWorkspaceLearningPolicyRevisionRequest = z.infer<
47
+ typeof ActivateWorkspaceLearningPolicyRevisionRequest
48
+ >;
49
+
50
+ export const RollbackWorkspaceLearningPolicyRevisionRequest =
51
+ ActivateWorkspaceLearningPolicyRevisionRequest.extend({
52
+ targetRevisionId: z.string().uuid(),
53
+ expectedCurrentRevisionId: z.string().uuid(),
54
+ }).strict();
55
+ export type RollbackWorkspaceLearningPolicyRevisionRequest = z.infer<
56
+ typeof RollbackWorkspaceLearningPolicyRevisionRequest
57
+ >;
58
+
59
+ export const WorkspaceLearningPolicyMutationResponse = z
60
+ .object({
61
+ head: WorkspaceLearningPolicyHead,
62
+ event: WorkspaceLearningPolicyActivationEvent,
63
+ })
64
+ .strict();
65
+ export type WorkspaceLearningPolicyMutationResponse = z.infer<
66
+ typeof WorkspaceLearningPolicyMutationResponse
67
+ >;
68
+
69
+ export const UndoGovernedLearningActivationHttpRequest = UndoGovernedLearningActivationRequest.pick(
70
+ { operationId: true },
71
+ ).partial();
72
+ export type UndoGovernedLearningActivationHttpRequest = z.infer<
73
+ typeof UndoGovernedLearningActivationHttpRequest
74
+ >;
75
+
76
+ export const WorkspaceLearningHistoryResponse = z
77
+ .object({
78
+ head: WorkspaceLearningPolicyHead.nullable(),
79
+ revisions: z.array(WorkspaceLearningPolicyRevision),
80
+ policyEvents: z.array(WorkspaceLearningPolicyActivationEvent),
81
+ decisions: z.array(GovernedLearningDecisionReceipt),
82
+ activations: z.array(GovernedLearningActivationReceipt),
83
+ undos: z.array(GovernedLearningActivationUndoReceipt),
84
+ truncated: z.boolean(),
85
+ effectiveBoundary: z.literal("next_accepted_attempt"),
86
+ })
87
+ .strict();
88
+ export type WorkspaceLearningHistoryResponse = z.infer<typeof WorkspaceLearningHistoryResponse>;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/slack-bot-scopes.ts"],"sourcesContent":["export const OPENGENI_SLACK_BOT_REQUIRED_SCOPES = [\n \"app_mentions:read\",\n \"canvases:read\",\n \"channels:history\",\n \"channels:read\",\n \"chat:write\",\n \"commands\",\n \"files:read\",\n \"groups:history\",\n \"groups:read\",\n \"im:history\",\n \"im:read\",\n \"im:write\",\n \"mpim:history\",\n \"mpim:read\",\n \"users:read\",\n] as const;\n\n/** Read-only scope needed only for the optional emoji-reaction summon surface. */\nexport const OPENGENI_SLACK_REACTION_REQUIRED_SCOPE = \"reactions:read\" as const;\n\n/**\n * Scopes requested by the managed and generated self-hosted manifests.\n *\n * `reactions:read` is deliberately not part of the base eligibility contract:\n * legacy installations may continue using existing Slack interactions and\n * tools while the reaction setting stays disabled and the UI asks an admin to\n * reinstall.\n */\nexport const OPENGENI_SLACK_BOT_REQUESTED_SCOPES = [\n ...OPENGENI_SLACK_BOT_REQUIRED_SCOPES,\n OPENGENI_SLACK_REACTION_REQUIRED_SCOPE,\n] as const;\n\nexport const OPENGENI_SLACK_BOT_EVENTS = [\n \"app_mention\",\n \"message.channels\",\n \"message.groups\",\n \"message.im\",\n \"message.mpim\",\n \"reaction_added\",\n] as const;\n\n/** Full user-token scope set for every tool currently exposed by Slack's hosted MCP server. */\nexport const OPENGENI_SLACK_MCP_USER_SCOPES = [\n \"search:read.public\",\n \"search:read.private\",\n \"search:read.mpim\",\n \"search:read.im\",\n \"search:read.files\",\n \"files:read\",\n \"emoji:read\",\n \"search:read.users\",\n \"chat:write\",\n \"channels:history\",\n \"groups:history\",\n \"mpim:history\",\n \"im:history\",\n \"channels:write\",\n \"groups:write\",\n \"im:write\",\n \"mpim:write\",\n \"reactions:write\",\n \"canvases:read\",\n \"canvases:write\",\n \"users:read\",\n \"users:read.email\",\n \"channels:read\",\n \"groups:read\",\n \"mpim:read\",\n] as const;\n\nexport const OPENGENI_MANAGED_PUBLIC_BASE_URL = \"https://app.opengeni.ai\" as const;\n\nfunction normalizedSlackManifestBaseUrl(publicBaseUrl: string): string {\n const parsed = new URL(publicBaseUrl);\n if (parsed.protocol !== \"https:\" || parsed.username || parsed.password) {\n throw new Error(\"Slack bot manifest public base URL must be credential-free HTTPS\");\n }\n parsed.hash = \"\";\n parsed.search = \"\";\n parsed.pathname = parsed.pathname.replace(/\\/+$/, \"\");\n return parsed.toString().replace(/\\/$/, \"\");\n}\n\n/** Canonical managed/self-hosted Slack app manifest. Slack accepts JSON manifests. */\nexport function buildOpenGeniSlackBotManifest(publicBaseUrl: string) {\n const baseUrl = normalizedSlackManifestBaseUrl(publicBaseUrl);\n return {\n display_information: { name: \"OpenGeni\" },\n features: {\n bot_user: { display_name: \"OpenGeni\", always_online: false },\n slash_commands: [\n {\n command: \"/opengeni\",\n description: \"Start an OpenGeni task in this channel\",\n should_escape: false,\n url: `${baseUrl}/v1/integrations/slack/commands`,\n },\n ],\n shortcuts: [\n {\n callback_id: \"opengeni_message\",\n description: \"Start an OpenGeni task from this Slack message\",\n name: \"Open in OpenGeni\",\n type: \"message\",\n },\n ],\n },\n oauth_config: {\n redirect_urls: [\n `${baseUrl}/v1/integrations/oauth/callback`,\n `${baseUrl}/v1/integrations/slack/callback`,\n ],\n scopes: {\n bot: [...OPENGENI_SLACK_BOT_REQUESTED_SCOPES],\n user: [...OPENGENI_SLACK_MCP_USER_SCOPES],\n },\n },\n settings: {\n event_subscriptions: {\n bot_events: [...OPENGENI_SLACK_BOT_EVENTS],\n request_url: `${baseUrl}/v1/integrations/slack/events`,\n },\n interactivity: {\n is_enabled: true,\n request_url: `${baseUrl}/v1/integrations/slack/interactions`,\n },\n is_mcp_enabled: true,\n org_deploy_enabled: false,\n socket_mode_enabled: false,\n token_rotation_enabled: false,\n },\n } as const;\n}\n\n/**\n * Optional bot grants that remain inside the shipped bot's read/identity\n * boundary. Every other unrequired scope fails closed, including unknown future\n * Slack scopes, so verification, core routing, and UI eligibility cannot drift.\n */\nexport const OPENGENI_SLACK_BOT_SAFE_OPTIONAL_SCOPES = [\n \"team:read\",\n OPENGENI_SLACK_REACTION_REQUIRED_SCOPE,\n] as const;\n\n/** @deprecated Use evaluateOpenGeniSlackBotScopes; an allowlist is the policy. */\nexport const OPENGENI_SLACK_BOT_FORBIDDEN_SCOPES = [\"channels:join\", \"chat:write.public\"] as const;\n\nexport type OpenGeniSlackBotScopePolicy = {\n accepted: boolean;\n missingRequired: string[];\n unsupported: string[];\n};\n\nfunction isOpenGeniSlackBotScopeAllowed(scope: string): boolean {\n return (\n (OPENGENI_SLACK_BOT_REQUIRED_SCOPES as readonly string[]).includes(scope) ||\n (OPENGENI_SLACK_BOT_SAFE_OPTIONAL_SCOPES as readonly string[]).includes(scope)\n );\n}\n\nexport function areOpenGeniSlackBotScopesAccepted(grantedScopes: readonly string[]): boolean {\n return (\n OPENGENI_SLACK_BOT_REQUIRED_SCOPES.every((scope) => grantedScopes.includes(scope)) &&\n grantedScopes.every(isOpenGeniSlackBotScopeAllowed)\n );\n}\n\nexport function hasOpenGeniSlackReactionScope(grantedScopes: readonly string[]): boolean {\n return grantedScopes.includes(OPENGENI_SLACK_REACTION_REQUIRED_SCOPE);\n}\n\nexport function evaluateOpenGeniSlackBotScopes(\n grantedScopes: readonly string[],\n): OpenGeniSlackBotScopePolicy {\n const granted = new Set(grantedScopes);\n const missingRequired = OPENGENI_SLACK_BOT_REQUIRED_SCOPES.filter((scope) => !granted.has(scope));\n const unsupported = [...granted].filter((scope) => !isOpenGeniSlackBotScopeAllowed(scope)).sort();\n return {\n accepted: areOpenGeniSlackBotScopesAccepted(grantedScopes),\n missingRequired,\n unsupported,\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,11 +0,0 @@
1
- // src/editable-artifact-versions.ts
2
- var EDITABLE_ARTIFACT_MODEL_SCHEMA_VERSION = 1;
3
- var EDITABLE_ARTIFACT_SNAPSHOT_VERSION = 1;
4
- var COMMITTED_TRANSACTION_PROTOCOL_VERSION = 1;
5
-
6
- export {
7
- EDITABLE_ARTIFACT_MODEL_SCHEMA_VERSION,
8
- EDITABLE_ARTIFACT_SNAPSHOT_VERSION,
9
- COMMITTED_TRANSACTION_PROTOCOL_VERSION
10
- };
11
- //# sourceMappingURL=chunk-BVGIYW7D.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/editable-artifact-versions.ts"],"sourcesContent":["/** Shared durable model version without importing any modality codec. */\nexport const EDITABLE_ARTIFACT_MODEL_SCHEMA_VERSION = 1 as const;\n\n/** Shared native snapshot version without importing any modality codec. */\nexport const EDITABLE_ARTIFACT_SNAPSHOT_VERSION = 1 as const;\n\n/** Canonical committed spreadsheet transaction protocol version. */\nexport const COMMITTED_TRANSACTION_PROTOCOL_VERSION = 1 as const;\n"],"mappings":";AACO,IAAM,yCAAyC;AAG/C,IAAM,qCAAqC;AAG3C,IAAM,yCAAyC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/editable-artifact-codec-registry.ts"],"sourcesContent":["import {\n DOCUMENT_ARTIFACT_COMMAND_MAX_BYTES,\n DOCUMENT_ARTIFACT_COMMAND_MAX_COMMANDS,\n DOCUMENT_ARTIFACT_COMMAND_VERSION,\n DOCUMENT_ARTIFACT_QUERY_MAX_BYTES,\n DOCUMENT_ARTIFACT_QUERY_RESPONSE_MAX_BYTES,\n DOCUMENT_ARTIFACT_QUERY_RESPONSE_VERSION,\n DOCUMENT_ARTIFACT_QUERY_VERSION,\n assertCanonicalDocumentArtifactCommandBytes,\n assertCanonicalDocumentArtifactQueryBytes,\n assertCanonicalDocumentArtifactQueryResponseBytes,\n decodeDocumentArtifactCommandBatch,\n decodeDocumentArtifactQuery,\n decodeDocumentArtifactQueryResponse,\n encodeDocumentArtifactCommandBatch,\n encodeDocumentArtifactQuery,\n encodeDocumentArtifactQueryResponse,\n} from \"./document-artifact-commands\";\nimport {\n PRESENTATION_ARTIFACT_COMMAND_MAX_BYTES,\n PRESENTATION_ARTIFACT_COMMAND_MAX_COMMANDS,\n PRESENTATION_ARTIFACT_COMMAND_VERSION,\n PRESENTATION_ARTIFACT_QUERY_MAX_BYTES,\n PRESENTATION_ARTIFACT_QUERY_RESPONSE_MAX_BYTES,\n PRESENTATION_ARTIFACT_QUERY_RESPONSE_VERSION,\n PRESENTATION_ARTIFACT_QUERY_VERSION,\n assertCanonicalPresentationArtifactCommandBytes,\n assertCanonicalPresentationArtifactQueryBytes,\n assertCanonicalPresentationArtifactQueryResponseBytes,\n decodePresentationArtifactCommandBatch,\n decodePresentationArtifactQuery,\n decodePresentationArtifactQueryResponse,\n encodePresentationArtifactCommandBatch,\n encodePresentationArtifactQuery,\n encodePresentationArtifactQueryResponse,\n} from \"./presentation-artifact-commands\";\nimport {\n SPREADSHEET_ARTIFACT_COMMAND_MAX_BYTES,\n SPREADSHEET_ARTIFACT_COMMAND_MAX_COMMANDS,\n SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n assertCanonicalSpreadsheetArtifactCommandBytes,\n decodeSpreadsheetArtifactCommandBatch,\n encodeSpreadsheetArtifactCommandBatch,\n} from \"./spreadsheet-artifact-commands\";\nimport {\n SPREADSHEET_ARTIFACT_PROJECTION_MAX_BYTES,\n SPREADSHEET_ARTIFACT_QUERY_MAX_BYTES,\n SPREADSHEET_ARTIFACT_QUERY_VERSION,\n assertCanonicalSpreadsheetArtifactKernelProjectionBytes,\n assertCanonicalSpreadsheetArtifactKernelQueryBytes,\n decodeSpreadsheetArtifactKernelProjection,\n decodeSpreadsheetArtifactKernelQuery,\n encodeSpreadsheetArtifactKernelProjection,\n encodeSpreadsheetArtifactKernelQuery,\n} from \"./spreadsheet-artifact-query\";\nimport {\n EDITABLE_ARTIFACT_MODEL_SCHEMA_VERSION,\n EDITABLE_ARTIFACT_SNAPSHOT_VERSION,\n} from \"./editable-artifact-versions\";\n\nexport {\n EDITABLE_ARTIFACT_MODEL_SCHEMA_VERSION,\n EDITABLE_ARTIFACT_SNAPSHOT_VERSION,\n} from \"./editable-artifact-versions\";\n\nexport type EditableArtifactModality = \"spreadsheet\" | \"document\" | \"presentation\";\nexport type EditableArtifactConcurrencySemantics =\n | \"causal-crdt-v1\"\n | \"authoritative-serialized-stale-base-v1\";\n\nexport type EditableArtifactCodecDescriptor = Readonly<{\n modality: EditableArtifactModality;\n modelSchemaVersion: typeof EDITABLE_ARTIFACT_MODEL_SCHEMA_VERSION;\n snapshotVersion: typeof EDITABLE_ARTIFACT_SNAPSHOT_VERSION;\n command: Readonly<{\n magic: \"OGASC001\" | \"OGADC001\" | \"OGAPC001\";\n version: 1;\n maximumBytes: number;\n maximumCommands: number;\n encode: (value: unknown) => Uint8Array;\n decode: (bytes: Uint8Array) => unknown;\n assertCanonical: (bytes: Uint8Array) => void;\n }>;\n query: Readonly<{\n magic: \"OGAKQ001\" | \"OGADQ001\" | \"OGAPQ001\";\n responseMagic: \"OGAKV001\" | \"OGADP001\" | \"OGAPV001\";\n version: 1;\n responseVersion: 1;\n maximumBytes: number;\n maximumResponseBytes: number;\n encode: (value: unknown) => Uint8Array;\n decode: (bytes: Uint8Array) => unknown;\n assertCanonical: (bytes: Uint8Array) => void;\n encodeResponse: (value: unknown) => Uint8Array;\n decodeResponse: (bytes: Uint8Array) => unknown;\n assertCanonicalResponse: (bytes: Uint8Array) => void;\n }>;\n concurrency: Readonly<{\n semantics: EditableArtifactConcurrencySemantics;\n collaborationEnvelope: \"OGACO001\" | null;\n staleBaseMustBeRejected: boolean;\n }>;\n}>;\n\nconst spreadsheet = Object.freeze({\n modality: \"spreadsheet\",\n modelSchemaVersion: 1,\n snapshotVersion: 1,\n command: Object.freeze({\n magic: \"OGASC001\",\n version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n maximumBytes: SPREADSHEET_ARTIFACT_COMMAND_MAX_BYTES,\n maximumCommands: SPREADSHEET_ARTIFACT_COMMAND_MAX_COMMANDS,\n encode: (value: unknown) =>\n encodeSpreadsheetArtifactCommandBatch(\n value as Parameters<typeof encodeSpreadsheetArtifactCommandBatch>[0],\n ),\n decode: decodeSpreadsheetArtifactCommandBatch,\n assertCanonical: assertCanonicalSpreadsheetArtifactCommandBytes,\n }),\n query: Object.freeze({\n magic: \"OGAKQ001\",\n responseMagic: \"OGAKV001\",\n version: SPREADSHEET_ARTIFACT_QUERY_VERSION,\n responseVersion: SPREADSHEET_ARTIFACT_QUERY_VERSION,\n maximumBytes: SPREADSHEET_ARTIFACT_QUERY_MAX_BYTES,\n maximumResponseBytes: SPREADSHEET_ARTIFACT_PROJECTION_MAX_BYTES,\n encode: (value: unknown) =>\n encodeSpreadsheetArtifactKernelQuery(\n value as Parameters<typeof encodeSpreadsheetArtifactKernelQuery>[0],\n ),\n decode: decodeSpreadsheetArtifactKernelQuery,\n assertCanonical: assertCanonicalSpreadsheetArtifactKernelQueryBytes,\n encodeResponse: (value: unknown) =>\n encodeSpreadsheetArtifactKernelProjection(\n value as Parameters<typeof encodeSpreadsheetArtifactKernelProjection>[0],\n ),\n decodeResponse: decodeSpreadsheetArtifactKernelProjection,\n assertCanonicalResponse: assertCanonicalSpreadsheetArtifactKernelProjectionBytes,\n }),\n concurrency: Object.freeze({\n semantics: \"causal-crdt-v1\",\n collaborationEnvelope: \"OGACO001\",\n staleBaseMustBeRejected: false,\n }),\n}) satisfies EditableArtifactCodecDescriptor;\n\nconst document = Object.freeze({\n modality: \"document\",\n modelSchemaVersion: 1,\n snapshotVersion: 1,\n command: Object.freeze({\n magic: \"OGADC001\",\n version: DOCUMENT_ARTIFACT_COMMAND_VERSION,\n maximumBytes: DOCUMENT_ARTIFACT_COMMAND_MAX_BYTES,\n maximumCommands: DOCUMENT_ARTIFACT_COMMAND_MAX_COMMANDS,\n encode: (value: unknown) =>\n encodeDocumentArtifactCommandBatch(\n value as Parameters<typeof encodeDocumentArtifactCommandBatch>[0],\n ),\n decode: decodeDocumentArtifactCommandBatch,\n assertCanonical: assertCanonicalDocumentArtifactCommandBytes,\n }),\n query: Object.freeze({\n magic: \"OGADQ001\",\n responseMagic: \"OGADP001\",\n version: DOCUMENT_ARTIFACT_QUERY_VERSION,\n responseVersion: DOCUMENT_ARTIFACT_QUERY_RESPONSE_VERSION,\n maximumBytes: DOCUMENT_ARTIFACT_QUERY_MAX_BYTES,\n maximumResponseBytes: DOCUMENT_ARTIFACT_QUERY_RESPONSE_MAX_BYTES,\n encode: (value: unknown) =>\n encodeDocumentArtifactQuery(value as Parameters<typeof encodeDocumentArtifactQuery>[0]),\n decode: decodeDocumentArtifactQuery,\n assertCanonical: assertCanonicalDocumentArtifactQueryBytes,\n encodeResponse: (value: unknown) =>\n encodeDocumentArtifactQueryResponse(\n value as Parameters<typeof encodeDocumentArtifactQueryResponse>[0],\n ),\n decodeResponse: decodeDocumentArtifactQueryResponse,\n assertCanonicalResponse: assertCanonicalDocumentArtifactQueryResponseBytes,\n }),\n concurrency: Object.freeze({\n semantics: \"authoritative-serialized-stale-base-v1\",\n collaborationEnvelope: null,\n staleBaseMustBeRejected: true,\n }),\n}) satisfies EditableArtifactCodecDescriptor;\n\nconst presentation = Object.freeze({\n modality: \"presentation\",\n modelSchemaVersion: 1,\n snapshotVersion: 1,\n command: Object.freeze({\n magic: \"OGAPC001\",\n version: PRESENTATION_ARTIFACT_COMMAND_VERSION,\n maximumBytes: PRESENTATION_ARTIFACT_COMMAND_MAX_BYTES,\n maximumCommands: PRESENTATION_ARTIFACT_COMMAND_MAX_COMMANDS,\n encode: (value: unknown) =>\n encodePresentationArtifactCommandBatch(\n value as Parameters<typeof encodePresentationArtifactCommandBatch>[0],\n ),\n decode: decodePresentationArtifactCommandBatch,\n assertCanonical: assertCanonicalPresentationArtifactCommandBytes,\n }),\n query: Object.freeze({\n magic: \"OGAPQ001\",\n responseMagic: \"OGAPV001\",\n version: PRESENTATION_ARTIFACT_QUERY_VERSION,\n responseVersion: PRESENTATION_ARTIFACT_QUERY_RESPONSE_VERSION,\n maximumBytes: PRESENTATION_ARTIFACT_QUERY_MAX_BYTES,\n maximumResponseBytes: PRESENTATION_ARTIFACT_QUERY_RESPONSE_MAX_BYTES,\n encode: (value: unknown) =>\n encodePresentationArtifactQuery(\n value as Parameters<typeof encodePresentationArtifactQuery>[0],\n ),\n decode: decodePresentationArtifactQuery,\n assertCanonical: assertCanonicalPresentationArtifactQueryBytes,\n encodeResponse: (value: unknown) =>\n encodePresentationArtifactQueryResponse(\n value as Parameters<typeof encodePresentationArtifactQueryResponse>[0],\n ),\n decodeResponse: decodePresentationArtifactQueryResponse,\n assertCanonicalResponse: assertCanonicalPresentationArtifactQueryResponseBytes,\n }),\n concurrency: Object.freeze({\n semantics: \"authoritative-serialized-stale-base-v1\",\n collaborationEnvelope: null,\n staleBaseMustBeRejected: true,\n }),\n}) satisfies EditableArtifactCodecDescriptor;\n\nexport const EDITABLE_ARTIFACT_CODEC_REGISTRY: Readonly<\n Record<EditableArtifactModality, EditableArtifactCodecDescriptor>\n> = Object.freeze({ spreadsheet, document, presentation });\n\n/**\n * Selects solely from the durable artifact modality plus persisted versions.\n * Modality intentionally never enters OGATX001: the durable artifact row is\n * authoritative and prevents client-controlled cross-modality decoding.\n */\nexport function editableArtifactCodecFor(\n input: Readonly<{\n durableModality: EditableArtifactModality;\n modelSchemaVersion: number;\n commandProtocolVersion: number;\n }>,\n): EditableArtifactCodecDescriptor {\n const descriptor = EDITABLE_ARTIFACT_CODEC_REGISTRY[input.durableModality];\n if (!descriptor) throw new TypeError(\"unsupported durable editable artifact modality\");\n if (input.modelSchemaVersion !== descriptor.modelSchemaVersion) {\n throw new TypeError(\n \"editable artifact model schema version is incompatible with its durable modality\",\n );\n }\n if (input.commandProtocolVersion !== descriptor.command.version) {\n throw new TypeError(\n \"editable artifact command protocol version is incompatible with its durable modality\",\n );\n }\n return descriptor;\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/spreadsheet-artifact-date.ts","../src/spreadsheet-artifact-commands.ts"],"sourcesContent":["const ECMASCRIPT_DATE_MAX_MILLISECONDS = 8_640_000_000_000_000n;\n\n/** Parses only the exact string form emitted by `Date.prototype.toISOString`. */\nexport function canonicalSpreadsheetDateMilliseconds(value: unknown): number {\n const milliseconds = typeof value === \"string\" ? Date.parse(value) : Number.NaN;\n if (!Number.isFinite(milliseconds) || new Date(milliseconds).toISOString() !== value) {\n throw new TypeError(\"date must be canonical ISO\");\n }\n return milliseconds;\n}\n\n/** Converts a signed wire integer to a canonical ISO instant without lossy coercion. */\nexport function canonicalSpreadsheetDateFromMilliseconds(milliseconds: bigint): string {\n if (\n milliseconds < -ECMASCRIPT_DATE_MAX_MILLISECONDS ||\n milliseconds > ECMASCRIPT_DATE_MAX_MILLISECONDS\n ) {\n throw new RangeError(\"date outside supported range\");\n }\n return new Date(Number(milliseconds)).toISOString();\n}\n","import {\n canonicalSpreadsheetDateFromMilliseconds,\n canonicalSpreadsheetDateMilliseconds,\n} from \"./spreadsheet-artifact-date\";\n\n/**\n * Canonical, identity-free spreadsheet mutation commands nested inside\n * `OGATX001`. Artifact, actor, transaction, delivery, and causal identity must\n * never be added here: the outer authored-intent envelope is their sole wire\n * authority.\n */\n\nexport const SPREADSHEET_ARTIFACT_COMMAND_VERSION = 1 as const;\nexport const SPREADSHEET_ARTIFACT_COMMAND_MAX_BYTES = 4 * 1024 * 1024;\nexport const SPREADSHEET_ARTIFACT_COMMAND_MAX_COMMANDS = 4_096;\nexport const SPREADSHEET_ARTIFACT_COMMAND_MAX_CELLS = 1_000_000;\nexport const SPREADSHEET_ARTIFACT_COMMAND_MAX_STRING_BYTES = 1 * 1024 * 1024;\nexport const SPREADSHEET_ARTIFACT_SHEET_NAME_MAX_UTF16_UNITS = 31;\n\nconst MAGIC = new TextEncoder().encode(\"OGASC001\");\nconst HEADER_BYTES = 8 + 2 + 2 + 4 + 8;\nconst CHECKSUM_BYTES = 8;\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder(\"utf-8\", { fatal: true });\nconst LOWER_HEX_ID = /^[0-9a-f]{32}$/u;\nconst UINT64_HEX_ZERO = \"0\".repeat(16);\nconst UINT32_MAX = 0xffff_ffff;\nconst FNV_OFFSET = 0xcbf29ce484222325n;\nconst FNV_PRIME = 0x100000001b3n;\n\ndeclare const stableIdBrand: unique symbol;\n\n/** Fixed-width lowercase hexadecimal 128-bit id. Runtime helpers enforce use. */\nexport type EditableArtifactStableId = string & {\n readonly [stableIdBrand]: \"EditableArtifactStableId\";\n};\n\n/**\n * A concrete sheet generation. The object id follows the offline allocator\n * invariant (both 64-bit halves nonzero); a derived operation id reserves only\n * the all-zero 128-bit value.\n */\nexport type SpreadsheetSheetGeneration = Readonly<{\n kind: \"generation\";\n sheetId: EditableArtifactStableId;\n creationOperationId: EditableArtifactStableId;\n}>;\n\n/**\n * Reference to a sheet created by an earlier command in this same batch.\n * This avoids recursively embedding the creation operation id, which is\n * derived from the hash of the complete outer intent.\n */\nexport type SpreadsheetPriorCreatePrecondition = Readonly<{\n kind: \"created-in-batch\";\n sheetId: EditableArtifactStableId;\n createCommandIndex: number;\n}>;\n\nexport type SpreadsheetSheetPrecondition =\n | SpreadsheetSheetGeneration\n | SpreadsheetPriorCreatePrecondition;\n\nexport type SpreadsheetCellPoint = Readonly<{ row: number; column: number }>;\nexport type SpreadsheetCellRange = Readonly<{\n start: SpreadsheetCellPoint;\n end: SpreadsheetCellPoint;\n}>;\n\nexport type SpreadsheetFormulaError = Readonly<{ error: string }>;\nexport type SpreadsheetDateValue = Readonly<{ date: string }>;\nexport type SpreadsheetCellScalar =\n | null\n | boolean\n | number\n | string\n | SpreadsheetDateValue\n | SpreadsheetFormulaError;\nexport type SpreadsheetFormulaCell = Readonly<{\n formula: string;\n cached: SpreadsheetCellScalar;\n}>;\nexport type SpreadsheetCellInput = SpreadsheetCellScalar | SpreadsheetFormulaCell;\n\nexport type SpreadsheetCreateSheetCommand = Readonly<{\n kind: \"sheet.create\";\n sheetId: EditableArtifactStableId;\n name: string;\n after: SpreadsheetSheetPrecondition | null;\n}>;\n\nexport type SpreadsheetRenameSheetCommand = Readonly<{\n kind: \"sheet.rename\";\n sheet: SpreadsheetSheetPrecondition;\n name: string;\n}>;\n\nexport type SpreadsheetDeleteSheetCommand = Readonly<{\n kind: \"sheet.delete\";\n sheet: SpreadsheetSheetPrecondition;\n}>;\n\n/** Row-major rectangular write; `cells.length === rows * columns`. */\nexport type SpreadsheetSetCellsCommand = Readonly<{\n kind: \"cells.set\";\n sheet: SpreadsheetSheetPrecondition;\n anchor: SpreadsheetCellPoint;\n rows: number;\n columns: number;\n cells: readonly SpreadsheetCellInput[];\n}>;\n\nexport type SpreadsheetClearRangeCommand = Readonly<{\n kind: \"range.clear\";\n sheet: SpreadsheetSheetPrecondition;\n range: SpreadsheetCellRange;\n}>;\n\nexport type SpreadsheetArtifactCommand =\n | SpreadsheetCreateSheetCommand\n | SpreadsheetRenameSheetCommand\n | SpreadsheetDeleteSheetCommand\n | SpreadsheetSetCellsCommand\n | SpreadsheetClearRangeCommand;\n\nexport type SpreadsheetArtifactCommandBatch = Readonly<{\n version: typeof SPREADSHEET_ARTIFACT_COMMAND_VERSION;\n commands: readonly SpreadsheetArtifactCommand[];\n}>;\n\n/** Validates a generic nonzero 128-bit id and returns its nominal type. */\nexport function editableArtifactStableId(value: string): EditableArtifactStableId {\n return genericStableId(value, \"stable id\");\n}\n\n/** Validates a sheet object id with nonzero allocator namespace and counter. */\nexport function spreadsheetSheetId(value: string): EditableArtifactStableId {\n return sheetObjectId(value, \"sheet id\");\n}\n\nexport function encodeSpreadsheetArtifactCommandBatch(\n input: SpreadsheetArtifactCommandBatch,\n): Uint8Array {\n const batch = batchRecord(input);\n const payload = new BinaryWriter(\n SPREADSHEET_ARTIFACT_COMMAND_MAX_BYTES - HEADER_BYTES - CHECKSUM_BYTES,\n );\n const context = new CommandContext();\n for (let index = 0; index < batch.commands.length; index += 1) {\n const command = ownArrayElement(batch.commands, index, \"commands\");\n encodeCommand(payload, command, index, context);\n }\n\n const payloadBytes = payload.finish();\n const output = new BinaryWriter(SPREADSHEET_ARTIFACT_COMMAND_MAX_BYTES);\n output.bytes(MAGIC);\n output.u16(SPREADSHEET_ARTIFACT_COMMAND_VERSION);\n output.u16(0);\n output.u32(batch.commands.length);\n output.u64(BigInt(payloadBytes.byteLength));\n output.bytes(payloadBytes);\n output.u64(fnv1a64(output.view()));\n return output.finish();\n}\n\nexport function decodeSpreadsheetArtifactCommandBatch(\n bytes: Uint8Array,\n): SpreadsheetArtifactCommandBatch {\n if (!(bytes instanceof Uint8Array)) {\n throw new TypeError(\"spreadsheet command bytes must be a Uint8Array\");\n }\n if (bytes.byteLength > SPREADSHEET_ARTIFACT_COMMAND_MAX_BYTES) {\n throw new RangeError(\"spreadsheet command envelope exceeds its byte limit\");\n }\n if (bytes.byteLength < HEADER_BYTES + CHECKSUM_BYTES) {\n throw new TypeError(\"truncated spreadsheet command envelope\");\n }\n const header = new BinaryReader(bytes);\n if (!equalBytes(header.bytes(MAGIC.byteLength), MAGIC)) {\n throw new TypeError(\"invalid spreadsheet command magic\");\n }\n const version = header.u16();\n if (version !== SPREADSHEET_ARTIFACT_COMMAND_VERSION) {\n throw new TypeError(`unsupported spreadsheet command version: ${version}`);\n }\n if (header.u16() !== 0) {\n throw new TypeError(\"spreadsheet command reserved flags must be zero\");\n }\n const commandCount = header.u32();\n if (commandCount < 1 || commandCount > SPREADSHEET_ARTIFACT_COMMAND_MAX_COMMANDS) {\n throw new RangeError(\"spreadsheet command count is outside its limit\");\n }\n const payloadLength = safeLength(header.u64(), \"spreadsheet command payload\");\n const expectedLength = HEADER_BYTES + payloadLength + CHECKSUM_BYTES;\n if (bytes.byteLength < expectedLength) {\n throw new TypeError(\"truncated spreadsheet command envelope\");\n }\n if (bytes.byteLength > expectedLength) {\n throw new TypeError(\"spreadsheet command envelope contains trailing bytes\");\n }\n const advertisedChecksum = readU64At(bytes, expectedLength - CHECKSUM_BYTES);\n const actualChecksum = fnv1a64(bytes.subarray(0, expectedLength - CHECKSUM_BYTES));\n if (advertisedChecksum !== actualChecksum) {\n throw new TypeError(\"spreadsheet command checksum does not match\");\n }\n\n const payload = new BinaryReader(bytes.subarray(HEADER_BYTES, HEADER_BYTES + payloadLength));\n const context = new CommandContext();\n const commands: SpreadsheetArtifactCommand[] = [];\n for (let index = 0; index < commandCount; index += 1) {\n commands.push(decodeCommand(payload, index, context));\n }\n payload.done(\"spreadsheet command payload contains trailing bytes\");\n return Object.freeze({\n version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n commands: Object.freeze(commands),\n });\n}\n\n/** Decodes, re-encodes, and proves byte-for-byte canonicality. */\nexport function assertCanonicalSpreadsheetArtifactCommandBytes(bytes: Uint8Array): Uint8Array {\n const canonical = encodeSpreadsheetArtifactCommandBatch(\n decodeSpreadsheetArtifactCommandBatch(bytes),\n );\n if (!equalBytes(bytes, canonical)) {\n throw new TypeError(\"spreadsheet command envelope is not canonical\");\n }\n return bytes;\n}\n\nclass CommandContext {\n readonly createdByIndex = new Map<number, string>();\n readonly createdSheetIds = new Set<string>();\n totalCells = 0;\n\n registerCreate(index: number, sheetId: string): void {\n if (this.createdSheetIds.has(sheetId)) {\n throw commandError(index, \"sheet id is created more than once in the batch\");\n }\n this.createdByIndex.set(index, sheetId);\n this.createdSheetIds.add(sheetId);\n }\n\n addCells(index: number, rows: number, columns: number): number {\n const count = rows * columns;\n if (!Number.isSafeInteger(count) || count < 1) {\n throw commandError(index, \"cell block dimensions are invalid\");\n }\n const next = this.totalCells + count;\n if (!Number.isSafeInteger(next) || next > SPREADSHEET_ARTIFACT_COMMAND_MAX_CELLS) {\n throw commandError(index, \"cell count exceeds its transaction limit\");\n }\n this.totalCells = next;\n return count;\n }\n}\n\nfunction encodeCommand(\n writer: BinaryWriter,\n value: unknown,\n index: number,\n context: CommandContext,\n): void {\n const command = plainRecord(value, `spreadsheet command ${index}`);\n switch (command.kind) {\n case \"sheet.create\": {\n exactKeys(command, [\"after\", \"kind\", \"name\", \"sheetId\"], `spreadsheet command ${index}`);\n const sheetId = sheetObjectId(command.sheetId, `spreadsheet command ${index} sheetId`);\n const name = sheetName(command.name, index);\n writer.u8(0);\n writer.stableId(sheetId);\n writer.string(name, SPREADSHEET_ARTIFACT_COMMAND_MAX_STRING_BYTES);\n if (command.after === null) {\n writer.u8(0);\n } else {\n writer.u8(1);\n encodeSheetPrecondition(writer, command.after, index, context);\n }\n context.registerCreate(index, sheetId);\n break;\n }\n case \"sheet.rename\": {\n exactKeys(command, [\"kind\", \"name\", \"sheet\"], `spreadsheet command ${index}`);\n writer.u8(1);\n encodeSheetPrecondition(writer, command.sheet, index, context);\n writer.string(sheetName(command.name, index), SPREADSHEET_ARTIFACT_COMMAND_MAX_STRING_BYTES);\n break;\n }\n case \"sheet.delete\": {\n exactKeys(command, [\"kind\", \"sheet\"], `spreadsheet command ${index}`);\n writer.u8(2);\n encodeSheetPrecondition(writer, command.sheet, index, context);\n break;\n }\n case \"cells.set\": {\n exactKeys(\n command,\n [\"anchor\", \"cells\", \"columns\", \"kind\", \"rows\", \"sheet\"],\n `spreadsheet command ${index}`,\n );\n const anchor = point(command.anchor, `spreadsheet command ${index} anchor`);\n const rows = positiveU32(command.rows, `spreadsheet command ${index} rows`);\n const columns = positiveU32(command.columns, `spreadsheet command ${index} columns`);\n assertExtent(anchor.row, rows, \"row\", index);\n assertExtent(anchor.column, columns, \"column\", index);\n const count = context.addCells(index, rows, columns);\n if (!Array.isArray(command.cells) || command.cells.length !== count) {\n throw commandError(index, `cells must contain exactly ${count} row-major values`);\n }\n writer.u8(3);\n encodeSheetPrecondition(writer, command.sheet, index, context);\n writer.u32(anchor.row);\n writer.u32(anchor.column);\n writer.u32(rows);\n writer.u32(columns);\n for (let cellIndex = 0; cellIndex < count; cellIndex += 1) {\n writer.cell(\n ownArrayElement(command.cells, cellIndex, `spreadsheet command ${index} cells`),\n );\n }\n break;\n }\n case \"range.clear\": {\n exactKeys(command, [\"kind\", \"range\", \"sheet\"], `spreadsheet command ${index}`);\n const range = cellRange(command.range, index);\n writer.u8(4);\n encodeSheetPrecondition(writer, command.sheet, index, context);\n writer.u32(range.start.row);\n writer.u32(range.start.column);\n writer.u32(range.end.row);\n writer.u32(range.end.column);\n break;\n }\n default:\n throw commandError(index, \"unknown command kind\");\n }\n}\n\nfunction decodeCommand(\n reader: BinaryReader,\n index: number,\n context: CommandContext,\n): SpreadsheetArtifactCommand {\n switch (reader.u8()) {\n case 0: {\n const sheetId = reader.sheetObjectId();\n const name = decodedSheetName(\n reader.string(SPREADSHEET_ARTIFACT_COMMAND_MAX_STRING_BYTES),\n index,\n );\n const afterFlag = reader.u8();\n if (afterFlag > 1) throw commandError(index, \"after presence flag is invalid\");\n const after = afterFlag === 1 ? decodeSheetPrecondition(reader, index, context) : null;\n context.registerCreate(index, sheetId);\n return Object.freeze({ kind: \"sheet.create\", sheetId, name, after });\n }\n case 1:\n return Object.freeze({\n kind: \"sheet.rename\",\n sheet: decodeSheetPrecondition(reader, index, context),\n name: decodedSheetName(reader.string(SPREADSHEET_ARTIFACT_COMMAND_MAX_STRING_BYTES), index),\n });\n case 2:\n return Object.freeze({\n kind: \"sheet.delete\",\n sheet: decodeSheetPrecondition(reader, index, context),\n });\n case 3: {\n const sheet = decodeSheetPrecondition(reader, index, context);\n const anchor = frozenPoint(reader.u32(), reader.u32());\n const rows = reader.u32();\n const columns = reader.u32();\n if (rows === 0 || columns === 0) {\n throw commandError(index, \"cell block dimensions must be nonzero\");\n }\n assertExtent(anchor.row, rows, \"row\", index);\n assertExtent(anchor.column, columns, \"column\", index);\n const count = context.addCells(index, rows, columns);\n const cells: SpreadsheetCellInput[] = [];\n for (let cellIndex = 0; cellIndex < count; cellIndex += 1) cells.push(reader.cell());\n return Object.freeze({\n kind: \"cells.set\",\n sheet,\n anchor,\n rows,\n columns,\n cells: Object.freeze(cells),\n });\n }\n case 4: {\n const sheet = decodeSheetPrecondition(reader, index, context);\n const start = frozenPoint(reader.u32(), reader.u32());\n const end = frozenPoint(reader.u32(), reader.u32());\n if (start.row > end.row || start.column > end.column) {\n throw commandError(index, \"clear range endpoints are not ordered\");\n }\n return Object.freeze({\n kind: \"range.clear\",\n sheet,\n range: Object.freeze({ start, end }),\n });\n }\n default:\n throw commandError(index, \"unknown binary command tag\");\n }\n}\n\nfunction encodeSheetPrecondition(\n writer: BinaryWriter,\n value: unknown,\n commandIndex: number,\n context: CommandContext,\n): void {\n const input = plainRecord(value, `spreadsheet command ${commandIndex} sheet precondition`);\n if (input.kind === \"generation\") {\n exactKeys(\n input,\n [\"creationOperationId\", \"kind\", \"sheetId\"],\n `spreadsheet command ${commandIndex} sheet generation`,\n );\n writer.u8(0);\n writer.stableId(sheetObjectId(input.sheetId, \"sheet generation sheetId\"));\n writer.stableId(genericStableId(input.creationOperationId, \"sheet creation operation id\"));\n return;\n }\n if (input.kind === \"created-in-batch\") {\n exactKeys(\n input,\n [\"createCommandIndex\", \"kind\", \"sheetId\"],\n `spreadsheet command ${commandIndex} prior-create precondition`,\n );\n const sheetId = sheetObjectId(input.sheetId, \"prior-create sheetId\");\n const createCommandIndex = nonnegativeU32(\n input.createCommandIndex,\n \"prior-create command index\",\n );\n assertPriorCreate(context, commandIndex, createCommandIndex, sheetId);\n writer.u8(1);\n writer.stableId(sheetId);\n writer.u32(createCommandIndex);\n return;\n }\n throw commandError(commandIndex, \"unknown sheet precondition kind\");\n}\n\nfunction decodeSheetPrecondition(\n reader: BinaryReader,\n commandIndex: number,\n context: CommandContext,\n): SpreadsheetSheetPrecondition {\n switch (reader.u8()) {\n case 0:\n return Object.freeze({\n kind: \"generation\",\n sheetId: reader.sheetObjectId(),\n creationOperationId: reader.genericStableId(),\n });\n case 1: {\n const sheetId = reader.sheetObjectId();\n const createCommandIndex = reader.u32();\n assertPriorCreate(context, commandIndex, createCommandIndex, sheetId);\n return Object.freeze({\n kind: \"created-in-batch\",\n sheetId,\n createCommandIndex,\n });\n }\n default:\n throw commandError(commandIndex, \"unknown sheet precondition tag\");\n }\n}\n\nfunction assertPriorCreate(\n context: CommandContext,\n commandIndex: number,\n createCommandIndex: number,\n sheetId: string,\n): void {\n if (createCommandIndex >= commandIndex) {\n throw commandError(commandIndex, \"prior-create reference must point to an earlier command\");\n }\n if (context.createdByIndex.get(createCommandIndex) !== sheetId) {\n throw commandError(\n commandIndex,\n \"prior-create reference must match the referenced create command and sheet id\",\n );\n }\n}\n\nfunction batchRecord(input: unknown): SpreadsheetArtifactCommandBatch {\n const batch = plainRecord(input, \"spreadsheet command batch\");\n exactKeys(batch, [\"commands\", \"version\"], \"spreadsheet command batch\");\n if (batch.version !== SPREADSHEET_ARTIFACT_COMMAND_VERSION) {\n throw new TypeError(\"spreadsheet command batch version must be 1\");\n }\n if (!Array.isArray(batch.commands)) throw new TypeError(\"commands must be an array\");\n if (\n batch.commands.length < 1 ||\n batch.commands.length > SPREADSHEET_ARTIFACT_COMMAND_MAX_COMMANDS\n ) {\n throw new RangeError(\"spreadsheet command count is outside its limit\");\n }\n return input as SpreadsheetArtifactCommandBatch;\n}\n\nfunction cellRange(value: unknown, index: number): SpreadsheetCellRange {\n const range = plainRecord(value, `spreadsheet command ${index} range`);\n exactKeys(range, [\"end\", \"start\"], `spreadsheet command ${index} range`);\n const start = point(range.start, `spreadsheet command ${index} range start`);\n const end = point(range.end, `spreadsheet command ${index} range end`);\n if (start.row > end.row || start.column > end.column) {\n throw commandError(index, \"clear range endpoints are not ordered\");\n }\n return { start, end };\n}\n\nfunction point(value: unknown, label: string): SpreadsheetCellPoint {\n const input = plainRecord(value, label);\n exactKeys(input, [\"column\", \"row\"], label);\n return {\n row: nonnegativeU32(input.row, `${label} row`),\n column: nonnegativeU32(input.column, `${label} column`),\n };\n}\n\nfunction frozenPoint(row: number, column: number): SpreadsheetCellPoint {\n return Object.freeze({ row, column });\n}\n\nfunction sheetName(value: unknown, index: number): string {\n if (typeof value !== \"string\") throw commandError(index, \"sheet name must be a string\");\n return decodedSheetName(value, index);\n}\n\nfunction decodedSheetName(value: string, index: number): string {\n const bytes = strictUtf8(value, \"sheet name\");\n const forbidden = /[\\\\/?*[\\]:\\0]/u.test(value);\n if (\n bytes.byteLength === 0 ||\n value.trim() !== value ||\n value.length > SPREADSHEET_ARTIFACT_SHEET_NAME_MAX_UTF16_UNITS ||\n forbidden\n ) {\n throw commandError(index, \"sheet name does not match the public spreadsheet model\");\n }\n return value;\n}\n\nfunction genericStableId(value: unknown, label: string): EditableArtifactStableId {\n if (typeof value !== \"string\" || !LOWER_HEX_ID.test(value) || /^0+$/u.test(value)) {\n throw new TypeError(`${label} must be nonzero fixed-width lowercase hexadecimal text`);\n }\n return value as EditableArtifactStableId;\n}\n\nfunction sheetObjectId(value: unknown, label: string): EditableArtifactStableId {\n const id = genericStableId(value, label);\n if (id.slice(0, 16) === UINT64_HEX_ZERO || id.slice(16) === UINT64_HEX_ZERO) {\n throw new TypeError(`${label} must have a nonzero namespace and counter`);\n }\n return id;\n}\n\nfunction positiveU32(value: unknown, label: string): number {\n const output = nonnegativeU32(value, label);\n if (output === 0) throw new TypeError(`${label} must be positive`);\n return output;\n}\n\nfunction nonnegativeU32(value: unknown, label: string): number {\n if (!Number.isInteger(value) || (value as number) < 0 || (value as number) > UINT32_MAX) {\n throw new TypeError(`${label} must be a uint32`);\n }\n return value as number;\n}\n\nfunction assertExtent(start: number, length: number, axis: string, index: number): void {\n if (length - 1 > UINT32_MAX - start) {\n throw commandError(index, `${axis} extent exceeds uint32 coordinates`);\n }\n}\n\nfunction safeLength(value: bigint, label: string): number {\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) throw new RangeError(`${label} length is unsafe`);\n const length = Number(value);\n if (length > SPREADSHEET_ARTIFACT_COMMAND_MAX_BYTES - HEADER_BYTES - CHECKSUM_BYTES) {\n throw new RangeError(`${label} exceeds its byte limit`);\n }\n return length;\n}\n\nfunction plainRecord(value: unknown, label: string): Record<string, unknown> {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n Object.getPrototypeOf(value) !== Object.prototype\n ) {\n throw new TypeError(`${label} must be a plain record`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction exactKeys(\n value: Record<string, unknown>,\n expected: readonly string[],\n label: string,\n): void {\n const keys = Reflect.ownKeys(value);\n if (keys.some((key) => typeof key !== \"string\")) {\n throw new TypeError(`${label} contains unsupported symbol fields`);\n }\n const actual = (keys as string[]).sort(compareCodeUnits);\n if (actual.length !== expected.length || actual.some((key, index) => key !== expected[index])) {\n throw new TypeError(`${label} fields must be exactly: ${expected.join(\", \")}`);\n }\n for (const key of actual) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (!descriptor || !(\"value\" in descriptor) || !descriptor.enumerable) {\n throw new TypeError(`${label} fields must be enumerable data properties`);\n }\n }\n}\n\nfunction ownArrayElement(value: readonly unknown[], index: number, label: string): unknown {\n if (!Object.hasOwn(value, index)) throw new TypeError(`${label} must be dense`);\n return value[index];\n}\n\nfunction commandError(index: number, message: string): TypeError {\n return new TypeError(`spreadsheet command ${index}: ${message}`);\n}\n\nfunction strictUtf8(value: string, label: string): Uint8Array {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code >= 0xd800 && code <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (!(next >= 0xdc00 && next <= 0xdfff)) {\n throw new TypeError(`${label} contains an unpaired surrogate`);\n }\n index += 1;\n } else if (code >= 0xdc00 && code <= 0xdfff) {\n throw new TypeError(`${label} contains an unpaired surrogate`);\n }\n }\n return textEncoder.encode(value);\n}\n\nfunction compareCodeUnits(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction fnv1a64(bytes: Uint8Array): bigint {\n let hash = FNV_OFFSET;\n for (const byte of bytes) {\n hash ^= BigInt(byte);\n hash = BigInt.asUintN(64, hash * FNV_PRIME);\n }\n return hash;\n}\n\nfunction equalBytes(left: Uint8Array, right: Uint8Array): boolean {\n return (\n left.byteLength === right.byteLength && left.every((value, index) => value === right[index])\n );\n}\n\nfunction readU64At(bytes: Uint8Array, offset: number): bigint {\n let value = 0n;\n for (let index = 0; index < 8; index += 1) {\n value |= BigInt(bytes[offset + index]!) << BigInt(index * 8);\n }\n return value;\n}\n\nconst STANDARD_ERROR_TAGS = Object.freeze({\n \"#NULL!\": 0,\n \"#DIV/0!\": 1,\n \"#VALUE!\": 2,\n \"#REF!\": 3,\n \"#NAME?\": 4,\n \"#NUM!\": 5,\n \"#N/A\": 6,\n \"#SPILL!\": 7,\n \"#CALC!\": 8,\n} satisfies Record<string, number>);\n\nconst STANDARD_ERRORS = Object.freeze([\n \"#NULL!\",\n \"#DIV/0!\",\n \"#VALUE!\",\n \"#REF!\",\n \"#NAME?\",\n \"#NUM!\",\n \"#N/A\",\n \"#SPILL!\",\n \"#CALC!\",\n] as const);\n\nclass BinaryWriter {\n private buffer: Uint8Array;\n private viewBuffer: DataView;\n private length = 0;\n\n constructor(private readonly maximum: number) {\n this.buffer = new Uint8Array(Math.min(1_024, maximum));\n this.viewBuffer = new DataView(this.buffer.buffer);\n }\n\n view(): Uint8Array {\n return this.buffer.subarray(0, this.length);\n }\n\n finish(): Uint8Array {\n return this.buffer.slice(0, this.length);\n }\n\n u8(value: number): void {\n this.reserve(1);\n this.viewBuffer.setUint8(this.length, value);\n this.length += 1;\n }\n\n u16(value: number): void {\n this.reserve(2);\n this.viewBuffer.setUint16(this.length, value, true);\n this.length += 2;\n }\n\n u32(value: number): void {\n this.reserve(4);\n this.viewBuffer.setUint32(this.length, value, true);\n this.length += 4;\n }\n\n u64(value: bigint): void {\n this.reserve(8);\n this.viewBuffer.setBigUint64(this.length, value, true);\n this.length += 8;\n }\n\n i64(value: bigint): void {\n this.reserve(8);\n this.viewBuffer.setBigInt64(this.length, value, true);\n this.length += 8;\n }\n\n f64(value: number): void {\n this.reserve(8);\n this.viewBuffer.setFloat64(this.length, value === 0 ? 0 : value, true);\n this.length += 8;\n }\n\n stableId(value: EditableArtifactStableId): void {\n // Text is namespace || counter; canonical model bytes are counter LE then\n // namespace LE, matching Rust `StableId::to_le_bytes`.\n this.u64(BigInt(`0x${value.slice(16)}`));\n this.u64(BigInt(`0x${value.slice(0, 16)}`));\n }\n\n string(value: string, maximum: number): void {\n const bytes = strictUtf8(value, \"spreadsheet string\");\n if (bytes.byteLength > maximum)\n throw new RangeError(\"spreadsheet string exceeds its byte limit\");\n this.u32(bytes.byteLength);\n this.bytes(bytes);\n }\n\n cell(value: unknown): void {\n if (isFormulaCell(value)) {\n const cell = plainRecord(value, \"formula cell\");\n exactKeys(cell, [\"cached\", \"formula\"], \"formula cell\");\n if (typeof cell.formula !== \"string\" || cell.formula.length === 0) {\n throw new TypeError(\"formula source must be a nonempty string\");\n }\n this.u8(1);\n this.string(cell.formula, SPREADSHEET_ARTIFACT_COMMAND_MAX_STRING_BYTES);\n this.scalar(cell.cached);\n return;\n }\n this.u8(0);\n this.scalar(value);\n }\n\n private scalar(value: unknown): void {\n if (value === null) {\n this.u8(0);\n } else if (value === false) {\n this.u8(1);\n } else if (value === true) {\n this.u8(2);\n } else if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new TypeError(\"spreadsheet numbers must be finite\");\n this.u8(3);\n this.f64(value);\n } else if (typeof value === \"string\") {\n this.u8(4);\n this.string(value, SPREADSHEET_ARTIFACT_COMMAND_MAX_STRING_BYTES);\n } else if (isDateValue(value)) {\n const date = plainRecord(value, \"date cell\");\n exactKeys(date, [\"date\"], \"date cell\");\n this.u8(6);\n this.i64(BigInt(canonicalDateMilliseconds(date.date)));\n } else if (isFormulaError(value)) {\n const error = plainRecord(value, \"formula error\");\n exactKeys(error, [\"error\"], \"formula error\");\n this.u8(5);\n const tag = STANDARD_ERROR_TAGS[error.error as keyof typeof STANDARD_ERROR_TAGS];\n if (tag !== undefined) {\n this.u8(tag);\n } else {\n this.u8(9);\n this.string(error.error as string, SPREADSHEET_ARTIFACT_COMMAND_MAX_STRING_BYTES);\n }\n } else {\n throw new TypeError(\"spreadsheet cell has an unsupported value shape\");\n }\n }\n\n bytes(value: Uint8Array): void {\n this.reserve(value.byteLength);\n this.buffer.set(value, this.length);\n this.length += value.byteLength;\n }\n\n private reserve(additional: number): void {\n const needed = this.length + additional;\n if (!Number.isSafeInteger(needed) || needed > this.maximum) {\n throw new RangeError(\"spreadsheet command envelope exceeds its byte limit\");\n }\n if (needed <= this.buffer.byteLength) return;\n let size = Math.max(1, this.buffer.byteLength);\n while (size < needed) size = Math.min(this.maximum, size * 2);\n const next = new Uint8Array(size);\n next.set(this.buffer.subarray(0, this.length));\n this.buffer = next;\n this.viewBuffer = new DataView(next.buffer);\n }\n}\n\nclass BinaryReader {\n private offset = 0;\n\n constructor(private readonly input: Uint8Array) {}\n\n u8(): number {\n return this.bytes(1)[0]!;\n }\n\n u16(): number {\n const bytes = this.bytes(2);\n return bytes[0]! | (bytes[1]! << 8);\n }\n\n u32(): number {\n const bytes = this.bytes(4);\n return bytes[0]! + bytes[1]! * 2 ** 8 + bytes[2]! * 2 ** 16 + bytes[3]! * 2 ** 24;\n }\n\n u64(): bigint {\n const bytes = this.bytes(8);\n let value = 0n;\n for (let index = 0; index < 8; index += 1) {\n value |= BigInt(bytes[index]!) << BigInt(index * 8);\n }\n return value;\n }\n\n i64(): bigint {\n const bytes = this.bytes(8);\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getBigInt64(0, true);\n }\n\n f64(): number {\n const bytes = this.bytes(8);\n const value = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getFloat64(\n 0,\n true,\n );\n if (!Number.isFinite(value)) throw new TypeError(\"spreadsheet numbers must be finite\");\n if (Object.is(value, -0)) {\n throw new TypeError(\"spreadsheet numbers must encode zero with a positive sign\");\n }\n return value;\n }\n\n sheetObjectId(): EditableArtifactStableId {\n return sheetObjectId(this.stableIdText(), \"sheet id\");\n }\n\n genericStableId(): EditableArtifactStableId {\n return genericStableId(this.stableIdText(), \"stable id\");\n }\n\n string(maximum: number): string {\n const length = this.u32();\n if (length > maximum) throw new RangeError(\"spreadsheet string exceeds its byte limit\");\n return textDecoder.decode(this.bytes(length));\n }\n\n cell(): SpreadsheetCellInput {\n const formulaTag = this.u8();\n if (formulaTag > 1) throw new TypeError(\"spreadsheet formula presence tag is invalid\");\n const formula =\n formulaTag === 1\n ? this.nonemptyFormula(this.string(SPREADSHEET_ARTIFACT_COMMAND_MAX_STRING_BYTES))\n : null;\n const cached = this.scalar();\n return formula === null ? cached : Object.freeze({ formula, cached });\n }\n\n done(message: string): void {\n if (this.offset !== this.input.byteLength) throw new TypeError(message);\n }\n\n bytes(length: number): Uint8Array {\n const end = this.offset + length;\n if (!Number.isSafeInteger(length) || length < 0 || end > this.input.byteLength) {\n throw new TypeError(\"truncated spreadsheet command envelope\");\n }\n const result = this.input.subarray(this.offset, end);\n this.offset = end;\n return result;\n }\n\n private stableIdText(): string {\n const counter = this.u64().toString(16).padStart(16, \"0\");\n const namespace = this.u64().toString(16).padStart(16, \"0\");\n return `${namespace}${counter}`;\n }\n\n private nonemptyFormula(value: string): string {\n if (value.length === 0) throw new TypeError(\"formula source must not be empty\");\n return value;\n }\n\n private scalar(): SpreadsheetCellScalar {\n switch (this.u8()) {\n case 0:\n return null;\n case 1:\n return false;\n case 2:\n return true;\n case 3:\n return this.f64();\n case 4:\n return this.string(SPREADSHEET_ARTIFACT_COMMAND_MAX_STRING_BYTES);\n case 5: {\n const tag = this.u8();\n if (tag <= 8) return Object.freeze({ error: STANDARD_ERRORS[tag]! });\n if (tag === 9) {\n return Object.freeze({\n error: this.string(SPREADSHEET_ARTIFACT_COMMAND_MAX_STRING_BYTES),\n });\n }\n throw new TypeError(\"spreadsheet formula error tag is invalid\");\n }\n case 6:\n return Object.freeze({\n date: canonicalSpreadsheetDateFromMilliseconds(this.i64()),\n });\n default:\n throw new TypeError(\"spreadsheet scalar tag is invalid\");\n }\n }\n}\n\nfunction isFormulaCell(value: unknown): value is SpreadsheetFormulaCell {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.hasOwn(value, \"formula\")\n );\n}\n\nfunction isFormulaError(value: unknown): value is SpreadsheetFormulaError {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n typeof (value as Record<string, unknown>).error === \"string\"\n );\n}\n\nfunction isDateValue(value: unknown): value is SpreadsheetDateValue {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.hasOwn(value, \"date\")\n );\n}\n\nfunction canonicalDateMilliseconds(value: unknown): number {\n return canonicalSpreadsheetDateMilliseconds(value);\n}\n"],"mappings":"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","names":[]}