openpond-sdk 0.12.8 → 0.12.10

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 (146) hide show
  1. package/TRAINING_PROTOCOL.md +40 -0
  2. package/TRAINING_WORKFLOWS.md +44 -10
  3. package/dist/advanced-refiner-evaluations.js +8 -7
  4. package/dist/candidate-evaluations.js +7 -6
  5. package/dist/{chunk-MGFI4226.js → chunk-2DK7UBAG.js} +3 -3
  6. package/dist/{chunk-U4QIGSP5.js → chunk-4L556MYM.js} +3 -3
  7. package/dist/{chunk-MRUDFIB6.js → chunk-5QMREXMU.js} +6 -4
  8. package/dist/{chunk-MRUDFIB6.js.map → chunk-5QMREXMU.js.map} +1 -1
  9. package/dist/{chunk-UWM2ZPGS.js → chunk-7FYPFHCQ.js} +3 -3
  10. package/dist/{chunk-RFKZSSLB.js → chunk-7WKCQ4V5.js} +5 -3
  11. package/dist/{chunk-RFKZSSLB.js.map → chunk-7WKCQ4V5.js.map} +1 -1
  12. package/dist/chunk-B3ZHJ2KK.js +152 -0
  13. package/dist/chunk-B3ZHJ2KK.js.map +1 -0
  14. package/dist/{chunk-YSEYPMQ3.js → chunk-BQ2C2Y54.js} +12 -154
  15. package/dist/chunk-BQ2C2Y54.js.map +1 -0
  16. package/dist/{chunk-HYCHLMP7.js → chunk-DMN6EF3R.js} +2 -2
  17. package/dist/{chunk-QVLJFJBU.js → chunk-ESW25WSD.js} +6 -6
  18. package/dist/chunk-EZME7DV4.js +161 -0
  19. package/dist/chunk-EZME7DV4.js.map +1 -0
  20. package/dist/{chunk-UMK6DH75.js → chunk-FC56EMHT.js} +6 -4
  21. package/dist/{chunk-UMK6DH75.js.map → chunk-FC56EMHT.js.map} +1 -1
  22. package/dist/{chunk-YP5DXGGC.js → chunk-GIEST52U.js} +2 -2
  23. package/dist/{chunk-BWFG46HX.js → chunk-GRQWKATA.js} +2 -2
  24. package/dist/chunk-GX6KMHW2.js +108 -0
  25. package/dist/chunk-GX6KMHW2.js.map +1 -0
  26. package/dist/{chunk-WYR3MZHU.js → chunk-HDKP6KE2.js} +2 -2
  27. package/dist/{chunk-EEZ5YHJQ.js → chunk-ICFFZ4WC.js} +3 -3
  28. package/dist/{chunk-EWRWGFKD.js → chunk-IIQENUOK.js} +6 -4
  29. package/dist/{chunk-EWRWGFKD.js.map → chunk-IIQENUOK.js.map} +1 -1
  30. package/dist/{chunk-LUFOAMN5.js → chunk-LKKKTBLL.js} +2 -2
  31. package/dist/{chunk-CJDEVI3T.js → chunk-LT2YQCZI.js} +5 -3
  32. package/dist/{chunk-CJDEVI3T.js.map → chunk-LT2YQCZI.js.map} +1 -1
  33. package/dist/{chunk-QHCY4MBG.js → chunk-PKW3II5M.js} +2 -2
  34. package/dist/{chunk-XL44IXBO.js → chunk-PT72OARU.js} +5 -5
  35. package/dist/{chunk-TWJYL5YF.js → chunk-QQ444G6A.js} +5 -5
  36. package/dist/{chunk-D3WOJTUY.js → chunk-RYDUAY52.js} +4 -14
  37. package/dist/chunk-RYDUAY52.js.map +1 -0
  38. package/dist/chunk-U2KGUAIS.js +18 -0
  39. package/dist/chunk-U2KGUAIS.js.map +1 -0
  40. package/dist/{chunk-IOZCYSJ6.js → chunk-UAYXORU5.js} +2 -2
  41. package/dist/{chunk-TZREEZ4C.js → chunk-WEL535AI.js} +9 -9
  42. package/dist/{chunk-EYMZQML2.js → chunk-WOD72SFI.js} +525 -484
  43. package/dist/chunk-WOD72SFI.js.map +1 -0
  44. package/dist/{chunk-GGG6H4MK.js → chunk-XJKGCU2K.js} +2 -2
  45. package/dist/{chunk-GZSQIOAH.js → chunk-XNRM3QGR.js} +6 -6
  46. package/dist/{chunk-CZXN63A4.js → chunk-ZZZU6XER.js} +2 -2
  47. package/dist/connected-evidence.js +18 -15
  48. package/dist/dataset-workspaces.js +21 -18
  49. package/dist/dataset-workspaces.js.map +1 -1
  50. package/dist/errors.js +13 -0
  51. package/dist/errors.js.map +1 -0
  52. package/dist/experiment-evaluation-schedules.js +22 -19
  53. package/dist/experiment-improvements.js +9 -8
  54. package/dist/experiments.js +22 -19
  55. package/dist/index.js +63 -58
  56. package/dist/index.js.map +1 -1
  57. package/dist/learning.js +4 -2
  58. package/dist/learning.js.map +1 -1
  59. package/dist/model-projects.js +6 -4
  60. package/dist/model-starter-attempts.js +3 -2
  61. package/dist/model-starter-catalog.js +13 -10
  62. package/dist/model-starter-catalog.js.map +1 -1
  63. package/dist/model-starters.js +13 -10
  64. package/dist/model-taskset-runs.js +4 -3
  65. package/dist/model-taskset-runs.js.map +1 -1
  66. package/dist/post-training.js +7 -6
  67. package/dist/taskset-drafts.js +17 -14
  68. package/dist/taskset-drafts.js.map +1 -1
  69. package/dist/taskset-packages.js +24 -21
  70. package/dist/tool-learning-local-store.js +202 -0
  71. package/dist/tool-learning-local-store.js.map +1 -0
  72. package/dist/tool-learning.js +3 -0
  73. package/dist/tool-learning.js.map +1 -0
  74. package/dist/training-bundle.js +31 -16
  75. package/dist/training-bundle.js.map +1 -1
  76. package/dist/training-hardware.js +23 -0
  77. package/dist/training-hardware.js.map +1 -0
  78. package/dist/training.js +30 -12
  79. package/dist/types/packages/sdk/src/connected-evidence-client.d.ts +40 -40
  80. package/dist/types/packages/sdk/src/dataset-preparation-workspace.d.ts +20 -20
  81. package/dist/types/packages/sdk/src/errors.d.ts +3 -0
  82. package/dist/types/packages/sdk/src/errors.d.ts.map +1 -0
  83. package/dist/types/packages/sdk/src/experiment-client.d.ts +636 -636
  84. package/dist/types/packages/sdk/src/experiment-improvement-client.d.ts +1622 -1622
  85. package/dist/types/packages/sdk/src/experiment-run-details.d.ts +54 -54
  86. package/dist/types/packages/sdk/src/learning-client.d.ts +1 -6
  87. package/dist/types/packages/sdk/src/learning-client.d.ts.map +1 -1
  88. package/dist/types/packages/sdk/src/learning-error.d.ts +7 -0
  89. package/dist/types/packages/sdk/src/learning-error.d.ts.map +1 -0
  90. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts +2 -0
  91. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts.map +1 -1
  92. package/dist/types/packages/sdk/src/model-projects.d.ts +24 -0
  93. package/dist/types/packages/sdk/src/model-projects.d.ts.map +1 -1
  94. package/dist/types/packages/sdk/src/model-starters.d.ts +6 -0
  95. package/dist/types/packages/sdk/src/model-starters.d.ts.map +1 -1
  96. package/dist/types/packages/sdk/src/post-training.d.ts +58 -54
  97. package/dist/types/packages/sdk/src/post-training.d.ts.map +1 -1
  98. package/dist/types/packages/sdk/src/taskset-authored-files.d.ts +20 -20
  99. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +2 -0
  100. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts.map +1 -1
  101. package/dist/types/packages/sdk/src/taskset-package-client.d.ts +6 -0
  102. package/dist/types/packages/sdk/src/taskset-package-client.d.ts.map +1 -1
  103. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +20 -20
  104. package/dist/types/packages/sdk/src/tool-learning-local-store.d.ts +72 -0
  105. package/dist/types/packages/sdk/src/tool-learning-local-store.d.ts.map +1 -0
  106. package/dist/types/packages/sdk/src/tool-learning.d.ts +3 -0
  107. package/dist/types/packages/sdk/src/tool-learning.d.ts.map +1 -0
  108. package/dist/types/packages/sdk/src/training-compute-selection.d.ts +2 -0
  109. package/dist/types/packages/sdk/src/training-compute-selection.d.ts.map +1 -1
  110. package/dist/types/packages/sdk/src/training-estimates.d.ts +9 -1
  111. package/dist/types/packages/sdk/src/training-estimates.d.ts.map +1 -1
  112. package/dist/types/packages/sdk/src/training-hardware.d.ts +886 -0
  113. package/dist/types/packages/sdk/src/training-hardware.d.ts.map +1 -0
  114. package/dist/types/packages/sdk/src/training-preparations.d.ts +22 -0
  115. package/dist/types/packages/sdk/src/training-preparations.d.ts.map +1 -1
  116. package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts +2 -0
  117. package/dist/types/packages/sdk/src/training-qualification-preparation.d.ts.map +1 -1
  118. package/dist/types/packages/sdk/src/training-supervised.d.ts +101 -0
  119. package/dist/types/packages/sdk/src/training-supervised.d.ts.map +1 -0
  120. package/dist/types/packages/sdk/src/training-transport.d.ts +24 -0
  121. package/dist/types/packages/sdk/src/training-transport.d.ts.map +1 -0
  122. package/dist/types/packages/sdk/src/training.d.ts +34 -16
  123. package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
  124. package/examples/training/continual.ts +71 -9
  125. package/package.json +18 -2
  126. package/dist/chunk-D3WOJTUY.js.map +0 -1
  127. package/dist/chunk-EYMZQML2.js.map +0 -1
  128. package/dist/chunk-YSEYPMQ3.js.map +0 -1
  129. /package/dist/{chunk-MGFI4226.js.map → chunk-2DK7UBAG.js.map} +0 -0
  130. /package/dist/{chunk-U4QIGSP5.js.map → chunk-4L556MYM.js.map} +0 -0
  131. /package/dist/{chunk-UWM2ZPGS.js.map → chunk-7FYPFHCQ.js.map} +0 -0
  132. /package/dist/{chunk-HYCHLMP7.js.map → chunk-DMN6EF3R.js.map} +0 -0
  133. /package/dist/{chunk-QVLJFJBU.js.map → chunk-ESW25WSD.js.map} +0 -0
  134. /package/dist/{chunk-YP5DXGGC.js.map → chunk-GIEST52U.js.map} +0 -0
  135. /package/dist/{chunk-BWFG46HX.js.map → chunk-GRQWKATA.js.map} +0 -0
  136. /package/dist/{chunk-WYR3MZHU.js.map → chunk-HDKP6KE2.js.map} +0 -0
  137. /package/dist/{chunk-EEZ5YHJQ.js.map → chunk-ICFFZ4WC.js.map} +0 -0
  138. /package/dist/{chunk-LUFOAMN5.js.map → chunk-LKKKTBLL.js.map} +0 -0
  139. /package/dist/{chunk-QHCY4MBG.js.map → chunk-PKW3II5M.js.map} +0 -0
  140. /package/dist/{chunk-XL44IXBO.js.map → chunk-PT72OARU.js.map} +0 -0
  141. /package/dist/{chunk-TWJYL5YF.js.map → chunk-QQ444G6A.js.map} +0 -0
  142. /package/dist/{chunk-IOZCYSJ6.js.map → chunk-UAYXORU5.js.map} +0 -0
  143. /package/dist/{chunk-TZREEZ4C.js.map → chunk-WEL535AI.js.map} +0 -0
  144. /package/dist/{chunk-GGG6H4MK.js.map → chunk-XJKGCU2K.js.map} +0 -0
  145. /package/dist/{chunk-GZSQIOAH.js.map → chunk-XNRM3QGR.js.map} +0 -0
  146. /package/dist/{chunk-CZXN63A4.js.map → chunk-ZZZU6XER.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/taskset-drafts.ts","../src/dataset-preparation-authoring-contracts.ts","../src/taskset-draft-api-contracts.ts","../src/taskset-draft-client.ts","../src/task-inventory.ts","../src/taskset-intake.ts"],"sourcesContent":["export * from \"./taskset-draft-dataset-artifacts.js\";\nexport * from \"./taskset-draft-dataset-sources.js\";\nexport * from \"./connected-dataset-source.js\";\nexport * from \"./taskset-draft-harness-actions.js\";\nexport * from \"./taskset-draft-core.js\";\nexport * from \"./taskset-draft-document.js\";\nexport { TasksetMetricPolicySchema, type TasksetMetricPolicy } from \"@openpond/evals/metrics\";\nexport * from \"./taskset-draft-authoring.js\";\nexport * from \"./taskset-draft-files.js\";\nexport * from \"./taskset-draft-workspace.js\";\nexport * from \"./taskset-authored-contracts.js\";\nexport * from \"./task-design-contracts.js\";\nexport * from \"./dataset-preparation-authoring-contracts.js\";\nexport * from \"./taskset-authored-validation.js\";\nexport * from \"./taskset-draft-publication.js\";\nexport * from \"./taskset-draft-manifests.js\";\nexport * from \"./taskset-draft-api-contracts.js\";\nexport { OpenPondTasksetDraftClient, OpenPondTasksetDraftError } from \"./taskset-draft-client.js\";\nexport * from \"./task-inventory.js\";\nexport * from \"./taskset-intake.js\";\nexport * from \"./taskset-calibration-fixtures.js\";\n","import { z } from \"zod\";\nimport { DatasetBuildSpecificationSchema } from \"./taskset-authored-contracts.js\";\nimport { TasksetSourceRefSchema } from \"./taskset-draft-core.js\";\nimport { TaskDesignProposalSchema } from \"./task-design-contracts.js\";\n\nconst Id = z.string().min(1).max(240);\nconst Hash = z.string().regex(/^[a-f0-9]{64}$/);\nexport const DatasetPreparationAuthoringEvidenceSchema = z.array(z.object({\n source: TasksetSourceRefSchema,\n excerpts: z.array(z.object({ role: z.enum([\"user\", \"assistant\"]), text: z.string().max(200_000), turnId: Id }).strict()).max(200),\n}).strict()).min(1).max(20);\nexport const DatasetPreparationAuthoringRequestSchema = z.discriminatedUnion(\"action\", [\n z.object({ action: z.literal(\"messages\"), id: Id, evidence: DatasetPreparationAuthoringEvidenceSchema,\n instruction: z.string().max(2 * 1024 * 1024), buildSpecification: DatasetBuildSpecificationSchema,\n currentProposal: TaskDesignProposalSchema.nullable().default(null) }).strict(),\n z.object({ action: z.literal(\"validate\"), evidence: DatasetPreparationAuthoringEvidenceSchema,\n content: z.string().max(2 * 1024 * 1024) }).strict(),\n]);\nexport const DatasetPreparationAuthoringMessagesSchema = z.object({\n messages: z.array(z.object({ role: z.enum([\"system\", \"user\"]), content: z.string() }).strict()).min(1).max(20),\n skillHash: Hash,\n}).strict();\nexport const DatasetPreparationAuthoringProposalSchema = z.object({ proposal: TaskDesignProposalSchema, skillHash: Hash }).strict();\nexport type DatasetPreparationAuthoringRequest = z.input<typeof DatasetPreparationAuthoringRequestSchema>;\n","import { z } from \"zod\";\nimport { LearningRevisionRefSchema } from \"@openpond/evals/learning\";\nimport { TasksetDraftSchema, TasksetDraftStatusSchema } from \"./taskset-draft-document.js\";\nimport { TasksetDraftFileSchema, TasksetDraftFileInfoSchema } from \"./model-taskset-authoring-contracts.js\";\n\nconst IdSchema = TasksetDraftSchema.shape.id;\nconst RevisionSchema = z.number().int().positive();\nconst HashSchema = z.string().regex(/^[a-f0-9]{64}$/);\nconst scope = { teamId: IdSchema, modelId: IdSchema };\n\nexport const TasksetDraftCreateRequestSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetDraftCreate.v1\"),\n operationId: IdSchema, modelId: IdSchema, expectedModelRevision: RevisionSchema,\n name: TasksetDraftSchema.shape.name,\n}).strict();\nexport type TasksetDraftCreateRequest = z.infer<typeof TasksetDraftCreateRequestSchema>;\n\nexport const TasksetDraftSourceDescriptorSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetDraftSourceDescriptor.v1\"), ...scope,\n expectedModelRevision: RevisionSchema, sourcePackageHash: HashSchema,\n}).strict();\nexport const TasksetDraftReadbackSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetDraftReadback.v1\"), ...scope,\n draft: TasksetDraftSchema, workspaceHash: HashSchema, projectEtag: HashSchema,\n}).strict().refine(value => value.draft.profileId === value.teamId && value.draft.modelScope?.modelId === value.modelId,\n \"The hosted draft must belong to its declared workspace and Model.\");\nexport const TasksetDraftSummarySchema = z.object({\n id: IdSchema, revision: RevisionSchema, name: TasksetDraftSchema.shape.name,\n status: TasksetDraftStatusSchema, updatedAt: TasksetDraftSchema.shape.updatedAt,\n sourceTasksetRef: LearningRevisionRefSchema.nullable(),\n}).strict();\nexport const TasksetDraftListSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetDraftList.v1\"), ...scope,\n drafts: z.array(TasksetDraftSummarySchema).max(100), nextCursor: z.string().min(1).max(2_000).nullable(),\n}).strict();\nexport const TasksetDraftSaveRequestSchema = z.object({ expectedDraftRevision: RevisionSchema, draft: TasksetDraftSchema }).strict();\nexport const TasksetDraftRefreshRequestSchema = z.object({ expectedDraftRevision: RevisionSchema, expectedModelRevision: RevisionSchema }).strict();\nexport const TasksetDraftValidationRequestSchema = z.object({ expectedDraftRevision: RevisionSchema, expectedWorkspaceHash: HashSchema }).strict();\nexport const TasksetDraftValidationSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetDraftValidation.v1\"), ...scope,\n draftId: IdSchema, draftRevision: RevisionSchema, workspaceHash: HashSchema,\n valid: z.boolean(), issues: z.array(z.object({ code: z.string().min(1), severity: z.enum([\"warning\", \"error\"]), message: z.string(), path: z.string().nullable() }).strict()),\n packageHash: HashSchema.nullable(), tasksetRef: LearningRevisionRefSchema.nullable(),\n}).strict().refine(value => value.valid\n ? value.packageHash !== null && value.tasksetRef !== null && value.issues.every(issue => issue.severity !== \"error\")\n : value.packageHash === null && value.tasksetRef === null && value.issues.some(issue => issue.severity === \"error\"), \"Validation must retain either a compiled package or publication errors.\");\nexport const TasksetDraftPublicationRequestSchema = TasksetDraftValidationRequestSchema.extend({\n operationId: IdSchema, expectedPackageHash: HashSchema, expectedTasksetRef: LearningRevisionRefSchema,\n}).strict();\nexport const TasksetDraftFileListSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetDraftFileList.v1\"), ...scope,\n draftId: IdSchema, draftRevision: RevisionSchema, files: z.array(TasksetDraftFileInfoSchema).max(10_020),\n}).strict();\nexport const TasksetDraftFileReadbackSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetDraftFileReadback.v1\"), ...scope,\n draftId: IdSchema, draftRevision: RevisionSchema, file: TasksetDraftFileSchema,\n}).strict();\nexport const TasksetDraftDeletionSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetDraftDeletion.v1\"), ...scope,\n draftId: IdSchema, revision: RevisionSchema, deleted: z.literal(true),\n}).strict();\n\nexport type TasksetDraftSourceDescriptor = z.infer<typeof TasksetDraftSourceDescriptorSchema>;\nexport type TasksetDraftReadback = z.infer<typeof TasksetDraftReadbackSchema>;\nexport type TasksetDraftList = z.infer<typeof TasksetDraftListSchema>;\nexport type TasksetDraftSaveRequest = z.infer<typeof TasksetDraftSaveRequestSchema>;\nexport type TasksetDraftRefreshRequest = z.infer<typeof TasksetDraftRefreshRequestSchema>;\nexport type TasksetDraftValidationRequest = z.infer<typeof TasksetDraftValidationRequestSchema>;\nexport type TasksetDraftValidation = z.infer<typeof TasksetDraftValidationSchema>;\nexport type TasksetDraftPublicationRequest = z.infer<typeof TasksetDraftPublicationRequestSchema>;\nexport type TasksetDraftFileList = z.infer<typeof TasksetDraftFileListSchema>;\nexport type TasksetDraftFileReadback = z.infer<typeof TasksetDraftFileReadbackSchema>;\nexport type TasksetDraftDeletion = z.infer<typeof TasksetDraftDeletionSchema>;\n","import { z } from \"zod\";\nimport { contentHash, sha256 } from \"@openpond/harness\";\nimport { sameLearningRef } from \"@openpond/evals/learning\";\nimport { ModelTasksetDraftRequestSchema, TasksetDraftFileMutationSchema, TasksetDraftFilePathSchema, type ModelTasksetDraftRequest, type TasksetDraftFileMutation } from \"./model-taskset-authoring-contracts.js\";\nimport { TasksetDraftSchema } from \"./taskset-draft-document.js\";\nimport { decodeTasksetDraftFileContent } from \"./taskset-draft-files.js\";\nimport { MAX_TASKSET_DRAFT_WORKSPACE_BYTES } from \"./taskset-draft-workspace.js\";\nimport { TasksetPackageReceiptSchema } from \"./taskset-package-client.js\";\nimport { TasksetDraftCreateRequestSchema, type TasksetDraftCreateRequest, TasksetDraftSourceDescriptorSchema, TasksetDraftReadbackSchema, TasksetDraftListSchema, TasksetDraftSaveRequestSchema, TasksetDraftRefreshRequestSchema,\n TasksetDraftValidationRequestSchema, TasksetDraftValidationSchema, TasksetDraftPublicationRequestSchema, TasksetDraftFileListSchema, TasksetDraftFileReadbackSchema, TasksetDraftDeletionSchema,\n type TasksetDraftSaveRequest, type TasksetDraftRefreshRequest, type TasksetDraftValidationRequest, type TasksetDraftPublicationRequest } from \"./taskset-draft-api-contracts.js\";\n\ntype Options = { signal?: AbortSignal };\nconst IdSchema = TasksetDraftSchema.shape.id;\nconst RevisionSchema = z.number().int().positive();\n\nexport class OpenPondTasksetDraftError extends Error {\n constructor(readonly status: number, readonly code: string, message: string) { super(message); this.name = \"OpenPondTasksetDraftError\"; }\n}\n\n/** Scoped mutable drafts use explicit CAS and never retry writes automatically. */\nexport class OpenPondTasksetDraftClient {\n readonly #options: { baseUrl: string; apiKey: string; teamId: string; fetch?: typeof globalThis.fetch };\n constructor(options: { baseUrl: string; apiKey: string; teamId: string; fetch?: typeof globalThis.fetch }) {\n const url = new URL(options.baseUrl);\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password || url.search || url.hash || !options.apiKey.trim() || !options.teamId.trim()) throw new Error(\"Taskset draft client requires a clean HTTP(S) endpoint and workspace credentials.\");\n this.#options = { ...options, baseUrl: url.toString().replace(/\\/+$/, \"\") };\n }\n\n async inspectSource(modelId: string, expectedModelRevision: number, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const revision = RevisionSchema.parse(expectedModelRevision);\n const response = this.#scope(TasksetDraftSourceDescriptorSchema.parse(await this.#request(model, `/source?expectedModelRevision=${revision}`, \"GET\", undefined, options.signal)), model);\n if (response.expectedModelRevision !== revision) this.#mismatch();\n return response;\n }\n\n async initialize(input: ModelTasksetDraftRequest, options: Options = {}) {\n const request = ModelTasksetDraftRequestSchema.parse(input);\n const response = this.#draft(await this.#request(request.modelId, \"\", \"POST\", request, options.signal), request.modelId);\n const source = response.draft.modelScope?.source;\n if (!source || source.requestHash !== contentHash(request) || source.sourcePackageHash !== request.sourcePackageHash || source.draftId !== response.draft.id\n || source.lineage.owner.scopeId !== this.#options.teamId || source.lineage.owner.modelId !== request.modelId) this.#mismatch();\n return response;\n }\n\n async create(input: TasksetDraftCreateRequest, options: Options = {}) {\n const request = TasksetDraftCreateRequestSchema.parse(input);\n const response = this.#draft(await this.#request(request.modelId, \"\", \"POST\", request, options.signal), request.modelId);\n const expectedId = `model-taskset-draft-${contentHash({ owner: { scopeId: this.#options.teamId, modelId: request.modelId }, operationId: request.operationId })}`;\n if (response.draft.id !== expectedId || response.draft.modelScope?.source !== undefined) this.#mismatch();\n return response;\n }\n\n async list(modelId: string, options: Options & { limit?: number; cursor?: string } = {}) {\n const model = IdSchema.parse(modelId);\n const query = new URLSearchParams();\n if (options.limit !== undefined) query.set(\"limit\", String(z.number().int().min(1).max(100).parse(options.limit)));\n if (options.cursor !== undefined) query.set(\"cursor\", z.string().min(1).max(2_000).parse(options.cursor));\n return this.#scope(TasksetDraftListSchema.parse(await this.#request(model, query.size ? `?${query}` : \"\", \"GET\", undefined, options.signal)), model);\n }\n\n async get(modelId: string, draftId: string, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const id = IdSchema.parse(draftId);\n return this.#draft(await this.#request(model, `/${encodeURIComponent(id)}`, \"GET\", undefined, options.signal), model, id);\n }\n\n async save(modelId: string, input: TasksetDraftSaveRequest, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const request = TasksetDraftSaveRequestSchema.parse(input);\n return this.#draft(await this.#request(model, `/${encodeURIComponent(request.draft.id)}`, \"PUT\", request, options.signal), model, request.draft.id, request.expectedDraftRevision + 1);\n }\n\n async refreshModel(modelId: string, draftId: string, input: TasksetDraftRefreshRequest, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const id = IdSchema.parse(draftId);\n const request = TasksetDraftRefreshRequestSchema.parse(input);\n const response = this.#draft(await this.#request(model, `/${encodeURIComponent(id)}/refresh-model`, \"POST\", request, options.signal), model, id, request.expectedDraftRevision + 1);\n if (response.draft.modelScope?.expectedModelRevision !== request.expectedModelRevision) this.#mismatch();\n return response;\n }\n\n async files(modelId: string, draftId: string, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const id = IdSchema.parse(draftId);\n const response = this.#scope(TasksetDraftFileListSchema.parse(await this.#request(model, `/${encodeURIComponent(id)}/files`, \"GET\", undefined, options.signal)), model);\n if (response.draftId !== id) this.#mismatch();\n return response;\n }\n\n async readFile(modelId: string, draftId: string, path: string, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const id = IdSchema.parse(draftId);\n const relative = TasksetDraftFilePathSchema.parse(path);\n const response = this.#scope(TasksetDraftFileReadbackSchema.parse(await this.#request(model, `/${encodeURIComponent(id)}/file?path=${encodeURIComponent(relative)}`, \"GET\", undefined, options.signal)), model);\n if (response.draftId !== id || response.file.path !== relative) this.#mismatch();\n const bytes = decodeTasksetDraftFileContent(response.file.content);\n if (bytes.byteLength !== response.file.sizeBytes || sha256(bytes) !== response.file.contentHash) this.#mismatch();\n return response;\n }\n\n async saveFile(modelId: string, input: TasksetDraftFileMutation, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const request = TasksetDraftFileMutationSchema.parse(input);\n if (request.content) decodeTasksetDraftFileContent(request.content);\n return this.#draft(await this.#request(model, `/${encodeURIComponent(request.draftId)}/file`, \"PUT\", request, options.signal), model, request.draftId, request.expectedDraftRevision + 1);\n }\n\n async validate(modelId: string, draftId: string, input: TasksetDraftValidationRequest, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const id = IdSchema.parse(draftId);\n const request = TasksetDraftValidationRequestSchema.parse(input);\n const response = this.#scope(TasksetDraftValidationSchema.parse(await this.#request(model, `/${encodeURIComponent(id)}/validate`, \"POST\", request, options.signal)), model);\n if (response.draftId !== id || response.draftRevision !== request.expectedDraftRevision || response.workspaceHash !== request.expectedWorkspaceHash) this.#mismatch();\n return response;\n }\n\n async publish(modelId: string, draftId: string, input: TasksetDraftPublicationRequest, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const id = IdSchema.parse(draftId);\n const request = TasksetDraftPublicationRequestSchema.parse(input);\n const response = TasksetPackageReceiptSchema.parse(await this.#request(model, `/${encodeURIComponent(id)}/publish`, \"POST\", request, options.signal));\n if (response.teamId !== this.#options.teamId || response.modelProjectId !== model || response.operationId !== request.operationId\n || response.packageHash !== request.expectedPackageHash || !sameLearningRef(response.taskset, request.expectedTasksetRef) || response.selection !== \"select\") this.#mismatch();\n return response;\n }\n\n async delete(modelId: string, draftId: string, expectedDraftRevision: number, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const id = IdSchema.parse(draftId);\n const revision = RevisionSchema.parse(expectedDraftRevision);\n const response = this.#scope(TasksetDraftDeletionSchema.parse(await this.#request(model, `/${encodeURIComponent(id)}?expectedDraftRevision=${revision}`, \"DELETE\", undefined, options.signal)), model);\n if (response.draftId !== id || response.revision !== revision + 1) this.#mismatch();\n return response;\n }\n\n #scope<T extends { teamId: string; modelId: string }>(value: T, modelId: string): T {\n if (value.teamId !== this.#options.teamId || value.modelId !== modelId) this.#mismatch();\n return value;\n }\n #draft(input: unknown, modelId: string, draftId?: string, revision?: number) {\n const value = this.#scope(TasksetDraftReadbackSchema.parse(input), modelId);\n if ((draftId !== undefined && value.draft.id !== draftId) || (revision !== undefined && value.draft.revision !== revision)) this.#mismatch();\n return value;\n }\n #mismatch(): never { throw new OpenPondTasksetDraftError(502, \"draft_response_mismatch\", \"Taskset draft response differs from the requested owner, revision or content.\"); }\n\n async #request(model: string, path: string, method: string, body: unknown, signal?: AbortSignal): Promise<unknown> {\n const serialized = body === undefined ? undefined : JSON.stringify(body);\n if (serialized && new TextEncoder().encode(serialized).byteLength > MAX_TASKSET_DRAFT_WORKSPACE_BYTES) throw new OpenPondTasksetDraftError(413, \"draft_too_large\", \"Taskset draft exceeds the 64 MiB envelope.\");\n const response = await (this.#options.fetch ?? globalThis.fetch)(`${this.#options.baseUrl}/v1/models/${encodeURIComponent(model)}/taskset-drafts${path}`, {\n method, headers: { Authorization: `Bearer ${this.#options.apiKey}`, \"X-OpenPond-Team-Id\": this.#options.teamId, Accept: \"application/json\", ...(serialized ? { \"Content-Type\": \"application/json\" } : {}) },\n body: serialized, signal, redirect: \"error\",\n });\n const reader = response.body?.getReader();\n if (!reader) throw new OpenPondTasksetDraftError(response.status, \"empty_response\", \"Taskset draft response was empty.\");\n let bytes = 0;\n let text = \"\";\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n try {\n while (true) {\n const chunk = await reader.read();\n if (chunk.done) break;\n bytes += chunk.value.byteLength;\n if (bytes > MAX_TASKSET_DRAFT_WORKSPACE_BYTES) throw new OpenPondTasksetDraftError(413, \"draft_too_large\", \"Taskset draft response exceeds the 64 MiB envelope.\");\n text += decoder.decode(chunk.value, { stream: true });\n }\n text += decoder.decode();\n } finally { await reader.cancel(); reader.releaseLock(); }\n const value: unknown = JSON.parse(text);\n if (!response.ok) {\n const error = z.object({ code: z.string(), message: z.string() }).safeParse(value);\n throw new OpenPondTasksetDraftError(response.status, error.success ? error.data.code : \"draft_request_failed\", error.success ? error.data.message : `Taskset draft request failed (${response.status}).`);\n }\n return value;\n }\n}\n","import { z } from \"zod\";\nimport type { GraderSpec } from \"./taskset-draft-core.js\";\n\nconst Id = z.string().trim().min(1).max(500);\nexport const TaskInventoryQuerySchema = z.object({\n projectId: Id.optional(), tasksetId: Id.optional(), draftId: Id.optional(), taskId: Id.optional(),\n query: z.string().trim().max(1_000).default(\"\"),\n split: z.enum([\"train\", \"validation\", \"test\", \"frozen_eval\"]).optional(),\n after: z.string().min(1).max(2_000).optional(), limit: z.number().int().min(1).max(100).default(30),\n}).strict();\nexport const TaskScoringSummarySchema = z.object({ id: Id, method: z.enum([\"code\", \"judge\", \"human\"]), required: z.boolean() });\nexport const TaskInventoryItemSchema = z.object({\n tasksetId: Id, tasksetName: z.string(), tasksetRevision: z.number().int().positive(), tasksetHash: z.string(),\n taskId: Id, ordinal: z.number().int().nonnegative(), title: z.string(), description: z.string(), split: z.string(),\n scoring: z.array(TaskScoringSummarySchema), configuration: z.enum([\"configured\", \"needs_reward\", \"needs_checks\"]),\n draftId: Id.nullable().default(null), modelId: Id.nullable().default(null),\n});\nexport const TaskInventoryPageSchema = z.object({ items: z.array(TaskInventoryItemSchema).max(100), nextCursor: z.string().nullable() });\nexport type TaskInventoryQuery = z.infer<typeof TaskInventoryQuerySchema>;\nexport type TaskScoringSummary = z.infer<typeof TaskScoringSummarySchema>;\nexport type TaskInventoryItem = z.infer<typeof TaskInventoryItemSchema>;\nexport type TaskInventoryPage = z.infer<typeof TaskInventoryPageSchema>;\n\n/** Discovery derives only from public task input, never private references. */\nexport function describeTaskInput(input: Record<string, unknown>, id: string) {\n const text = [input.instruction, input.prompt, input.request, input.question, input.message]\n .find((value): value is string => typeof value === \"string\" && value.trim().length > 0);\n const explicitTitle = typeof input.title === \"string\" ? input.title.trim() : \"\";\n const description = text?.trim() ?? \"\";\n return { title: (explicitTitle || description || id).slice(0, 180), description: description.slice(0, 2_000) };\n}\nexport function summarizeTaskScoring(graders: GraderSpec[]): TaskScoringSummary[] {\n return graders.map(grader => ({ id: grader.id, method: grader.kind === \"model_judge\" ? \"judge\" : grader.kind === \"human\" ? \"human\" : \"code\", required: grader.hardGate }));\n}\nexport function taskConfiguration(graders: GraderSpec[]): TaskInventoryItem[\"configuration\"] {\n if (!graders.some(grader => grader.kind !== \"human\")) return \"needs_reward\";\n if (graders.some(grader => grader.kind === \"model_judge\" && grader.calibrationStatus !== \"passed\")) return \"needs_checks\";\n return \"configured\";\n}\n","import { contentHash } from \"@openpond/harness\";\nimport { previewTaskIntake, TaskIntakePreviewSchema, type TaskIntakePreview, type TaskIntakeFile } from \"@openpond/evals/learning\";\nimport { TaskDataDraftSchema, TasksetDraftSchema, type TasksetDraft } from \"./taskset-draft-document.js\";\nimport { createTasksetDraftFile } from \"./taskset-draft-files.js\";\n\n/** Retained source files are unreferenced private assets during publication.\n * A manifest preserves upload filenames without granting them filesystem paths. */\nexport function taskIntakeSourceFiles(preview: TaskIntakePreview, files: TaskIntakeFile[]) {\n if (previewTaskIntake({ format: preview.format, files }).contentHash !== preview.contentHash) throw new Error(\"The source files differ from the import preview.\");\n const directory = `private/intake/${preview.contentHash}`;\n const sources = files.map((file, index) => ({ file, path: `${directory}/${String(index).padStart(4, \"0\")}.txt` }));\n const manifest = { schemaVersion: \"openpond.taskIntakeSources.v1\", format: preview.format, previewHash: preview.contentHash,\n files: sources.map(({ file, path }) => ({ originalPath: file.path, retainedPath: path })) };\n return [...sources.map(({ file, path }) => createTasksetDraftFile(path, new TextEncoder().encode(file.text))),\n createTasksetDraftFile(`${directory}/manifest.json`, new TextEncoder().encode(JSON.stringify(manifest)))];\n}\n\n/** Raw history stays in Labeling until its task and runtime are reviewed. */\nexport function appendTaskIntake(draft: TasksetDraft, raw: TaskIntakePreview, recordIds: string[]): TasksetDraft {\n const preview = TaskIntakePreviewSchema.parse(raw);\n if (!recordIds.length || new Set(recordIds).size !== recordIds.length) throw new Error(\"Select unique task records to import.\");\n const tasks = [...draft.tasks];\n for (const id of recordIds) {\n const record = preview.records.find(record => record.id === id);\n if (!record || record.kind !== \"task\" || record.needsContext) throw new Error(\"Recorded attempts and incomplete histories must be imported into Labeling for review.\");\n const task = TaskDataDraftSchema.parse({ schemaVersion: \"openpond.taskData.v1\", id: record.id, clusterKey: record.familyKey,\n split: record.split, input: record.input, expectedOutput: record.expected, privilegedContextRef: null,\n metadata: { intake: { format: preview.format, uploadHash: preview.contentHash, sourceId: record.sourceId, sourceHash: record.sourceHash, metadata: record.metadata } },\n });\n const existing = tasks.find(existing => existing.id === task.id);\n if (existing && contentHash(existing) !== contentHash(task)) throw new Error(`Task ${task.id} already exists with different content. Import will not replace saved edits.`);\n if (!existing) tasks.push(task);\n }\n const families = new Map<string, string>();\n for (const task of tasks) for (const key of [`family:${task.clusterKey}`, `input:${contentHash(task.input)}`]) {\n if (families.has(key) && families.get(key) !== task.split) throw new Error(\"The imported task family or request already occurs in another split.\");\n families.set(key, task.split);\n }\n return TasksetDraftSchema.parse({ ...draft, tasks });\n}\n"],"mappings":"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","names":["z","z","z","IdSchema","RevisionSchema","z","z","Id","record","existing"]}
1
+ {"version":3,"sources":["../src/taskset-drafts.ts","../src/dataset-preparation-authoring-contracts.ts","../src/taskset-draft-api-contracts.ts","../src/taskset-draft-client.ts","../src/task-inventory.ts","../src/taskset-intake.ts"],"sourcesContent":["export * from \"./taskset-draft-dataset-artifacts.js\";\nexport * from \"./taskset-draft-dataset-sources.js\";\nexport * from \"./connected-dataset-source.js\";\nexport * from \"./taskset-draft-harness-actions.js\";\nexport * from \"./taskset-draft-core.js\";\nexport * from \"./taskset-draft-document.js\";\nexport { TasksetMetricPolicySchema, type TasksetMetricPolicy } from \"@openpond/evals/metrics\";\nexport * from \"./taskset-draft-authoring.js\";\nexport * from \"./taskset-draft-files.js\";\nexport * from \"./taskset-draft-workspace.js\";\nexport * from \"./taskset-authored-contracts.js\";\nexport * from \"./task-design-contracts.js\";\nexport * from \"./dataset-preparation-authoring-contracts.js\";\nexport * from \"./taskset-authored-validation.js\";\nexport * from \"./taskset-draft-publication.js\";\nexport * from \"./taskset-draft-manifests.js\";\nexport * from \"./taskset-draft-api-contracts.js\";\nexport { OpenPondTasksetDraftClient, OpenPondTasksetDraftError } from \"./taskset-draft-client.js\";\nexport * from \"./task-inventory.js\";\nexport * from \"./taskset-intake.js\";\nexport * from \"./taskset-calibration-fixtures.js\";\n","import { z } from \"zod\";\nimport { DatasetBuildSpecificationSchema } from \"./taskset-authored-contracts.js\";\nimport { TasksetSourceRefSchema } from \"./taskset-draft-core.js\";\nimport { TaskDesignProposalSchema } from \"./task-design-contracts.js\";\n\nconst Id = z.string().min(1).max(240);\nconst Hash = z.string().regex(/^[a-f0-9]{64}$/);\nexport const DatasetPreparationAuthoringEvidenceSchema = z.array(z.object({\n source: TasksetSourceRefSchema,\n excerpts: z.array(z.object({ role: z.enum([\"user\", \"assistant\"]), text: z.string().max(200_000), turnId: Id }).strict()).max(200),\n}).strict()).min(1).max(20);\nexport const DatasetPreparationAuthoringRequestSchema = z.discriminatedUnion(\"action\", [\n z.object({ action: z.literal(\"messages\"), id: Id, evidence: DatasetPreparationAuthoringEvidenceSchema,\n instruction: z.string().max(2 * 1024 * 1024), buildSpecification: DatasetBuildSpecificationSchema,\n currentProposal: TaskDesignProposalSchema.nullable().default(null) }).strict(),\n z.object({ action: z.literal(\"validate\"), evidence: DatasetPreparationAuthoringEvidenceSchema,\n content: z.string().max(2 * 1024 * 1024) }).strict(),\n]);\nexport const DatasetPreparationAuthoringMessagesSchema = z.object({\n messages: z.array(z.object({ role: z.enum([\"system\", \"user\"]), content: z.string() }).strict()).min(1).max(20),\n skillHash: Hash,\n}).strict();\nexport const DatasetPreparationAuthoringProposalSchema = z.object({ proposal: TaskDesignProposalSchema, skillHash: Hash }).strict();\nexport type DatasetPreparationAuthoringRequest = z.input<typeof DatasetPreparationAuthoringRequestSchema>;\n","import { z } from \"zod\";\nimport { LearningRevisionRefSchema } from \"@openpond/evals/learning\";\nimport { TasksetDraftSchema, TasksetDraftStatusSchema } from \"./taskset-draft-document.js\";\nimport { TasksetDraftFileSchema, TasksetDraftFileInfoSchema } from \"./model-taskset-authoring-contracts.js\";\n\nconst IdSchema = TasksetDraftSchema.shape.id;\nconst RevisionSchema = z.number().int().positive();\nconst HashSchema = z.string().regex(/^[a-f0-9]{64}$/);\nconst scope = { teamId: IdSchema, modelId: IdSchema };\n\nexport const TasksetDraftCreateRequestSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetDraftCreate.v1\"),\n operationId: IdSchema, modelId: IdSchema, expectedModelRevision: RevisionSchema,\n name: TasksetDraftSchema.shape.name,\n}).strict();\nexport type TasksetDraftCreateRequest = z.infer<typeof TasksetDraftCreateRequestSchema>;\n\nexport const TasksetDraftSourceDescriptorSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetDraftSourceDescriptor.v1\"), ...scope,\n expectedModelRevision: RevisionSchema, sourcePackageHash: HashSchema,\n}).strict();\nexport const TasksetDraftReadbackSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetDraftReadback.v1\"), ...scope,\n draft: TasksetDraftSchema, workspaceHash: HashSchema, projectEtag: HashSchema,\n}).strict().refine(value => value.draft.profileId === value.teamId && value.draft.modelScope?.modelId === value.modelId,\n \"The hosted draft must belong to its declared workspace and Model.\");\nexport const TasksetDraftSummarySchema = z.object({\n id: IdSchema, revision: RevisionSchema, name: TasksetDraftSchema.shape.name,\n status: TasksetDraftStatusSchema, updatedAt: TasksetDraftSchema.shape.updatedAt,\n sourceTasksetRef: LearningRevisionRefSchema.nullable(),\n}).strict();\nexport const TasksetDraftListSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetDraftList.v1\"), ...scope,\n drafts: z.array(TasksetDraftSummarySchema).max(100), nextCursor: z.string().min(1).max(2_000).nullable(),\n}).strict();\nexport const TasksetDraftSaveRequestSchema = z.object({ expectedDraftRevision: RevisionSchema, draft: TasksetDraftSchema }).strict();\nexport const TasksetDraftRefreshRequestSchema = z.object({ expectedDraftRevision: RevisionSchema, expectedModelRevision: RevisionSchema }).strict();\nexport const TasksetDraftValidationRequestSchema = z.object({ expectedDraftRevision: RevisionSchema, expectedWorkspaceHash: HashSchema }).strict();\nexport const TasksetDraftValidationSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetDraftValidation.v1\"), ...scope,\n draftId: IdSchema, draftRevision: RevisionSchema, workspaceHash: HashSchema,\n valid: z.boolean(), issues: z.array(z.object({ code: z.string().min(1), severity: z.enum([\"warning\", \"error\"]), message: z.string(), path: z.string().nullable() }).strict()),\n packageHash: HashSchema.nullable(), tasksetRef: LearningRevisionRefSchema.nullable(),\n}).strict().refine(value => value.valid\n ? value.packageHash !== null && value.tasksetRef !== null && value.issues.every(issue => issue.severity !== \"error\")\n : value.packageHash === null && value.tasksetRef === null && value.issues.some(issue => issue.severity === \"error\"), \"Validation must retain either a compiled package or publication errors.\");\nexport const TasksetDraftPublicationRequestSchema = TasksetDraftValidationRequestSchema.extend({\n operationId: IdSchema, expectedPackageHash: HashSchema, expectedTasksetRef: LearningRevisionRefSchema,\n}).strict();\nexport const TasksetDraftFileListSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetDraftFileList.v1\"), ...scope,\n draftId: IdSchema, draftRevision: RevisionSchema, files: z.array(TasksetDraftFileInfoSchema).max(10_020),\n}).strict();\nexport const TasksetDraftFileReadbackSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetDraftFileReadback.v1\"), ...scope,\n draftId: IdSchema, draftRevision: RevisionSchema, file: TasksetDraftFileSchema,\n}).strict();\nexport const TasksetDraftDeletionSchema = z.object({\n schemaVersion: z.literal(\"openpond.tasksetDraftDeletion.v1\"), ...scope,\n draftId: IdSchema, revision: RevisionSchema, deleted: z.literal(true),\n}).strict();\n\nexport type TasksetDraftSourceDescriptor = z.infer<typeof TasksetDraftSourceDescriptorSchema>;\nexport type TasksetDraftReadback = z.infer<typeof TasksetDraftReadbackSchema>;\nexport type TasksetDraftList = z.infer<typeof TasksetDraftListSchema>;\nexport type TasksetDraftSaveRequest = z.infer<typeof TasksetDraftSaveRequestSchema>;\nexport type TasksetDraftRefreshRequest = z.infer<typeof TasksetDraftRefreshRequestSchema>;\nexport type TasksetDraftValidationRequest = z.infer<typeof TasksetDraftValidationRequestSchema>;\nexport type TasksetDraftValidation = z.infer<typeof TasksetDraftValidationSchema>;\nexport type TasksetDraftPublicationRequest = z.infer<typeof TasksetDraftPublicationRequestSchema>;\nexport type TasksetDraftFileList = z.infer<typeof TasksetDraftFileListSchema>;\nexport type TasksetDraftFileReadback = z.infer<typeof TasksetDraftFileReadbackSchema>;\nexport type TasksetDraftDeletion = z.infer<typeof TasksetDraftDeletionSchema>;\n","import { z } from \"zod\";\nimport { contentHash, sha256 } from \"@openpond/harness\";\nimport { sameLearningRef } from \"@openpond/evals/learning\";\nimport { ModelTasksetDraftRequestSchema, TasksetDraftFileMutationSchema, TasksetDraftFilePathSchema, type ModelTasksetDraftRequest, type TasksetDraftFileMutation } from \"./model-taskset-authoring-contracts.js\";\nimport { TasksetDraftSchema } from \"./taskset-draft-document.js\";\nimport { decodeTasksetDraftFileContent } from \"./taskset-draft-files.js\";\nimport { MAX_TASKSET_DRAFT_WORKSPACE_BYTES } from \"./taskset-draft-workspace.js\";\nimport { TasksetPackageReceiptSchema } from \"./taskset-package-client.js\";\nimport { TasksetDraftCreateRequestSchema, type TasksetDraftCreateRequest, TasksetDraftSourceDescriptorSchema, TasksetDraftReadbackSchema, TasksetDraftListSchema, TasksetDraftSaveRequestSchema, TasksetDraftRefreshRequestSchema,\n TasksetDraftValidationRequestSchema, TasksetDraftValidationSchema, TasksetDraftPublicationRequestSchema, TasksetDraftFileListSchema, TasksetDraftFileReadbackSchema, TasksetDraftDeletionSchema,\n type TasksetDraftSaveRequest, type TasksetDraftRefreshRequest, type TasksetDraftValidationRequest, type TasksetDraftPublicationRequest } from \"./taskset-draft-api-contracts.js\";\n\ntype Options = { signal?: AbortSignal };\nconst IdSchema = TasksetDraftSchema.shape.id;\nconst RevisionSchema = z.number().int().positive();\n\nexport class OpenPondTasksetDraftError extends Error {\n constructor(readonly status: number, readonly code: string, message: string) { super(message); this.name = \"OpenPondTasksetDraftError\"; }\n}\n\n/** Scoped mutable drafts use explicit CAS and never retry writes automatically. */\nexport class OpenPondTasksetDraftClient {\n readonly #options: { baseUrl: string; apiKey: string; teamId: string; fetch?: typeof globalThis.fetch };\n constructor(options: { baseUrl: string; apiKey: string; teamId: string; fetch?: typeof globalThis.fetch }) {\n const url = new URL(options.baseUrl);\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password || url.search || url.hash || !options.apiKey.trim() || !options.teamId.trim()) throw new Error(\"Taskset draft client requires a clean HTTP(S) endpoint and workspace credentials.\");\n this.#options = { ...options, baseUrl: url.toString().replace(/\\/+$/, \"\") };\n }\n\n async inspectSource(modelId: string, expectedModelRevision: number, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const revision = RevisionSchema.parse(expectedModelRevision);\n const response = this.#scope(TasksetDraftSourceDescriptorSchema.parse(await this.#request(model, `/source?expectedModelRevision=${revision}`, \"GET\", undefined, options.signal)), model);\n if (response.expectedModelRevision !== revision) this.#mismatch();\n return response;\n }\n\n async initialize(input: ModelTasksetDraftRequest, options: Options = {}) {\n const request = ModelTasksetDraftRequestSchema.parse(input);\n const response = this.#draft(await this.#request(request.modelId, \"\", \"POST\", request, options.signal), request.modelId);\n const source = response.draft.modelScope?.source;\n if (!source || source.requestHash !== contentHash(request) || source.sourcePackageHash !== request.sourcePackageHash || source.draftId !== response.draft.id\n || source.lineage.owner.scopeId !== this.#options.teamId || source.lineage.owner.modelId !== request.modelId) this.#mismatch();\n return response;\n }\n\n async create(input: TasksetDraftCreateRequest, options: Options = {}) {\n const request = TasksetDraftCreateRequestSchema.parse(input);\n const response = this.#draft(await this.#request(request.modelId, \"\", \"POST\", request, options.signal), request.modelId);\n const expectedId = `model-taskset-draft-${contentHash({ owner: { scopeId: this.#options.teamId, modelId: request.modelId }, operationId: request.operationId })}`;\n if (response.draft.id !== expectedId || response.draft.modelScope?.source !== undefined) this.#mismatch();\n return response;\n }\n\n async list(modelId: string, options: Options & { limit?: number; cursor?: string } = {}) {\n const model = IdSchema.parse(modelId);\n const query = new URLSearchParams();\n if (options.limit !== undefined) query.set(\"limit\", String(z.number().int().min(1).max(100).parse(options.limit)));\n if (options.cursor !== undefined) query.set(\"cursor\", z.string().min(1).max(2_000).parse(options.cursor));\n return this.#scope(TasksetDraftListSchema.parse(await this.#request(model, query.size ? `?${query}` : \"\", \"GET\", undefined, options.signal)), model);\n }\n\n async get(modelId: string, draftId: string, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const id = IdSchema.parse(draftId);\n return this.#draft(await this.#request(model, `/${encodeURIComponent(id)}`, \"GET\", undefined, options.signal), model, id);\n }\n\n async save(modelId: string, input: TasksetDraftSaveRequest, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const request = TasksetDraftSaveRequestSchema.parse(input);\n return this.#draft(await this.#request(model, `/${encodeURIComponent(request.draft.id)}`, \"PUT\", request, options.signal), model, request.draft.id, request.expectedDraftRevision + 1);\n }\n\n async refreshModel(modelId: string, draftId: string, input: TasksetDraftRefreshRequest, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const id = IdSchema.parse(draftId);\n const request = TasksetDraftRefreshRequestSchema.parse(input);\n const response = this.#draft(await this.#request(model, `/${encodeURIComponent(id)}/refresh-model`, \"POST\", request, options.signal), model, id, request.expectedDraftRevision + 1);\n if (response.draft.modelScope?.expectedModelRevision !== request.expectedModelRevision) this.#mismatch();\n return response;\n }\n\n async files(modelId: string, draftId: string, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const id = IdSchema.parse(draftId);\n const response = this.#scope(TasksetDraftFileListSchema.parse(await this.#request(model, `/${encodeURIComponent(id)}/files`, \"GET\", undefined, options.signal)), model);\n if (response.draftId !== id) this.#mismatch();\n return response;\n }\n\n async readFile(modelId: string, draftId: string, path: string, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const id = IdSchema.parse(draftId);\n const relative = TasksetDraftFilePathSchema.parse(path);\n const response = this.#scope(TasksetDraftFileReadbackSchema.parse(await this.#request(model, `/${encodeURIComponent(id)}/file?path=${encodeURIComponent(relative)}`, \"GET\", undefined, options.signal)), model);\n if (response.draftId !== id || response.file.path !== relative) this.#mismatch();\n const bytes = decodeTasksetDraftFileContent(response.file.content);\n if (bytes.byteLength !== response.file.sizeBytes || sha256(bytes) !== response.file.contentHash) this.#mismatch();\n return response;\n }\n\n async saveFile(modelId: string, input: TasksetDraftFileMutation, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const request = TasksetDraftFileMutationSchema.parse(input);\n if (request.content) decodeTasksetDraftFileContent(request.content);\n return this.#draft(await this.#request(model, `/${encodeURIComponent(request.draftId)}/file`, \"PUT\", request, options.signal), model, request.draftId, request.expectedDraftRevision + 1);\n }\n\n async validate(modelId: string, draftId: string, input: TasksetDraftValidationRequest, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const id = IdSchema.parse(draftId);\n const request = TasksetDraftValidationRequestSchema.parse(input);\n const response = this.#scope(TasksetDraftValidationSchema.parse(await this.#request(model, `/${encodeURIComponent(id)}/validate`, \"POST\", request, options.signal)), model);\n if (response.draftId !== id || response.draftRevision !== request.expectedDraftRevision || response.workspaceHash !== request.expectedWorkspaceHash) this.#mismatch();\n return response;\n }\n\n async publish(modelId: string, draftId: string, input: TasksetDraftPublicationRequest, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const id = IdSchema.parse(draftId);\n const request = TasksetDraftPublicationRequestSchema.parse(input);\n const response = TasksetPackageReceiptSchema.parse(await this.#request(model, `/${encodeURIComponent(id)}/publish`, \"POST\", request, options.signal));\n if (response.teamId !== this.#options.teamId || response.modelProjectId !== model || response.operationId !== request.operationId\n || response.packageHash !== request.expectedPackageHash || !sameLearningRef(response.taskset, request.expectedTasksetRef) || response.selection !== \"select\") this.#mismatch();\n return response;\n }\n\n async delete(modelId: string, draftId: string, expectedDraftRevision: number, options: Options = {}) {\n const model = IdSchema.parse(modelId);\n const id = IdSchema.parse(draftId);\n const revision = RevisionSchema.parse(expectedDraftRevision);\n const response = this.#scope(TasksetDraftDeletionSchema.parse(await this.#request(model, `/${encodeURIComponent(id)}?expectedDraftRevision=${revision}`, \"DELETE\", undefined, options.signal)), model);\n if (response.draftId !== id || response.revision !== revision + 1) this.#mismatch();\n return response;\n }\n\n #scope<T extends { teamId: string; modelId: string }>(value: T, modelId: string): T {\n if (value.teamId !== this.#options.teamId || value.modelId !== modelId) this.#mismatch();\n return value;\n }\n #draft(input: unknown, modelId: string, draftId?: string, revision?: number) {\n const value = this.#scope(TasksetDraftReadbackSchema.parse(input), modelId);\n if ((draftId !== undefined && value.draft.id !== draftId) || (revision !== undefined && value.draft.revision !== revision)) this.#mismatch();\n return value;\n }\n #mismatch(): never { throw new OpenPondTasksetDraftError(502, \"draft_response_mismatch\", \"Taskset draft response differs from the requested owner, revision or content.\"); }\n\n async #request(model: string, path: string, method: string, body: unknown, signal?: AbortSignal): Promise<unknown> {\n const serialized = body === undefined ? undefined : JSON.stringify(body);\n if (serialized && new TextEncoder().encode(serialized).byteLength > MAX_TASKSET_DRAFT_WORKSPACE_BYTES) throw new OpenPondTasksetDraftError(413, \"draft_too_large\", \"Taskset draft exceeds the 64 MiB envelope.\");\n const response = await (this.#options.fetch ?? globalThis.fetch)(`${this.#options.baseUrl}/v1/models/${encodeURIComponent(model)}/taskset-drafts${path}`, {\n method, headers: { Authorization: `Bearer ${this.#options.apiKey}`, \"X-OpenPond-Team-Id\": this.#options.teamId, Accept: \"application/json\", ...(serialized ? { \"Content-Type\": \"application/json\" } : {}) },\n body: serialized, signal, redirect: \"error\",\n });\n const reader = response.body?.getReader();\n if (!reader) throw new OpenPondTasksetDraftError(response.status, \"empty_response\", \"Taskset draft response was empty.\");\n let bytes = 0;\n let text = \"\";\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n try {\n while (true) {\n const chunk = await reader.read();\n if (chunk.done) break;\n bytes += chunk.value.byteLength;\n if (bytes > MAX_TASKSET_DRAFT_WORKSPACE_BYTES) throw new OpenPondTasksetDraftError(413, \"draft_too_large\", \"Taskset draft response exceeds the 64 MiB envelope.\");\n text += decoder.decode(chunk.value, { stream: true });\n }\n text += decoder.decode();\n } finally { await reader.cancel(); reader.releaseLock(); }\n const value: unknown = JSON.parse(text);\n if (!response.ok) {\n const error = z.object({ code: z.string(), message: z.string() }).safeParse(value);\n throw new OpenPondTasksetDraftError(response.status, error.success ? error.data.code : \"draft_request_failed\", error.success ? error.data.message : `Taskset draft request failed (${response.status}).`);\n }\n return value;\n }\n}\n","import { z } from \"zod\";\nimport type { GraderSpec } from \"./taskset-draft-core.js\";\n\nconst Id = z.string().trim().min(1).max(500);\nexport const TaskInventoryQuerySchema = z.object({\n projectId: Id.optional(), tasksetId: Id.optional(), draftId: Id.optional(), taskId: Id.optional(),\n query: z.string().trim().max(1_000).default(\"\"),\n split: z.enum([\"train\", \"validation\", \"test\", \"frozen_eval\"]).optional(),\n after: z.string().min(1).max(2_000).optional(), limit: z.number().int().min(1).max(100).default(30),\n}).strict();\nexport const TaskScoringSummarySchema = z.object({ id: Id, method: z.enum([\"code\", \"judge\", \"human\"]), required: z.boolean() });\nexport const TaskInventoryItemSchema = z.object({\n tasksetId: Id, tasksetName: z.string(), tasksetRevision: z.number().int().positive(), tasksetHash: z.string(),\n taskId: Id, ordinal: z.number().int().nonnegative(), title: z.string(), description: z.string(), split: z.string(),\n scoring: z.array(TaskScoringSummarySchema), configuration: z.enum([\"configured\", \"needs_reward\", \"needs_checks\"]),\n draftId: Id.nullable().default(null), modelId: Id.nullable().default(null),\n});\nexport const TaskInventoryPageSchema = z.object({ items: z.array(TaskInventoryItemSchema).max(100), nextCursor: z.string().nullable() });\nexport type TaskInventoryQuery = z.infer<typeof TaskInventoryQuerySchema>;\nexport type TaskScoringSummary = z.infer<typeof TaskScoringSummarySchema>;\nexport type TaskInventoryItem = z.infer<typeof TaskInventoryItemSchema>;\nexport type TaskInventoryPage = z.infer<typeof TaskInventoryPageSchema>;\n\n/** Discovery derives only from public task input, never private references. */\nexport function describeTaskInput(input: Record<string, unknown>, id: string) {\n const text = [input.instruction, input.prompt, input.request, input.question, input.message]\n .find((value): value is string => typeof value === \"string\" && value.trim().length > 0);\n const explicitTitle = typeof input.title === \"string\" ? input.title.trim() : \"\";\n const description = text?.trim() ?? \"\";\n return { title: (explicitTitle || description || id).slice(0, 180), description: description.slice(0, 2_000) };\n}\nexport function summarizeTaskScoring(graders: GraderSpec[]): TaskScoringSummary[] {\n return graders.map(grader => ({ id: grader.id, method: grader.kind === \"model_judge\" ? \"judge\" : grader.kind === \"human\" ? \"human\" : \"code\", required: grader.hardGate }));\n}\nexport function taskConfiguration(graders: GraderSpec[]): TaskInventoryItem[\"configuration\"] {\n if (!graders.some(grader => grader.kind !== \"human\")) return \"needs_reward\";\n if (graders.some(grader => grader.kind === \"model_judge\" && grader.calibrationStatus !== \"passed\")) return \"needs_checks\";\n return \"configured\";\n}\n","import { contentHash } from \"@openpond/harness\";\nimport { previewTaskIntake, TaskIntakePreviewSchema, type TaskIntakePreview, type TaskIntakeFile } from \"@openpond/evals/learning\";\nimport { TaskDataDraftSchema, TasksetDraftSchema, type TasksetDraft } from \"./taskset-draft-document.js\";\nimport { createTasksetDraftFile } from \"./taskset-draft-files.js\";\n\n/** Retained source files are unreferenced private assets during publication.\n * A manifest preserves upload filenames without granting them filesystem paths. */\nexport function taskIntakeSourceFiles(preview: TaskIntakePreview, files: TaskIntakeFile[]) {\n if (previewTaskIntake({ format: preview.format, files }).contentHash !== preview.contentHash) throw new Error(\"The source files differ from the import preview.\");\n const directory = `private/intake/${preview.contentHash}`;\n const sources = files.map((file, index) => ({ file, path: `${directory}/${String(index).padStart(4, \"0\")}.txt` }));\n const manifest = { schemaVersion: \"openpond.taskIntakeSources.v1\", format: preview.format, previewHash: preview.contentHash,\n files: sources.map(({ file, path }) => ({ originalPath: file.path, retainedPath: path })) };\n return [...sources.map(({ file, path }) => createTasksetDraftFile(path, new TextEncoder().encode(file.text))),\n createTasksetDraftFile(`${directory}/manifest.json`, new TextEncoder().encode(JSON.stringify(manifest)))];\n}\n\n/** Raw history stays in Labeling until its task and runtime are reviewed. */\nexport function appendTaskIntake(draft: TasksetDraft, raw: TaskIntakePreview, recordIds: string[]): TasksetDraft {\n const preview = TaskIntakePreviewSchema.parse(raw);\n if (!recordIds.length || new Set(recordIds).size !== recordIds.length) throw new Error(\"Select unique task records to import.\");\n const tasks = [...draft.tasks];\n for (const id of recordIds) {\n const record = preview.records.find(record => record.id === id);\n if (!record || record.kind !== \"task\" || record.needsContext) throw new Error(\"Recorded attempts and incomplete histories must be imported into Labeling for review.\");\n const task = TaskDataDraftSchema.parse({ schemaVersion: \"openpond.taskData.v1\", id: record.id, clusterKey: record.familyKey,\n split: record.split, input: record.input, expectedOutput: record.expected, privilegedContextRef: null,\n metadata: { intake: { format: preview.format, uploadHash: preview.contentHash, sourceId: record.sourceId, sourceHash: record.sourceHash, metadata: record.metadata } },\n });\n const existing = tasks.find(existing => existing.id === task.id);\n if (existing && contentHash(existing) !== contentHash(task)) throw new Error(`Task ${task.id} already exists with different content. Import will not replace saved edits.`);\n if (!existing) tasks.push(task);\n }\n const families = new Map<string, string>();\n for (const task of tasks) for (const key of [`family:${task.clusterKey}`, `input:${contentHash(task.input)}`]) {\n if (families.has(key) && families.get(key) !== task.split) throw new Error(\"The imported task family or request already occurs in another split.\");\n families.set(key, task.split);\n }\n return TasksetDraftSchema.parse({ ...draft, tasks });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,SAAS,iCAA2D;;;ACNpE,SAAS,SAAS;AAKlB,IAAM,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AACpC,IAAM,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB;AACvC,IAAM,4CAA4C,EAAE,MAAM,EAAE,OAAO;AAAA,EACxE,QAAQ;AAAA,EACR,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,WAAW,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,GAAO,GAAG,QAAQ,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,IAAI,GAAG;AAClI,CAAC,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AACnB,IAAM,2CAA2C,EAAE,mBAAmB,UAAU;AAAA,EACrF,EAAE,OAAO;AAAA,IAAE,QAAQ,EAAE,QAAQ,UAAU;AAAA,IAAG,IAAI;AAAA,IAAI,UAAU;AAAA,IAC1D,aAAa,EAAE,OAAO,EAAE,IAAI,IAAI,OAAO,IAAI;AAAA,IAAG,oBAAoB;AAAA,IAClE,iBAAiB,yBAAyB,SAAS,EAAE,QAAQ,IAAI;AAAA,EAAE,CAAC,EAAE,OAAO;AAAA,EAC/E,EAAE,OAAO;AAAA,IAAE,QAAQ,EAAE,QAAQ,UAAU;AAAA,IAAG,UAAU;AAAA,IAClD,SAAS,EAAE,OAAO,EAAE,IAAI,IAAI,OAAO,IAAI;AAAA,EAAE,CAAC,EAAE,OAAO;AACvD,CAAC;AACM,IAAM,4CAA4C,EAAE,OAAO;AAAA,EAChE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,MAAM,CAAC,GAAG,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EAC7G,WAAW;AACb,CAAC,EAAE,OAAO;AACH,IAAM,4CAA4C,EAAE,OAAO,EAAE,UAAU,0BAA0B,WAAW,KAAK,CAAC,EAAE,OAAO;;;ACtBlI,SAAS,KAAAA,UAAS;AAClB,SAAS,iCAAiC;AAI1C,IAAM,WAAW,mBAAmB,MAAM;AAC1C,IAAM,iBAAiBC,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AACjD,IAAM,aAAaA,GAAE,OAAO,EAAE,MAAM,gBAAgB;AACpD,IAAM,QAAQ,EAAE,QAAQ,UAAU,SAAS,SAAS;AAE7C,IAAM,kCAAkCA,GAAE,OAAO;AAAA,EACtD,eAAeA,GAAE,QAAQ,gCAAgC;AAAA,EACzD,aAAa;AAAA,EAAU,SAAS;AAAA,EAAU,uBAAuB;AAAA,EACjE,MAAM,mBAAmB,MAAM;AACjC,CAAC,EAAE,OAAO;AAGH,IAAM,qCAAqCA,GAAE,OAAO;AAAA,EACzD,eAAeA,GAAE,QAAQ,0CAA0C;AAAA,EAAG,GAAG;AAAA,EACzE,uBAAuB;AAAA,EAAgB,mBAAmB;AAC5D,CAAC,EAAE,OAAO;AACH,IAAM,6BAA6BA,GAAE,OAAO;AAAA,EACjD,eAAeA,GAAE,QAAQ,kCAAkC;AAAA,EAAG,GAAG;AAAA,EACjE,OAAO;AAAA,EAAoB,eAAe;AAAA,EAAY,aAAa;AACrE,CAAC,EAAE,OAAO,EAAE;AAAA,EAAO,WAAS,MAAM,MAAM,cAAc,MAAM,UAAU,MAAM,MAAM,YAAY,YAAY,MAAM;AAAA,EAC9G;AAAmE;AAC9D,IAAM,4BAA4BA,GAAE,OAAO;AAAA,EAChD,IAAI;AAAA,EAAU,UAAU;AAAA,EAAgB,MAAM,mBAAmB,MAAM;AAAA,EACvE,QAAQ;AAAA,EAA0B,WAAW,mBAAmB,MAAM;AAAA,EACtE,kBAAkB,0BAA0B,SAAS;AACvD,CAAC,EAAE,OAAO;AACH,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EAC7C,eAAeA,GAAE,QAAQ,8BAA8B;AAAA,EAAG,GAAG;AAAA,EAC7D,QAAQA,GAAE,MAAM,yBAAyB,EAAE,IAAI,GAAG;AAAA,EAAG,YAAYA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAK,EAAE,SAAS;AACzG,CAAC,EAAE,OAAO;AACH,IAAM,gCAAgCA,GAAE,OAAO,EAAE,uBAAuB,gBAAgB,OAAO,mBAAmB,CAAC,EAAE,OAAO;AAC5H,IAAM,mCAAmCA,GAAE,OAAO,EAAE,uBAAuB,gBAAgB,uBAAuB,eAAe,CAAC,EAAE,OAAO;AAC3I,IAAM,sCAAsCA,GAAE,OAAO,EAAE,uBAAuB,gBAAgB,uBAAuB,WAAW,CAAC,EAAE,OAAO;AAC1I,IAAM,+BAA+BA,GAAE,OAAO;AAAA,EACnD,eAAeA,GAAE,QAAQ,oCAAoC;AAAA,EAAG,GAAG;AAAA,EACnE,SAAS;AAAA,EAAU,eAAe;AAAA,EAAgB,eAAe;AAAA,EACjE,OAAOA,GAAE,QAAQ;AAAA,EAAG,QAAQA,GAAE,MAAMA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,GAAG,UAAUA,GAAE,KAAK,CAAC,WAAW,OAAO,CAAC,GAAG,SAASA,GAAE,OAAO,GAAG,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC;AAAA,EAC5K,aAAa,WAAW,SAAS;AAAA,EAAG,YAAY,0BAA0B,SAAS;AACrF,CAAC,EAAE,OAAO,EAAE,OAAO,WAAS,MAAM,QAC9B,MAAM,gBAAgB,QAAQ,MAAM,eAAe,QAAQ,MAAM,OAAO,MAAM,WAAS,MAAM,aAAa,OAAO,IACjH,MAAM,gBAAgB,QAAQ,MAAM,eAAe,QAAQ,MAAM,OAAO,KAAK,WAAS,MAAM,aAAa,OAAO,GAAG,yEAAyE;AACzL,IAAM,uCAAuC,oCAAoC,OAAO;AAAA,EAC7F,aAAa;AAAA,EAAU,qBAAqB;AAAA,EAAY,oBAAoB;AAC9E,CAAC,EAAE,OAAO;AACH,IAAM,6BAA6BA,GAAE,OAAO;AAAA,EACjD,eAAeA,GAAE,QAAQ,kCAAkC;AAAA,EAAG,GAAG;AAAA,EACjE,SAAS;AAAA,EAAU,eAAe;AAAA,EAAgB,OAAOA,GAAE,MAAM,0BAA0B,EAAE,IAAI,KAAM;AACzG,CAAC,EAAE,OAAO;AACH,IAAM,iCAAiCA,GAAE,OAAO;AAAA,EACrD,eAAeA,GAAE,QAAQ,sCAAsC;AAAA,EAAG,GAAG;AAAA,EACrE,SAAS;AAAA,EAAU,eAAe;AAAA,EAAgB,MAAM;AAC1D,CAAC,EAAE,OAAO;AACH,IAAM,6BAA6BA,GAAE,OAAO;AAAA,EACjD,eAAeA,GAAE,QAAQ,kCAAkC;AAAA,EAAG,GAAG;AAAA,EACjE,SAAS;AAAA,EAAU,UAAU;AAAA,EAAgB,SAASA,GAAE,QAAQ,IAAI;AACtE,CAAC,EAAE,OAAO;;;AC5DV,SAAS,KAAAC,UAAS;AAElB,SAAS,uBAAuB;AAWhC,IAAMC,YAAW,mBAAmB,MAAM;AAC1C,IAAMC,kBAAiBC,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAE1C,IAAM,4BAAN,cAAwC,MAAM;AAAA,EACnD,YAAqB,QAAyB,MAAc,SAAiB;AAAE,UAAM,OAAO;AAAvE;AAAyB;AAAiD,SAAK,OAAO;AAAA,EAA6B;AAAA,EAAnH;AAAA,EAAyB;AAChD;AAGO,IAAM,6BAAN,MAAiC;AAAA,EAC7B;AAAA,EACT,YAAY,SAA+F;AACzG,UAAM,MAAM,IAAI,IAAI,QAAQ,OAAO;AACnC,QAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,IAAI,QAAQ,KAAK,IAAI,YAAY,IAAI,YAAY,IAAI,UAAU,IAAI,QAAQ,CAAC,QAAQ,OAAO,KAAK,KAAK,CAAC,QAAQ,OAAO,KAAK,EAAG,OAAM,IAAI,MAAM,mFAAmF;AAClQ,SAAK,WAAW,EAAE,GAAG,SAAS,SAAS,IAAI,SAAS,EAAE,QAAQ,QAAQ,EAAE,EAAE;AAAA,EAC5E;AAAA,EAEA,MAAM,cAAc,SAAiB,uBAA+B,UAAmB,CAAC,GAAG;AACzF,UAAM,QAAQF,UAAS,MAAM,OAAO;AACpC,UAAM,WAAWC,gBAAe,MAAM,qBAAqB;AAC3D,UAAM,WAAW,KAAK,OAAO,mCAAmC,MAAM,MAAM,KAAK,SAAS,OAAO,iCAAiC,QAAQ,IAAI,OAAO,QAAW,QAAQ,MAAM,CAAC,GAAG,KAAK;AACvL,QAAI,SAAS,0BAA0B,SAAU,MAAK,UAAU;AAChE,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,OAAiC,UAAmB,CAAC,GAAG;AACvE,UAAM,UAAU,+BAA+B,MAAM,KAAK;AAC1D,UAAM,WAAW,KAAK,OAAO,MAAM,KAAK,SAAS,QAAQ,SAAS,IAAI,QAAQ,SAAS,QAAQ,MAAM,GAAG,QAAQ,OAAO;AACvH,UAAM,SAAS,SAAS,MAAM,YAAY;AAC1C,QAAI,CAAC,UAAU,OAAO,gBAAgB,YAAY,OAAO,KAAK,OAAO,sBAAsB,QAAQ,qBAAqB,OAAO,YAAY,SAAS,MAAM,MACrJ,OAAO,QAAQ,MAAM,YAAY,KAAK,SAAS,UAAU,OAAO,QAAQ,MAAM,YAAY,QAAQ,QAAS,MAAK,UAAU;AAC/H,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,OAAkC,UAAmB,CAAC,GAAG;AACpE,UAAM,UAAU,gCAAgC,MAAM,KAAK;AAC3D,UAAM,WAAW,KAAK,OAAO,MAAM,KAAK,SAAS,QAAQ,SAAS,IAAI,QAAQ,SAAS,QAAQ,MAAM,GAAG,QAAQ,OAAO;AACvH,UAAM,aAAa,uBAAuB,YAAY,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS,QAAQ,SAAS,QAAQ,QAAQ,GAAG,aAAa,QAAQ,YAAY,CAAC,CAAC;AAC/J,QAAI,SAAS,MAAM,OAAO,cAAc,SAAS,MAAM,YAAY,WAAW,OAAW,MAAK,UAAU;AACxG,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,SAAiB,UAAyD,CAAC,GAAG;AACvF,UAAM,QAAQD,UAAS,MAAM,OAAO;AACpC,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,UAAU,OAAW,OAAM,IAAI,SAAS,OAAOE,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,MAAM,QAAQ,KAAK,CAAC,CAAC;AACjH,QAAI,QAAQ,WAAW,OAAW,OAAM,IAAI,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAK,EAAE,MAAM,QAAQ,MAAM,CAAC;AACxG,WAAO,KAAK,OAAO,uBAAuB,MAAM,MAAM,KAAK,SAAS,OAAO,MAAM,OAAO,IAAI,KAAK,KAAK,IAAI,OAAO,QAAW,QAAQ,MAAM,CAAC,GAAG,KAAK;AAAA,EACrJ;AAAA,EAEA,MAAM,IAAI,SAAiB,SAAiB,UAAmB,CAAC,GAAG;AACjE,UAAM,QAAQF,UAAS,MAAM,OAAO;AACpC,UAAM,KAAKA,UAAS,MAAM,OAAO;AACjC,WAAO,KAAK,OAAO,MAAM,KAAK,SAAS,OAAO,IAAI,mBAAmB,EAAE,CAAC,IAAI,OAAO,QAAW,QAAQ,MAAM,GAAG,OAAO,EAAE;AAAA,EAC1H;AAAA,EAEA,MAAM,KAAK,SAAiB,OAAgC,UAAmB,CAAC,GAAG;AACjF,UAAM,QAAQA,UAAS,MAAM,OAAO;AACpC,UAAM,UAAU,8BAA8B,MAAM,KAAK;AACzD,WAAO,KAAK,OAAO,MAAM,KAAK,SAAS,OAAO,IAAI,mBAAmB,QAAQ,MAAM,EAAE,CAAC,IAAI,OAAO,SAAS,QAAQ,MAAM,GAAG,OAAO,QAAQ,MAAM,IAAI,QAAQ,wBAAwB,CAAC;AAAA,EACvL;AAAA,EAEA,MAAM,aAAa,SAAiB,SAAiB,OAAmC,UAAmB,CAAC,GAAG;AAC7G,UAAM,QAAQA,UAAS,MAAM,OAAO;AACpC,UAAM,KAAKA,UAAS,MAAM,OAAO;AACjC,UAAM,UAAU,iCAAiC,MAAM,KAAK;AAC5D,UAAM,WAAW,KAAK,OAAO,MAAM,KAAK,SAAS,OAAO,IAAI,mBAAmB,EAAE,CAAC,kBAAkB,QAAQ,SAAS,QAAQ,MAAM,GAAG,OAAO,IAAI,QAAQ,wBAAwB,CAAC;AAClL,QAAI,SAAS,MAAM,YAAY,0BAA0B,QAAQ,sBAAuB,MAAK,UAAU;AACvG,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,SAAiB,SAAiB,UAAmB,CAAC,GAAG;AACnE,UAAM,QAAQA,UAAS,MAAM,OAAO;AACpC,UAAM,KAAKA,UAAS,MAAM,OAAO;AACjC,UAAM,WAAW,KAAK,OAAO,2BAA2B,MAAM,MAAM,KAAK,SAAS,OAAO,IAAI,mBAAmB,EAAE,CAAC,UAAU,OAAO,QAAW,QAAQ,MAAM,CAAC,GAAG,KAAK;AACtK,QAAI,SAAS,YAAY,GAAI,MAAK,UAAU;AAC5C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,SAAiB,SAAiB,MAAc,UAAmB,CAAC,GAAG;AACpF,UAAM,QAAQA,UAAS,MAAM,OAAO;AACpC,UAAM,KAAKA,UAAS,MAAM,OAAO;AACjC,UAAM,WAAW,2BAA2B,MAAM,IAAI;AACtD,UAAM,WAAW,KAAK,OAAO,+BAA+B,MAAM,MAAM,KAAK,SAAS,OAAO,IAAI,mBAAmB,EAAE,CAAC,cAAc,mBAAmB,QAAQ,CAAC,IAAI,OAAO,QAAW,QAAQ,MAAM,CAAC,GAAG,KAAK;AAC9M,QAAI,SAAS,YAAY,MAAM,SAAS,KAAK,SAAS,SAAU,MAAK,UAAU;AAC/E,UAAM,QAAQ,8BAA8B,SAAS,KAAK,OAAO;AACjE,QAAI,MAAM,eAAe,SAAS,KAAK,aAAa,OAAO,KAAK,MAAM,SAAS,KAAK,YAAa,MAAK,UAAU;AAChH,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,SAAiB,OAAiC,UAAmB,CAAC,GAAG;AACtF,UAAM,QAAQA,UAAS,MAAM,OAAO;AACpC,UAAM,UAAU,+BAA+B,MAAM,KAAK;AAC1D,QAAI,QAAQ,QAAS,+BAA8B,QAAQ,OAAO;AAClE,WAAO,KAAK,OAAO,MAAM,KAAK,SAAS,OAAO,IAAI,mBAAmB,QAAQ,OAAO,CAAC,SAAS,OAAO,SAAS,QAAQ,MAAM,GAAG,OAAO,QAAQ,SAAS,QAAQ,wBAAwB,CAAC;AAAA,EAC1L;AAAA,EAEA,MAAM,SAAS,SAAiB,SAAiB,OAAsC,UAAmB,CAAC,GAAG;AAC5G,UAAM,QAAQA,UAAS,MAAM,OAAO;AACpC,UAAM,KAAKA,UAAS,MAAM,OAAO;AACjC,UAAM,UAAU,oCAAoC,MAAM,KAAK;AAC/D,UAAM,WAAW,KAAK,OAAO,6BAA6B,MAAM,MAAM,KAAK,SAAS,OAAO,IAAI,mBAAmB,EAAE,CAAC,aAAa,QAAQ,SAAS,QAAQ,MAAM,CAAC,GAAG,KAAK;AAC1K,QAAI,SAAS,YAAY,MAAM,SAAS,kBAAkB,QAAQ,yBAAyB,SAAS,kBAAkB,QAAQ,sBAAuB,MAAK,UAAU;AACpK,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,SAAiB,SAAiB,OAAuC,UAAmB,CAAC,GAAG;AAC5G,UAAM,QAAQA,UAAS,MAAM,OAAO;AACpC,UAAM,KAAKA,UAAS,MAAM,OAAO;AACjC,UAAM,UAAU,qCAAqC,MAAM,KAAK;AAChE,UAAM,WAAW,4BAA4B,MAAM,MAAM,KAAK,SAAS,OAAO,IAAI,mBAAmB,EAAE,CAAC,YAAY,QAAQ,SAAS,QAAQ,MAAM,CAAC;AACpJ,QAAI,SAAS,WAAW,KAAK,SAAS,UAAU,SAAS,mBAAmB,SAAS,SAAS,gBAAgB,QAAQ,eACjH,SAAS,gBAAgB,QAAQ,uBAAuB,CAAC,gBAAgB,SAAS,SAAS,QAAQ,kBAAkB,KAAK,SAAS,cAAc,SAAU,MAAK,UAAU;AAC/K,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,SAAiB,SAAiB,uBAA+B,UAAmB,CAAC,GAAG;AACnG,UAAM,QAAQA,UAAS,MAAM,OAAO;AACpC,UAAM,KAAKA,UAAS,MAAM,OAAO;AACjC,UAAM,WAAWC,gBAAe,MAAM,qBAAqB;AAC3D,UAAM,WAAW,KAAK,OAAO,2BAA2B,MAAM,MAAM,KAAK,SAAS,OAAO,IAAI,mBAAmB,EAAE,CAAC,0BAA0B,QAAQ,IAAI,UAAU,QAAW,QAAQ,MAAM,CAAC,GAAG,KAAK;AACrM,QAAI,SAAS,YAAY,MAAM,SAAS,aAAa,WAAW,EAAG,MAAK,UAAU;AAClF,WAAO;AAAA,EACT;AAAA,EAEA,OAAsD,OAAU,SAAoB;AAClF,QAAI,MAAM,WAAW,KAAK,SAAS,UAAU,MAAM,YAAY,QAAS,MAAK,UAAU;AACvF,WAAO;AAAA,EACT;AAAA,EACA,OAAO,OAAgB,SAAiB,SAAkB,UAAmB;AAC3E,UAAM,QAAQ,KAAK,OAAO,2BAA2B,MAAM,KAAK,GAAG,OAAO;AAC1E,QAAK,YAAY,UAAa,MAAM,MAAM,OAAO,WAAa,aAAa,UAAa,MAAM,MAAM,aAAa,SAAW,MAAK,UAAU;AAC3I,WAAO;AAAA,EACT;AAAA,EACA,YAAmB;AAAE,UAAM,IAAI,0BAA0B,KAAK,2BAA2B,+EAA+E;AAAA,EAAG;AAAA,EAE3K,MAAM,SAAS,OAAe,MAAc,QAAgB,MAAe,QAAwC;AACjH,UAAM,aAAa,SAAS,SAAY,SAAY,KAAK,UAAU,IAAI;AACvE,QAAI,cAAc,IAAI,YAAY,EAAE,OAAO,UAAU,EAAE,aAAa,kCAAmC,OAAM,IAAI,0BAA0B,KAAK,mBAAmB,4CAA4C;AAC/M,UAAM,WAAW,OAAO,KAAK,SAAS,SAAS,WAAW,OAAO,GAAG,KAAK,SAAS,OAAO,cAAc,mBAAmB,KAAK,CAAC,kBAAkB,IAAI,IAAI;AAAA,MACxJ;AAAA,MAAQ,SAAS,EAAE,eAAe,UAAU,KAAK,SAAS,MAAM,IAAI,sBAAsB,KAAK,SAAS,QAAQ,QAAQ,oBAAoB,GAAI,aAAa,EAAE,gBAAgB,mBAAmB,IAAI,CAAC,EAAG;AAAA,MAC1M,MAAM;AAAA,MAAY;AAAA,MAAQ,UAAU;AAAA,IACtC,CAAC;AACD,UAAM,SAAS,SAAS,MAAM,UAAU;AACxC,QAAI,CAAC,OAAQ,OAAM,IAAI,0BAA0B,SAAS,QAAQ,kBAAkB,mCAAmC;AACvH,QAAI,QAAQ;AACZ,QAAI,OAAO;AACX,UAAM,UAAU,IAAI,YAAY,SAAS,EAAE,OAAO,KAAK,CAAC;AACxD,QAAI;AACF,aAAO,MAAM;AACX,cAAM,QAAQ,MAAM,OAAO,KAAK;AAChC,YAAI,MAAM,KAAM;AAChB,iBAAS,MAAM,MAAM;AACrB,YAAI,QAAQ,kCAAmC,OAAM,IAAI,0BAA0B,KAAK,mBAAmB,qDAAqD;AAChK,gBAAQ,QAAQ,OAAO,MAAM,OAAO,EAAE,QAAQ,KAAK,CAAC;AAAA,MACtD;AACA,cAAQ,QAAQ,OAAO;AAAA,IACzB,UAAE;AAAU,YAAM,OAAO,OAAO;AAAG,aAAO,YAAY;AAAA,IAAG;AACzD,UAAM,QAAiB,KAAK,MAAM,IAAI;AACtC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQC,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,GAAG,SAASA,GAAE,OAAO,EAAE,CAAC,EAAE,UAAU,KAAK;AACjF,YAAM,IAAI,0BAA0B,SAAS,QAAQ,MAAM,UAAU,MAAM,KAAK,OAAO,wBAAwB,MAAM,UAAU,MAAM,KAAK,UAAU,iCAAiC,SAAS,MAAM,IAAI;AAAA,IAC1M;AACA,WAAO;AAAA,EACT;AACF;;;ACjLA,SAAS,KAAAC,UAAS;AAGlB,IAAMC,MAAKD,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AACpC,IAAM,2BAA2BA,GAAE,OAAO;AAAA,EAC/C,WAAWC,IAAG,SAAS;AAAA,EAAG,WAAWA,IAAG,SAAS;AAAA,EAAG,SAASA,IAAG,SAAS;AAAA,EAAG,QAAQA,IAAG,SAAS;AAAA,EAChG,OAAOD,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,GAAK,EAAE,QAAQ,EAAE;AAAA,EAC9C,OAAOA,GAAE,KAAK,CAAC,SAAS,cAAc,QAAQ,aAAa,CAAC,EAAE,SAAS;AAAA,EACvE,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAK,EAAE,SAAS;AAAA,EAAG,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE;AACpG,CAAC,EAAE,OAAO;AACH,IAAM,2BAA2BA,GAAE,OAAO,EAAE,IAAIC,KAAI,QAAQD,GAAE,KAAK,CAAC,QAAQ,SAAS,OAAO,CAAC,GAAG,UAAUA,GAAE,QAAQ,EAAE,CAAC;AACvH,IAAM,0BAA0BA,GAAE,OAAO;AAAA,EAC9C,WAAWC;AAAA,EAAI,aAAaD,GAAE,OAAO;AAAA,EAAG,iBAAiBA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAAG,aAAaA,GAAE,OAAO;AAAA,EAC5G,QAAQC;AAAA,EAAI,SAASD,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAAG,OAAOA,GAAE,OAAO;AAAA,EAAG,aAAaA,GAAE,OAAO;AAAA,EAAG,OAAOA,GAAE,OAAO;AAAA,EACjH,SAASA,GAAE,MAAM,wBAAwB;AAAA,EAAG,eAAeA,GAAE,KAAK,CAAC,cAAc,gBAAgB,cAAc,CAAC;AAAA,EAChH,SAASC,IAAG,SAAS,EAAE,QAAQ,IAAI;AAAA,EAAG,SAASA,IAAG,SAAS,EAAE,QAAQ,IAAI;AAC3E,CAAC;AACM,IAAM,0BAA0BD,GAAE,OAAO,EAAE,OAAOA,GAAE,MAAM,uBAAuB,EAAE,IAAI,GAAG,GAAG,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAOhI,SAAS,kBAAkB,OAAgC,IAAY;AAC5E,QAAM,OAAO,CAAC,MAAM,aAAa,MAAM,QAAQ,MAAM,SAAS,MAAM,UAAU,MAAM,OAAO,EACxF,KAAK,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,CAAC;AACxF,QAAM,gBAAgB,OAAO,MAAM,UAAU,WAAW,MAAM,MAAM,KAAK,IAAI;AAC7E,QAAM,cAAc,MAAM,KAAK,KAAK;AACpC,SAAO,EAAE,QAAQ,iBAAiB,eAAe,IAAI,MAAM,GAAG,GAAG,GAAG,aAAa,YAAY,MAAM,GAAG,GAAK,EAAE;AAC/G;AACO,SAAS,qBAAqB,SAA6C;AAChF,SAAO,QAAQ,IAAI,aAAW,EAAE,IAAI,OAAO,IAAI,QAAQ,OAAO,SAAS,gBAAgB,UAAU,OAAO,SAAS,UAAU,UAAU,QAAQ,UAAU,OAAO,SAAS,EAAE;AAC3K;AACO,SAAS,kBAAkB,SAA2D;AAC3F,MAAI,CAAC,QAAQ,KAAK,YAAU,OAAO,SAAS,OAAO,EAAG,QAAO;AAC7D,MAAI,QAAQ,KAAK,YAAU,OAAO,SAAS,iBAAiB,OAAO,sBAAsB,QAAQ,EAAG,QAAO;AAC3G,SAAO;AACT;;;ACrCA,SAAS,mBAAmB,+BAA4E;AAMjG,SAAS,sBAAsB,SAA4B,OAAyB;AACzF,MAAI,kBAAkB,EAAE,QAAQ,QAAQ,QAAQ,MAAM,CAAC,EAAE,gBAAgB,QAAQ,YAAa,OAAM,IAAI,MAAM,kDAAkD;AAChK,QAAM,YAAY,kBAAkB,QAAQ,WAAW;AACvD,QAAM,UAAU,MAAM,IAAI,CAAC,MAAM,WAAW,EAAE,MAAM,MAAM,GAAG,SAAS,IAAI,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,OAAO,EAAE;AACjH,QAAM,WAAW;AAAA,IAAE,eAAe;AAAA,IAAiC,QAAQ,QAAQ;AAAA,IAAQ,aAAa,QAAQ;AAAA,IAC9G,OAAO,QAAQ,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,EAAE,cAAc,KAAK,MAAM,cAAc,KAAK,EAAE;AAAA,EAAE;AAC5F,SAAO;AAAA,IAAC,GAAG,QAAQ,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,uBAAuB,MAAM,IAAI,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC;AAAA,IAC1G,uBAAuB,GAAG,SAAS,kBAAkB,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,QAAQ,CAAC,CAAC;AAAA,EAAC;AAC5G;AAGO,SAAS,iBAAiB,OAAqB,KAAwB,WAAmC;AAC/G,QAAM,UAAU,wBAAwB,MAAM,GAAG;AACjD,MAAI,CAAC,UAAU,UAAU,IAAI,IAAI,SAAS,EAAE,SAAS,UAAU,OAAQ,OAAM,IAAI,MAAM,uCAAuC;AAC9H,QAAM,QAAQ,CAAC,GAAG,MAAM,KAAK;AAC7B,aAAW,MAAM,WAAW;AAC1B,UAAM,SAAS,QAAQ,QAAQ,KAAK,CAAAE,YAAUA,QAAO,OAAO,EAAE;AAC9D,QAAI,CAAC,UAAU,OAAO,SAAS,UAAU,OAAO,aAAc,OAAM,IAAI,MAAM,uFAAuF;AACrK,UAAM,OAAO,oBAAoB,MAAM;AAAA,MAAE,eAAe;AAAA,MAAwB,IAAI,OAAO;AAAA,MAAI,YAAY,OAAO;AAAA,MAChH,OAAO,OAAO;AAAA,MAAO,OAAO,OAAO;AAAA,MAAO,gBAAgB,OAAO;AAAA,MAAU,sBAAsB;AAAA,MACjG,UAAU,EAAE,QAAQ,EAAE,QAAQ,QAAQ,QAAQ,YAAY,QAAQ,aAAa,UAAU,OAAO,UAAU,YAAY,OAAO,YAAY,UAAU,OAAO,SAAS,EAAE;AAAA,IACvK,CAAC;AACD,UAAM,WAAW,MAAM,KAAK,CAAAC,cAAYA,UAAS,OAAO,KAAK,EAAE;AAC/D,QAAI,YAAY,YAAY,QAAQ,MAAM,YAAY,IAAI,EAAG,OAAM,IAAI,MAAM,QAAQ,KAAK,EAAE,8EAA8E;AAC1K,QAAI,CAAC,SAAU,OAAM,KAAK,IAAI;AAAA,EAChC;AACA,QAAM,WAAW,oBAAI,IAAoB;AACzC,aAAW,QAAQ,MAAO,YAAW,OAAO,CAAC,UAAU,KAAK,UAAU,IAAI,SAAS,YAAY,KAAK,KAAK,CAAC,EAAE,GAAG;AAC7G,QAAI,SAAS,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,MAAM,KAAK,MAAO,OAAM,IAAI,MAAM,sEAAsE;AACjJ,aAAS,IAAI,KAAK,KAAK,KAAK;AAAA,EAC9B;AACA,SAAO,mBAAmB,MAAM,EAAE,GAAG,OAAO,MAAM,CAAC;AACrD;","names":["z","z","z","IdSchema","RevisionSchema","z","z","Id","record","existing"]}
@@ -7,7 +7,13 @@ import {
7
7
  inspectModelBatchPackage,
8
8
  materializeTasksetDraftWorkspace,
9
9
  prepareTasksetDraftSource
10
- } from "./chunk-XL44IXBO.js";
10
+ } from "./chunk-PT72OARU.js";
11
+ import {
12
+ learningVerifierModule,
13
+ prepareImportedTasksetPackage,
14
+ projectLearningBatchGraders,
15
+ tasksetPackageSourceId
16
+ } from "./chunk-ICFFZ4WC.js";
11
17
  import {
12
18
  OpenPondTasksetPackageClient,
13
19
  OpenPondTasksetPackageError,
@@ -16,18 +22,12 @@ import {
16
22
  TasksetPackageReadbackSchema,
17
23
  TasksetPackageReceiptSchema,
18
24
  TasksetReleasePackageReadbackSchema
19
- } from "./chunk-GZSQIOAH.js";
25
+ } from "./chunk-XNRM3QGR.js";
20
26
  import {
21
27
  ModelBatchReviewInspectionSchema,
22
28
  ModelBatchReviewReceiptSchema,
23
29
  ModelBatchReviewRequestSchema
24
30
  } from "./chunk-GPQLBVQC.js";
25
- import {
26
- learningVerifierModule,
27
- prepareImportedTasksetPackage,
28
- projectLearningBatchGraders,
29
- tasksetPackageSourceId
30
- } from "./chunk-EEZ5YHJQ.js";
31
31
  import {
32
32
  AuthoredTasksetFileInventorySchema,
33
33
  compileModelTasksetDraftWorkspace,
@@ -35,9 +35,7 @@ import {
35
35
  prepareAuthoredTasksetSource,
36
36
  prepareModelTasksetDraft,
37
37
  publishModelTasksetDraftPackage
38
- } from "./chunk-TZREEZ4C.js";
39
- import "./chunk-U4QIGSP5.js";
40
- import "./chunk-Z252BNAZ.js";
38
+ } from "./chunk-WEL535AI.js";
41
39
  import {
42
40
  materializePortableTasksetRelease,
43
41
  portableTasksetEnvironment,
@@ -46,7 +44,8 @@ import {
46
44
  projectPreferenceComparisonRelease,
47
45
  resolvePortableTasksetRewardExecution
48
46
  } from "./chunk-ATVQQCYN.js";
49
- import "./chunk-IOZCYSJ6.js";
47
+ import "./chunk-4L556MYM.js";
48
+ import "./chunk-UAYXORU5.js";
50
49
  import {
51
50
  MAX_TASKSET_PACKAGE_BYTES,
52
51
  TasksetPackageContentSchema,
@@ -63,7 +62,11 @@ import {
63
62
  tasksetPackageRewardBinding,
64
63
  validateTasksetLearningResources,
65
64
  validateTasksetPackage
66
- } from "./chunk-RFKZSSLB.js";
65
+ } from "./chunk-7WKCQ4V5.js";
66
+ import "./chunk-WOD72SFI.js";
67
+ import "./chunk-EZME7DV4.js";
68
+ import "./chunk-GX6KMHW2.js";
69
+ import "./chunk-Z252BNAZ.js";
67
70
  import {
68
71
  ModelTasksetAuthoringOwnerSchema,
69
72
  ModelTasksetAuthoringSchema,
@@ -75,15 +78,15 @@ import {
75
78
  TasksetDraftFilePathSchema,
76
79
  TasksetDraftFileSchema
77
80
  } from "./chunk-TK3DXH7A.js";
78
- import "./chunk-EYMZQML2.js";
79
- import "./chunk-MRUDFIB6.js";
80
- import "./chunk-UWM2ZPGS.js";
81
- import "./chunk-Q4TKI2MV.js";
82
81
  import "./chunk-H3367ISL.js";
83
- import "./chunk-WYR3MZHU.js";
84
- import "./chunk-EWRWGFKD.js";
85
- import "./chunk-CJDEVI3T.js";
86
- import "./chunk-YSEYPMQ3.js";
82
+ import "./chunk-5QMREXMU.js";
83
+ import "./chunk-7FYPFHCQ.js";
84
+ import "./chunk-Q4TKI2MV.js";
85
+ import "./chunk-HDKP6KE2.js";
86
+ import "./chunk-IIQENUOK.js";
87
+ import "./chunk-LT2YQCZI.js";
88
+ import "./chunk-BQ2C2Y54.js";
89
+ import "./chunk-B3ZHJ2KK.js";
87
90
  import "./chunk-CL3IOOVL.js";
88
91
  import "./chunk-H3JZ3P5T.js";
89
92
  import "./chunk-YLJ4XMA6.js";
@@ -0,0 +1,202 @@
1
+ import "./chunk-YLJ4XMA6.js";
2
+
3
+ // src/tool-learning-local-store.ts
4
+ import { DatabaseSync } from "node:sqlite";
5
+ import { chmodSync, closeSync, existsSync, lstatSync, mkdirSync, openSync } from "node:fs";
6
+ import { join } from "node:path";
7
+ import {
8
+ TOOL_LEARNING_LIMITS,
9
+ ToolEpisodeEventSchema,
10
+ ToolLearningCapturePolicySchema,
11
+ ToolLearningIdSchema,
12
+ toolLearningContentHash,
13
+ assertToolEpisodeCapturePolicy
14
+ } from "@openpond/evals/tool-learning";
15
+ import { z } from "zod";
16
+ var LocalToolLearningInstallationSchema = z.object({
17
+ schemaVersion: z.literal("openpond.localToolLearningInstallation.v1"),
18
+ id: ToolLearningIdSchema,
19
+ teamId: ToolLearningIdSchema,
20
+ projectId: ToolLearningIdSchema,
21
+ client: z.enum(["claude_code", "openpond"]),
22
+ workspaceRoot: z.string().min(1).max(4e3),
23
+ enabled: z.boolean(),
24
+ policy: ToolLearningCapturePolicySchema,
25
+ createdAt: z.iso.datetime({ offset: true })
26
+ }).strict();
27
+ var ToolLearningLocalStore = class {
28
+ db;
29
+ constructor(home) {
30
+ const directory = join(home, "tool-learning");
31
+ if (existsSync(directory) && lstatSync(directory).isSymbolicLink())
32
+ throw new Error("tool_learning_directory_symlink_forbidden");
33
+ mkdirSync(directory, { recursive: true, mode: 448 });
34
+ chmodSync(directory, 448);
35
+ const filename = join(directory, "queue.sqlite");
36
+ if (existsSync(filename)) {
37
+ if (!lstatSync(filename).isFile() || lstatSync(filename).isSymbolicLink())
38
+ throw new Error("tool_learning_queue_file_invalid");
39
+ } else {
40
+ closeSync(openSync(filename, "wx", 384));
41
+ }
42
+ chmodSync(filename, 384);
43
+ this.db = new DatabaseSync(filename);
44
+ this.db.exec(
45
+ "PRAGMA busy_timeout = 3000; PRAGMA journal_mode = WAL; PRAGMA synchronous = FULL;"
46
+ );
47
+ this.db.exec(`
48
+ CREATE TABLE IF NOT EXISTS installations (id TEXT PRIMARY KEY, payload TEXT NOT NULL);
49
+ CREATE TABLE IF NOT EXISTS events (
50
+ id TEXT PRIMARY KEY, installation_id TEXT NOT NULL, episode_id TEXT NOT NULL,
51
+ policy_hash TEXT NOT NULL, content_hash TEXT NOT NULL,
52
+ payload TEXT NOT NULL, size_bytes INTEGER NOT NULL, received_at INTEGER NOT NULL
53
+ );
54
+ CREATE INDEX IF NOT EXISTS events_installation ON events(installation_id, received_at, id);
55
+ CREATE INDEX IF NOT EXISTS events_episode ON events(installation_id, episode_id);
56
+ CREATE INDEX IF NOT EXISTS events_policy ON events(installation_id, policy_hash, received_at, id);
57
+ CREATE TABLE IF NOT EXISTS counters (
58
+ installation_id TEXT PRIMARY KEY, dropped INTEGER NOT NULL DEFAULT 0, expired INTEGER NOT NULL DEFAULT 0
59
+ );
60
+ `);
61
+ }
62
+ close() {
63
+ this.db.close();
64
+ }
65
+ installation(id) {
66
+ const row = this.db.prepare("SELECT payload FROM installations WHERE id = ?").get(id);
67
+ return row ? LocalToolLearningInstallationSchema.parse(JSON.parse(String(row.payload))) : null;
68
+ }
69
+ installations() {
70
+ return this.db.prepare("SELECT payload FROM installations ORDER BY id").all().map((row) => LocalToolLearningInstallationSchema.parse(JSON.parse(String(row.payload))));
71
+ }
72
+ configure(value) {
73
+ const installation = LocalToolLearningInstallationSchema.parse(value);
74
+ this.transaction(() => {
75
+ const previous = this.installation(installation.id);
76
+ if (previous && ["teamId", "projectId", "client", "workspaceRoot"].some(
77
+ (key) => previous[key] !== installation[key]
78
+ ))
79
+ throw new Error("tool_learning_installation_scope_immutable");
80
+ if (previous && (installation.policy.revision < previous.policy.revision || installation.policy.revision === previous.policy.revision && toolLearningContentHash(installation.policy) !== toolLearningContentHash(previous.policy)))
81
+ throw new Error("tool_learning_capture_policy_revision_conflict");
82
+ this.db.prepare(
83
+ "INSERT INTO installations VALUES (?, ?) ON CONFLICT(id) DO UPDATE SET payload = excluded.payload"
84
+ ).run(installation.id, JSON.stringify(installation));
85
+ });
86
+ return installation;
87
+ }
88
+ append(value, now = Date.now()) {
89
+ const event = ToolEpisodeEventSchema.parse(value);
90
+ const payload = JSON.stringify(event), bytes = Buffer.byteLength(payload);
91
+ return this.transaction(() => {
92
+ const installation = this.installation(event.installationId);
93
+ if (!installation?.enabled) return "disabled";
94
+ const policy = installation.policy;
95
+ if (!policy.purposes.includes("capture")) return "disabled";
96
+ assertToolEpisodeCapturePolicy(event, policy);
97
+ const previous = this.db.prepare("SELECT content_hash, installation_id FROM events WHERE id = ?").get(event.eventId);
98
+ if (previous) {
99
+ if (previous.content_hash !== event.contentHash || previous.installation_id !== event.installationId)
100
+ throw new Error("tool_learning_event_identity_conflict");
101
+ return "already_retained";
102
+ }
103
+ this.db.prepare("INSERT INTO counters(installation_id) VALUES (?) ON CONFLICT DO NOTHING").run(installation.id);
104
+ const cutoff = now - policy.maximumQueueAgeSeconds * 1e3;
105
+ const expired = this.db.prepare("DELETE FROM events WHERE installation_id = ? AND received_at < ?").run(installation.id, cutoff).changes;
106
+ this.db.prepare("UPDATE counters SET expired = expired + ? WHERE installation_id = ?").run(expired, installation.id);
107
+ if (Date.parse(event.occurredAt) < cutoff || Date.parse(event.occurredAt) > now + 3e5) {
108
+ this.db.prepare("UPDATE counters SET expired = expired + 1 WHERE installation_id = ?").run(installation.id);
109
+ return "expired";
110
+ }
111
+ const total = this.db.prepare("SELECT COUNT(*) AS count, COALESCE(SUM(size_bytes), 0) AS bytes FROM events").get();
112
+ const scoped = this.db.prepare(
113
+ "SELECT COUNT(*) AS count, COALESCE(SUM(size_bytes), 0) AS bytes FROM events WHERE installation_id = ?"
114
+ ).get(installation.id);
115
+ const episode = this.db.prepare(
116
+ "SELECT COUNT(*) AS count, COALESCE(SUM(size_bytes), 0) AS bytes FROM events WHERE installation_id = ? AND episode_id = ?"
117
+ ).get(installation.id, event.episodeId);
118
+ if (Number(total.count) >= TOOL_LEARNING_LIMITS.queueEvents || Number(total.bytes) + bytes > TOOL_LEARNING_LIMITS.queueBytes || Number(scoped.count) >= policy.maximumQueueEvents || Number(scoped.bytes) + bytes > policy.maximumQueueBytes || Number(episode.count) >= policy.maximumEpisodeEvents || Number(episode.bytes) + bytes > policy.maximumEpisodeBytes) {
119
+ this.db.prepare("UPDATE counters SET dropped = dropped + 1 WHERE installation_id = ?").run(installation.id);
120
+ return "queue_full";
121
+ }
122
+ this.db.prepare("INSERT INTO events VALUES (?, ?, ?, ?, ?, ?, ?, ?)").run(
123
+ event.eventId,
124
+ installation.id,
125
+ event.episodeId,
126
+ event.sanitization.policyHash,
127
+ event.contentHash,
128
+ payload,
129
+ bytes,
130
+ now
131
+ );
132
+ return "retained";
133
+ });
134
+ }
135
+ pending(installationId, limit = TOOL_LEARNING_LIMITS.eventsPerAppend) {
136
+ if (!Number.isInteger(limit) || limit < 1 || limit > TOOL_LEARNING_LIMITS.eventsPerAppend)
137
+ throw new Error("tool_learning_queue_page_limit");
138
+ this.expire(installationId);
139
+ const installation = this.installation(installationId);
140
+ if (!installation?.enabled || !installation.policy.purposes.includes("capture")) return [];
141
+ return this.db.prepare(
142
+ "SELECT payload FROM events WHERE installation_id = ? AND policy_hash = ? ORDER BY received_at, id LIMIT ?"
143
+ ).all(installationId, toolLearningContentHash(installation.policy), limit).map((row) => ToolEpisodeEventSchema.parse(JSON.parse(String(row.payload))));
144
+ }
145
+ acknowledge(installationId, accepted) {
146
+ if (accepted.length > TOOL_LEARNING_LIMITS.eventsPerAppend)
147
+ throw new Error("tool_learning_ack_limit");
148
+ this.transaction(() => {
149
+ for (const event of accepted)
150
+ this.db.prepare("DELETE FROM events WHERE installation_id = ? AND id = ? AND content_hash = ?").run(installationId, event.eventId, event.contentHash);
151
+ });
152
+ }
153
+ status(installationId) {
154
+ this.expire(installationId);
155
+ const installation = this.installation(installationId);
156
+ const pending = this.db.prepare(
157
+ "SELECT COUNT(*) AS events, COALESCE(SUM(size_bytes), 0) AS bytes FROM events WHERE installation_id = ?"
158
+ ).get(installationId);
159
+ const counter = this.db.prepare("SELECT dropped, expired FROM counters WHERE installation_id = ?").get(installationId);
160
+ const deliverable = installation?.enabled && installation.policy.purposes.includes("capture") ? Number(
161
+ this.db.prepare(
162
+ "SELECT COUNT(*) AS count FROM events WHERE installation_id = ? AND policy_hash = ?"
163
+ ).get(installationId, toolLearningContentHash(installation.policy)).count
164
+ ) : 0;
165
+ return {
166
+ pendingEvents: Number(pending.events),
167
+ pendingBytes: Number(pending.bytes),
168
+ droppedEvents: Number(counter?.dropped ?? 0),
169
+ expiredEvents: Number(counter?.expired ?? 0),
170
+ blockedByPolicyEvents: Number(pending.events) - deliverable
171
+ };
172
+ }
173
+ transaction(operation) {
174
+ this.db.exec("BEGIN IMMEDIATE");
175
+ try {
176
+ const result = operation();
177
+ this.db.exec("COMMIT");
178
+ return result;
179
+ } catch (error) {
180
+ this.db.exec("ROLLBACK");
181
+ throw error;
182
+ }
183
+ }
184
+ expire(installationId) {
185
+ const installation = this.installation(installationId);
186
+ if (!installation) return;
187
+ this.transaction(() => {
188
+ const expired = this.db.prepare("DELETE FROM events WHERE installation_id = ? AND received_at < ?").run(
189
+ installationId,
190
+ Date.now() - installation.policy.maximumQueueAgeSeconds * 1e3
191
+ ).changes;
192
+ this.db.prepare(
193
+ "INSERT INTO counters(installation_id, expired) VALUES (?, ?) ON CONFLICT(installation_id) DO UPDATE SET expired = expired + excluded.expired"
194
+ ).run(installationId, expired);
195
+ });
196
+ }
197
+ };
198
+ export {
199
+ LocalToolLearningInstallationSchema,
200
+ ToolLearningLocalStore
201
+ };
202
+ //# sourceMappingURL=tool-learning-local-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tool-learning-local-store.ts"],"sourcesContent":["import { DatabaseSync } from \"node:sqlite\";\nimport { chmodSync, closeSync, existsSync, lstatSync, mkdirSync, openSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n TOOL_LEARNING_LIMITS,\n ToolEpisodeEventSchema,\n ToolLearningCapturePolicySchema,\n ToolLearningIdSchema,\n toolLearningContentHash,\n assertToolEpisodeCapturePolicy,\n type ToolEpisodeEvent,\n} from \"@openpond/evals/tool-learning\";\nimport { z } from \"zod\";\n\nexport const LocalToolLearningInstallationSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.localToolLearningInstallation.v1\"),\n id: ToolLearningIdSchema,\n teamId: ToolLearningIdSchema,\n projectId: ToolLearningIdSchema,\n client: z.enum([\"claude_code\", \"openpond\"]),\n workspaceRoot: z.string().min(1).max(4000),\n enabled: z.boolean(),\n policy: ToolLearningCapturePolicySchema,\n createdAt: z.iso.datetime({ offset: true }),\n })\n .strict();\nexport type LocalToolLearningInstallation = z.infer<typeof LocalToolLearningInstallationSchema>;\n\n/** Local-only bounded delivery ledger shared by the CLI hooks and native app.\n * The ledger has no authentication, API, training, or tool-execution authority.\n */\nexport class ToolLearningLocalStore {\n private readonly db: DatabaseSync;\n\n constructor(home: string) {\n const directory = join(home, \"tool-learning\");\n if (existsSync(directory) && lstatSync(directory).isSymbolicLink())\n throw new Error(\"tool_learning_directory_symlink_forbidden\");\n mkdirSync(directory, { recursive: true, mode: 0o700 });\n chmodSync(directory, 0o700);\n const filename = join(directory, \"queue.sqlite\");\n if (existsSync(filename)) {\n if (!lstatSync(filename).isFile() || lstatSync(filename).isSymbolicLink())\n throw new Error(\"tool_learning_queue_file_invalid\");\n } else {\n closeSync(openSync(filename, \"wx\", 0o600));\n }\n chmodSync(filename, 0o600);\n this.db = new DatabaseSync(filename);\n this.db.exec(\n \"PRAGMA busy_timeout = 3000; PRAGMA journal_mode = WAL; PRAGMA synchronous = FULL;\",\n );\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS installations (id TEXT PRIMARY KEY, payload TEXT NOT NULL);\n CREATE TABLE IF NOT EXISTS events (\n id TEXT PRIMARY KEY, installation_id TEXT NOT NULL, episode_id TEXT NOT NULL,\n policy_hash TEXT NOT NULL, content_hash TEXT NOT NULL,\n payload TEXT NOT NULL, size_bytes INTEGER NOT NULL, received_at INTEGER NOT NULL\n );\n CREATE INDEX IF NOT EXISTS events_installation ON events(installation_id, received_at, id);\n CREATE INDEX IF NOT EXISTS events_episode ON events(installation_id, episode_id);\n CREATE INDEX IF NOT EXISTS events_policy ON events(installation_id, policy_hash, received_at, id);\n CREATE TABLE IF NOT EXISTS counters (\n installation_id TEXT PRIMARY KEY, dropped INTEGER NOT NULL DEFAULT 0, expired INTEGER NOT NULL DEFAULT 0\n );\n `);\n }\n\n close(): void {\n this.db.close();\n }\n\n installation(id: string): LocalToolLearningInstallation | null {\n const row = this.db.prepare(\"SELECT payload FROM installations WHERE id = ?\").get(id);\n return row ? LocalToolLearningInstallationSchema.parse(JSON.parse(String(row.payload))) : null;\n }\n\n installations(): LocalToolLearningInstallation[] {\n return this.db\n .prepare(\"SELECT payload FROM installations ORDER BY id\")\n .all()\n .map((row) => LocalToolLearningInstallationSchema.parse(JSON.parse(String(row.payload))));\n }\n\n configure(value: unknown): LocalToolLearningInstallation {\n const installation = LocalToolLearningInstallationSchema.parse(value);\n this.transaction(() => {\n const previous = this.installation(installation.id);\n if (\n previous &&\n [\"teamId\", \"projectId\", \"client\", \"workspaceRoot\"].some(\n (key) =>\n previous[key as keyof LocalToolLearningInstallation] !==\n installation[key as keyof LocalToolLearningInstallation],\n )\n )\n throw new Error(\"tool_learning_installation_scope_immutable\");\n if (\n previous &&\n (installation.policy.revision < previous.policy.revision ||\n (installation.policy.revision === previous.policy.revision &&\n toolLearningContentHash(installation.policy) !==\n toolLearningContentHash(previous.policy)))\n )\n throw new Error(\"tool_learning_capture_policy_revision_conflict\");\n this.db\n .prepare(\n \"INSERT INTO installations VALUES (?, ?) ON CONFLICT(id) DO UPDATE SET payload = excluded.payload\",\n )\n .run(installation.id, JSON.stringify(installation));\n });\n return installation;\n }\n\n append(\n value: unknown,\n now = Date.now(),\n ): \"retained\" | \"already_retained\" | \"disabled\" | \"expired\" | \"queue_full\" {\n const event = ToolEpisodeEventSchema.parse(value);\n const payload = JSON.stringify(event),\n bytes = Buffer.byteLength(payload);\n return this.transaction(() => {\n const installation = this.installation(event.installationId);\n if (!installation?.enabled) return \"disabled\";\n const policy = installation.policy;\n if (!policy.purposes.includes(\"capture\")) return \"disabled\";\n assertToolEpisodeCapturePolicy(event, policy);\n const previous = this.db\n .prepare(\"SELECT content_hash, installation_id FROM events WHERE id = ?\")\n .get(event.eventId);\n if (previous) {\n if (\n previous.content_hash !== event.contentHash ||\n previous.installation_id !== event.installationId\n )\n throw new Error(\"tool_learning_event_identity_conflict\");\n return \"already_retained\";\n }\n this.db\n .prepare(\"INSERT INTO counters(installation_id) VALUES (?) ON CONFLICT DO NOTHING\")\n .run(installation.id);\n const cutoff = now - policy.maximumQueueAgeSeconds * 1000;\n const expired = this.db\n .prepare(\"DELETE FROM events WHERE installation_id = ? AND received_at < ?\")\n .run(installation.id, cutoff).changes;\n this.db\n .prepare(\"UPDATE counters SET expired = expired + ? WHERE installation_id = ?\")\n .run(expired, installation.id);\n if (Date.parse(event.occurredAt) < cutoff || Date.parse(event.occurredAt) > now + 300_000) {\n this.db\n .prepare(\"UPDATE counters SET expired = expired + 1 WHERE installation_id = ?\")\n .run(installation.id);\n return \"expired\";\n }\n // A home-wide ceiling also bounds many separately configured installations.\n const total = this.db\n .prepare(\"SELECT COUNT(*) AS count, COALESCE(SUM(size_bytes), 0) AS bytes FROM events\")\n .get()!;\n const scoped = this.db\n .prepare(\n \"SELECT COUNT(*) AS count, COALESCE(SUM(size_bytes), 0) AS bytes FROM events WHERE installation_id = ?\",\n )\n .get(installation.id)!;\n const episode = this.db\n .prepare(\n \"SELECT COUNT(*) AS count, COALESCE(SUM(size_bytes), 0) AS bytes FROM events WHERE installation_id = ? AND episode_id = ?\",\n )\n .get(installation.id, event.episodeId)!;\n if (\n Number(total.count) >= TOOL_LEARNING_LIMITS.queueEvents ||\n Number(total.bytes) + bytes > TOOL_LEARNING_LIMITS.queueBytes ||\n Number(scoped.count) >= policy.maximumQueueEvents ||\n Number(scoped.bytes) + bytes > policy.maximumQueueBytes ||\n Number(episode.count) >= policy.maximumEpisodeEvents ||\n Number(episode.bytes) + bytes > policy.maximumEpisodeBytes\n ) {\n this.db\n .prepare(\"UPDATE counters SET dropped = dropped + 1 WHERE installation_id = ?\")\n .run(installation.id);\n return \"queue_full\";\n }\n this.db\n .prepare(\"INSERT INTO events VALUES (?, ?, ?, ?, ?, ?, ?, ?)\")\n .run(\n event.eventId,\n installation.id,\n event.episodeId,\n event.sanitization.policyHash,\n event.contentHash,\n payload,\n bytes,\n now,\n );\n return \"retained\";\n });\n }\n\n pending(\n installationId: string,\n limit = TOOL_LEARNING_LIMITS.eventsPerAppend,\n ): ToolEpisodeEvent[] {\n if (!Number.isInteger(limit) || limit < 1 || limit > TOOL_LEARNING_LIMITS.eventsPerAppend)\n throw new Error(\"tool_learning_queue_page_limit\");\n this.expire(installationId);\n const installation = this.installation(installationId);\n if (!installation?.enabled || !installation.policy.purposes.includes(\"capture\")) return [];\n return this.db\n .prepare(\n \"SELECT payload FROM events WHERE installation_id = ? AND policy_hash = ? ORDER BY received_at, id LIMIT ?\",\n )\n .all(installationId, toolLearningContentHash(installation.policy), limit)\n .map((row) => ToolEpisodeEventSchema.parse(JSON.parse(String(row.payload))));\n }\n\n acknowledge(\n installationId: string,\n accepted: Array<{ eventId: string; contentHash: string }>,\n ): void {\n if (accepted.length > TOOL_LEARNING_LIMITS.eventsPerAppend)\n throw new Error(\"tool_learning_ack_limit\");\n this.transaction(() => {\n for (const event of accepted)\n this.db\n .prepare(\"DELETE FROM events WHERE installation_id = ? AND id = ? AND content_hash = ?\")\n .run(installationId, event.eventId, event.contentHash);\n });\n }\n\n status(installationId: string) {\n this.expire(installationId);\n const installation = this.installation(installationId);\n const pending = this.db\n .prepare(\n \"SELECT COUNT(*) AS events, COALESCE(SUM(size_bytes), 0) AS bytes FROM events WHERE installation_id = ?\",\n )\n .get(installationId)!;\n const counter = this.db\n .prepare(\"SELECT dropped, expired FROM counters WHERE installation_id = ?\")\n .get(installationId);\n const deliverable =\n installation?.enabled && installation.policy.purposes.includes(\"capture\")\n ? Number(\n this.db\n .prepare(\n \"SELECT COUNT(*) AS count FROM events WHERE installation_id = ? AND policy_hash = ?\",\n )\n .get(installationId, toolLearningContentHash(installation.policy))!.count,\n )\n : 0;\n return {\n pendingEvents: Number(pending.events),\n pendingBytes: Number(pending.bytes),\n droppedEvents: Number(counter?.dropped ?? 0),\n expiredEvents: Number(counter?.expired ?? 0),\n blockedByPolicyEvents: Number(pending.events) - deliverable,\n };\n }\n\n private transaction<T>(operation: () => T): T {\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n const result = operation();\n this.db.exec(\"COMMIT\");\n return result;\n } catch (error) {\n this.db.exec(\"ROLLBACK\");\n throw error;\n }\n }\n\n private expire(installationId: string): void {\n const installation = this.installation(installationId);\n if (!installation) return;\n this.transaction(() => {\n const expired = this.db\n .prepare(\"DELETE FROM events WHERE installation_id = ? AND received_at < ?\")\n .run(\n installationId,\n Date.now() - installation.policy.maximumQueueAgeSeconds * 1000,\n ).changes;\n this.db\n .prepare(\n \"INSERT INTO counters(installation_id, expired) VALUES (?, ?) ON CONFLICT(installation_id) DO UPDATE SET expired = expired + excluded.expired\",\n )\n .run(installationId, expired);\n });\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,3 @@
1
+ // src/tool-learning.ts
2
+ export * from "@openpond/evals/tool-learning";
3
+ //# sourceMappingURL=tool-learning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tool-learning.ts"],"sourcesContent":["/** Portable episode and recovery-consultation protocol; no installation side effects. */\nexport * from \"@openpond/evals/tool-learning\";\n"],"mappings":";AACA,cAAc;","names":[]}