@lssm/lib.work-spec 3.0.1

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 (55) hide show
  1. package/README.md +66 -0
  2. package/dist/browser/capabilities.js +1 -0
  3. package/dist/browser/common.js +1 -0
  4. package/dist/browser/entities.js +1 -0
  5. package/dist/browser/events.js +1 -0
  6. package/dist/browser/index.js +1 -0
  7. package/dist/browser/models.js +1 -0
  8. package/dist/browser/object-read.js +1 -0
  9. package/dist/browser/operations.js +1 -0
  10. package/dist/browser/sync.js +1 -0
  11. package/dist/browser/task-status.js +1 -0
  12. package/dist/browser/taxonomy.js +1 -0
  13. package/dist/browser/work-spec.feature.js +1 -0
  14. package/dist/browser/workspace-revision.js +1 -0
  15. package/dist/capabilities.d.ts +42 -0
  16. package/dist/capabilities.js +2 -0
  17. package/dist/common.d.ts +115 -0
  18. package/dist/common.js +2 -0
  19. package/dist/entities.d.ts +1143 -0
  20. package/dist/entities.js +2 -0
  21. package/dist/events.d.ts +10057 -0
  22. package/dist/events.js +2 -0
  23. package/dist/index.d.ts +12 -0
  24. package/dist/index.js +2 -0
  25. package/dist/models.d.ts +1080 -0
  26. package/dist/models.js +2 -0
  27. package/dist/node/capabilities.js +1 -0
  28. package/dist/node/common.js +1 -0
  29. package/dist/node/entities.js +1 -0
  30. package/dist/node/events.js +1 -0
  31. package/dist/node/index.js +1 -0
  32. package/dist/node/models.js +1 -0
  33. package/dist/node/object-read.js +1 -0
  34. package/dist/node/operations.js +1 -0
  35. package/dist/node/sync.js +1 -0
  36. package/dist/node/task-status.js +1 -0
  37. package/dist/node/taxonomy.js +1 -0
  38. package/dist/node/work-spec.feature.js +1 -0
  39. package/dist/node/workspace-revision.js +1 -0
  40. package/dist/object-read.d.ts +644 -0
  41. package/dist/object-read.js +2 -0
  42. package/dist/operations.d.ts +165 -0
  43. package/dist/operations.js +2 -0
  44. package/dist/sync.d.ts +545 -0
  45. package/dist/sync.js +2 -0
  46. package/dist/task-status.d.ts +3369 -0
  47. package/dist/task-status.js +2 -0
  48. package/dist/taxonomy.d.ts +84 -0
  49. package/dist/taxonomy.js +2 -0
  50. package/dist/work-spec.feature.d.ts +11 -0
  51. package/dist/work-spec.feature.js +2 -0
  52. package/dist/work-spec.test.d.ts +1 -0
  53. package/dist/workspace-revision.d.ts +19 -0
  54. package/dist/workspace-revision.js +2 -0
  55. package/package.json +343 -0
package/dist/events.js ADDED
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{z as t}from"zod";import{z as m}from"zod";import{z as k}from"zod";var s=k.enum(["organization","workspace","team","member","guest","contractor","service_principal","cross_organization_acl_grant","portfolio","initiative","program","objective","key_result","roadmap","project","cycle","milestone","task","issue","bug","story","epic","subtask","recurrence_template","occurrence","dependency","relationship","estimate","time_entry","collection","list","folder_projection","status_workflow","custom_field_definition","custom_field_value","saved_view","form","template","comment","mention","reaction","activity","attachment","document_reference","canvas_reference","proofing_request","approval_reference","inbox_item","habit","focus_policy","planning_intent","capture_reference","automation_reference","agent_reference","schedule_binding_reference","external_binding","sync_cursor","sync_conflict","tombstone","evidence_reference"]),l=k.enum(["backlog","unstarted","started","completed","cancelled"]),f=k.enum(["parent","child","blocks","blocked_by","relates_to","duplicates","duplicated_by","supersedes","multi_homed_in"]);var R=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,o=m.string().regex(R,"UUIDv7 required"),n=m.string().datetime({offset:!0}),r=m.object({id:o,kind:s}),p=m.object({principalId:o,principalKind:m.enum(["member","guest","contractor","service_principal"])}),u=m.object({tenantId:o,organizationId:o,workspaceId:o}),i=m.object({scope:u,createdAt:n,createdBy:p,updatedAt:n,updatedBy:p,revision:m.number().int().nonnegative()});import{z as e}from"zod";var h=e.object({from:r,to:r}).refine(({from:d,to:j})=>d.id!==j.id,"Work graph links cannot self-reference"),X=e.object({id:o,metadata:i,kind:e.enum(["blocks","blocked_by"]),lagMinutes:e.number().int().nonnegative().default(0)}).and(h),W=e.object({id:o,metadata:i,kind:f}).and(h),S=e.object({id:o,metadata:i,workRef:r,body:e.string().min(1).max(1e5),mentionedPrincipalIds:e.array(o).default([]),attachmentRefs:e.array(r).default([]),parentCommentRef:r.optional(),resolvedAt:n.optional(),resolvedBy:p.optional()}),_=e.object({id:o,name:e.string().min(1).max(120),category:l,position:e.number().int().nonnegative(),color:e.string().regex(/^#[0-9a-f]{6}$/i).optional()}),Z=e.object({id:o,metadata:i,title:e.string().min(1).max(200),statuses:e.array(_).min(1),allowedTransitions:e.array(e.object({fromStatusId:o,toStatusId:o}))}),H=e.object({id:o,metadata:i,name:e.string().min(1).max(200),fieldType:e.enum(["text","number","date","person","select","multi_select","checkbox","url","formula"]),options:e.array(e.object({id:o,label:e.string().min(1)})).default([]),formula:e.string().min(1).optional(),required:e.boolean().default(!1)}),b=e.object({id:o,metadata:i,fieldRef:r.refine(({kind:d})=>d==="custom_field_definition","Custom field values must reference a custom-field definition"),workRef:r,value:e.unknown()}),J=e.object({id:o,metadata:i,name:e.string().min(1).max(200),viewType:e.enum(["list","board","table","calendar","timeline","gantt","workload"]),containerRef:r,filter:e.record(e.string(),e.unknown()).default({}),sort:e.array(e.object({field:e.string().min(1),direction:e.enum(["asc","desc"])})).default([]),groupBy:e.string().min(1).optional(),sharedWith:e.array(r).default([])}),Q=e.object({id:o,metadata:i,goalRef:r,current:e.number(),target:e.number(),unit:e.string().min(1).max(80),updatedAt:n});import{z as a}from"zod";var y=a.object({id:o,kind:s,title:a.string().min(1).max(500),description:a.string().max(1e5).optional(),metadata:i,parentRef:r.optional(),ownerRefs:a.array(r).default([]),assigneeRefs:a.array(r).default([]),statusId:o.optional(),statusCategory:l.optional(),priority:a.number().int().min(0).max(100).optional(),estimateMinutes:a.number().int().positive().optional(),desiredStartAt:n.optional(),dueAt:n.optional(),completedAt:n.optional(),recurrenceTemplateRef:r.optional(),captureRef:r.refine(({kind:d})=>d==="capture_reference","Capture provenance must reference a capture_reference Work object").optional(),customFieldValueRefs:a.array(r).default([]),evidenceRefs:a.array(r).default([]),externalBindingRefs:a.array(r).default([]),archivedAt:n.optional()}),re=a.object({id:o,metadata:i,from:r,to:r,kind:f}),x=a.object({id:o,metadata:i,templateRef:r,rule:a.object({frequency:a.enum(["daily","weekly","monthly","yearly"]),interval:a.number().int().positive().default(1),timeZone:a.string().min(1),startsAt:n,endsAt:n.optional(),count:a.number().int().positive().optional()})}),v=a.object({id:o,metadata:i,workRef:r,memberRef:r,startedAt:n,endedAt:n.optional(),durationMinutes:a.number().int().nonnegative(),note:a.string().max(1e4).optional()});var pe=t.enum(["work.object.created","work.object.updated","work.object.archived","work.object.restored","work.recurrence.set","work.time.started","work.time.stopped","work.relationship.set","work.comment.created","work.attachment.linked","work.custom_field.set"]),c=t.object({eventId:o,eventVersion:t.literal("2.0.0"),aggregate:r,aggregateRevision:t.number().int().positive(),scope:u,actor:p,occurredAt:n,idempotencyKey:t.string().min(1).max(255),correlationId:o,causationId:o.optional(),evidenceRef:t.string().min(1)}),w=c.extend({eventType:t.literal("work.object.created"),payload:t.object({object:y})}),T=c.extend({eventType:t.literal("work.object.updated"),payload:t.object({object:y})}),E=c.extend({eventType:t.literal("work.object.archived"),payload:t.object({}).strict()}),z=c.extend({eventType:t.literal("work.object.restored"),payload:t.object({}).strict()}),O=c.extend({eventType:t.literal("work.recurrence.set"),payload:t.object({recurrence:x})}),g=t.object({timeEntry:v}),A=c.extend({eventType:t.literal("work.time.started"),payload:g}),C=c.extend({eventType:t.literal("work.time.stopped"),payload:g}),I=c.extend({eventType:t.literal("work.relationship.set"),payload:t.object({edge:W})}),D=c.extend({eventType:t.literal("work.comment.created"),payload:t.object({comment:S})}),K=c.extend({eventType:t.literal("work.attachment.linked"),payload:t.object({attachmentRef:r})}),V=c.extend({eventType:t.literal("work.custom_field.set"),payload:t.object({value:b})}),F=t.discriminatedUnion("eventType",[w,T,E,z,O,A,C,I,D,K,V]),de=t.object({id:o,event:F,destination:t.string().min(1),status:t.enum(["pending","leased","delivered","dead_letter"]),availableAt:n,leaseOwner:t.string().min(1).optional(),leaseExpiresAt:n.optional(),deliveryAttempts:t.number().int().nonnegative()}),se={version:"2.0.0",invariants:["Only the matching unexpired lease owner and delivery attempt can acknowledge or release a record; reusing a worker name never grants an old claim authority over a new attempt.","Expired leases remain recoverable even if their original worker finishes before another worker claims them.","A future availability cutoff cannot expire an active delivery lease.","Lease validity is checked again by the settlement write using the database clock."]};export{se as WORK_OUTBOX_LEASE_CONTRACT,K as WorkAttachmentLinkedEventSchema,D as WorkCommentCreatedEventSchema,V as WorkCustomFieldSetEventSchema,F as WorkEventSchema,pe as WorkEventTypeSchema,E as WorkObjectArchivedEventSchema,w as WorkObjectCreatedEventSchema,z as WorkObjectRestoredEventSchema,T as WorkObjectUpdatedEventSchema,de as WorkOutboxRecordSchema,O as WorkRecurrenceSetEventSchema,I as WorkRelationshipSetEventSchema,A as WorkTimeStartedEventSchema,C as WorkTimeStoppedEventSchema};
@@ -0,0 +1,12 @@
1
+ export * from './capabilities.js';
2
+ export * from './common.js';
3
+ export * from './entities.js';
4
+ export * from './events.js';
5
+ export * from './models.js';
6
+ export * from './object-read.js';
7
+ export * from './operations.js';
8
+ export * from './sync.js';
9
+ export * from './task-status.js';
10
+ export * from './taxonomy.js';
11
+ export * from './work-spec.feature.js';
12
+ export * from './workspace-revision.js';
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{z as m}from"zod";var I=m.enum(["tenant_structure","strategy","execution","organization","collaboration","personal_productivity","sync","events","search","realtime_metadata"]),te=m.object({contractVersion:m.literal("2.0.0"),capabilities:m.array(I).min(1),requires:m.array(m.string().min(1)).default([]),optional:m.array(m.string().min(1)).default([]),productionSafe:m.boolean(),fakeDefaults:m.boolean()}),oe={contractVersion:"2.0.0",capabilities:["tenant_structure","strategy","execution","organization","collaboration","personal_productivity","sync","events","search","realtime_metadata"],requires:[],optional:["@lssm/lib.organization-planning-spec","@lssm/lib.knowledge","@lssm/lib.workflow-orchestration"],productionSafe:!1,fakeDefaults:!1};import{z as l}from"zod";import{z as x}from"zod";var v=x.enum(["organization","workspace","team","member","guest","contractor","service_principal","cross_organization_acl_grant","portfolio","initiative","program","objective","key_result","roadmap","project","cycle","milestone","task","issue","bug","story","epic","subtask","recurrence_template","occurrence","dependency","relationship","estimate","time_entry","collection","list","folder_projection","status_workflow","custom_field_definition","custom_field_value","saved_view","form","template","comment","mention","reaction","activity","attachment","document_reference","canvas_reference","proofing_request","approval_reference","inbox_item","habit","focus_policy","planning_intent","capture_reference","automation_reference","agent_reference","schedule_binding_reference","external_binding","sync_cursor","sync_conflict","tombstone","evidence_reference"]),y=x.enum(["backlog","unstarted","started","completed","cancelled"]),W=x.enum(["parent","child","blocks","blocked_by","relates_to","duplicates","duplicated_by","supersedes","multi_homed_in"]);var E=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,e=l.string().regex(E,"UUIDv7 required"),a=l.string().datetime({offset:!0}),o=l.object({id:e,kind:v}),k=l.object({principalId:e,principalKind:l.enum(["member","guest","contractor","service_principal"])}),u=l.object({tenantId:e,organizationId:e,workspaceId:e}),c=l.object({scope:u,createdAt:a,createdBy:k,updatedAt:a,updatedBy:k,revision:l.number().int().nonnegative()});import{z as t}from"zod";var R=t.object({from:o,to:o}).refine(({from:s,to:f})=>s.id!==f.id,"Work graph links cannot self-reference"),le=t.object({id:e,metadata:c,kind:t.enum(["blocks","blocked_by"]),lagMinutes:t.number().int().nonnegative().default(0)}).and(R),_=t.object({id:e,metadata:c,kind:W}).and(R),C=t.object({id:e,metadata:c,workRef:o,body:t.string().min(1).max(1e5),mentionedPrincipalIds:t.array(e).default([]),attachmentRefs:t.array(o).default([]),parentCommentRef:o.optional(),resolvedAt:a.optional(),resolvedBy:k.optional()}),D=t.object({id:e,name:t.string().min(1).max(120),category:y,position:t.number().int().nonnegative(),color:t.string().regex(/^#[0-9a-f]{6}$/i).optional()}),ke=t.object({id:e,metadata:c,title:t.string().min(1).max(200),statuses:t.array(D).min(1),allowedTransitions:t.array(t.object({fromStatusId:e,toStatusId:e}))}),ue=t.object({id:e,metadata:c,name:t.string().min(1).max(200),fieldType:t.enum(["text","number","date","person","select","multi_select","checkbox","url","formula"]),options:t.array(t.object({id:e,label:t.string().min(1)})).default([]),formula:t.string().min(1).optional(),required:t.boolean().default(!1)}),T=t.object({id:e,metadata:c,fieldRef:o.refine(({kind:s})=>s==="custom_field_definition","Custom field values must reference a custom-field definition"),workRef:o,value:t.unknown()}),fe=t.object({id:e,metadata:c,name:t.string().min(1).max(200),viewType:t.enum(["list","board","table","calendar","timeline","gantt","workload"]),containerRef:o,filter:t.record(t.string(),t.unknown()).default({}),sort:t.array(t.object({field:t.string().min(1),direction:t.enum(["asc","desc"])})).default([]),groupBy:t.string().min(1).optional(),sharedWith:t.array(o).default([])}),ye=t.object({id:e,metadata:c,goalRef:o,current:t.number(),target:t.number(),unit:t.string().min(1).max(80),updatedAt:a});import{z as r}from"zod";import{z as n}from"zod";var h=n.object({id:e,kind:v,title:n.string().min(1).max(500),description:n.string().max(1e5).optional(),metadata:c,parentRef:o.optional(),ownerRefs:n.array(o).default([]),assigneeRefs:n.array(o).default([]),statusId:e.optional(),statusCategory:y.optional(),priority:n.number().int().min(0).max(100).optional(),estimateMinutes:n.number().int().positive().optional(),desiredStartAt:a.optional(),dueAt:a.optional(),completedAt:a.optional(),recurrenceTemplateRef:o.optional(),captureRef:o.refine(({kind:s})=>s==="capture_reference","Capture provenance must reference a capture_reference Work object").optional(),customFieldValueRefs:n.array(o).default([]),evidenceRefs:n.array(o).default([]),externalBindingRefs:n.array(o).default([]),archivedAt:a.optional()}),Se=n.object({id:e,metadata:c,from:o,to:o,kind:W}),z=n.object({id:e,metadata:c,templateRef:o,rule:n.object({frequency:n.enum(["daily","weekly","monthly","yearly"]),interval:n.number().int().positive().default(1),timeZone:n.string().min(1),startsAt:a,endsAt:a.optional(),count:n.number().int().positive().optional()})}),A=n.object({id:e,metadata:c,workRef:o,memberRef:o,startedAt:a,endedAt:a.optional(),durationMinutes:n.number().int().nonnegative(),note:n.string().max(1e4).optional()});var _e=r.enum(["work.object.created","work.object.updated","work.object.archived","work.object.restored","work.recurrence.set","work.time.started","work.time.stopped","work.relationship.set","work.comment.created","work.attachment.linked","work.custom_field.set"]),p=r.object({eventId:e,eventVersion:r.literal("2.0.0"),aggregate:o,aggregateRevision:r.number().int().positive(),scope:u,actor:k,occurredAt:a,idempotencyKey:r.string().min(1).max(255),correlationId:e,causationId:e.optional(),evidenceRef:r.string().min(1)}),K=p.extend({eventType:r.literal("work.object.created"),payload:r.object({object:h})}),M=p.extend({eventType:r.literal("work.object.updated"),payload:r.object({object:h})}),q=p.extend({eventType:r.literal("work.object.archived"),payload:r.object({}).strict()}),B=p.extend({eventType:r.literal("work.object.restored"),payload:r.object({}).strict()}),F=p.extend({eventType:r.literal("work.recurrence.set"),payload:r.object({recurrence:z})}),O=r.object({timeEntry:A}),N=p.extend({eventType:r.literal("work.time.started"),payload:O}),P=p.extend({eventType:r.literal("work.time.stopped"),payload:O}),V=p.extend({eventType:r.literal("work.relationship.set"),payload:r.object({edge:_})}),U=p.extend({eventType:r.literal("work.comment.created"),payload:r.object({comment:C})}),G=p.extend({eventType:r.literal("work.attachment.linked"),payload:r.object({attachmentRef:o})}),L=p.extend({eventType:r.literal("work.custom_field.set"),payload:r.object({value:T})}),w=r.discriminatedUnion("eventType",[K,M,q,B,F,N,P,V,U,G,L]),Ce=r.object({id:e,event:w,destination:r.string().min(1),status:r.enum(["pending","leased","delivered","dead_letter"]),availableAt:a,leaseOwner:r.string().min(1).optional(),leaseExpiresAt:a.optional(),deliveryAttempts:r.number().int().nonnegative()}),Te={version:"2.0.0",invariants:["Only the matching unexpired lease owner and delivery attempt can acknowledge or release a record; reusing a worker name never grants an old claim authority over a new attempt.","Expired leases remain recoverable even if their original worker finishes before another worker claims them.","A future availability cutoff cannot expire an active delivery lease.","Lease validity is checked again by the settlement write using the database clock."]};import{z as j}from"zod";var Ee=j.object({objectId:e}).strict(),De=j.object({object:h,canUpdateStatus:j.boolean().optional()}).strict(),Ke={key:"work.object.read",version:"1.1.0",method:"GET",path:"/api/companyos/work/objects/:objectId",invariants:["Current organization and workspace read authority is checked before data access and before returning the result.","Read identity resolution never allocates canonical identities or selects an arbitrary conflicting mapping.","Foreign, missing and archived objects return the same not-found response. Complete Work scope remains server-derived.","Bearer reads do not fall back to cookie authority. Responses are private and never cached."]};import{z as d}from"zod";var J=d.enum(["read_only","suggest_only","within_policy","approval_required","reserved_human_only"]),Y=d.enum(["work.object.create@2.0.0","work.object.update@2.0.0","work.object.archive@2.0.0","work.object.restore@2.0.0","work.object.bulk_mutate@2.0.0","work.object.move@2.0.0","work.object.assign@2.0.0","work.object.transition@2.0.0","work.relationship.set@2.0.0","work.recurrence.set@2.0.0","work.time.start@2.0.0","work.time.stop@2.0.0","work.comment.create@2.0.0","work.attachment.link@2.0.0","work.custom_field.set@2.0.0","work.inbox.capture@2.0.0","work.search.query@2.0.0","work.sync.connect@2.0.0","work.sync.import@2.0.0","work.sync.push@2.0.0","work.sync.resolve_conflict@2.0.0"]),Fe=d.object({operationId:e,operationKey:Y,scope:u,actor:k,target:o.optional(),expectedRevision:d.number().int().nonnegative().optional(),idempotencyKey:d.string().min(1).max(255),correlationId:e,causationId:e.optional(),evidenceRef:d.string().min(1),actionClass:J,approvalRef:d.string().min(1).optional(),payload:d.record(d.string(),d.unknown())});function Ne(s){return s.actionClass==="approval_required"||s.actionClass==="reserved_human_only"}var Pe={key:"work.managed-commit-authority",version:"1.2.0",invariants:["Aggregate commits serialize by tenant and object identity and cannot change an existing aggregate scope. Projection workers cannot overwrite a newer revision with an older one.","Object reads use a projection only at the committed event head; lagging projections replay current events, including archives and restores, and expose the current aggregate revision.","Projection lookups validate object identity and the complete tenant/organization/workspace scope, on both materialized and event-replay paths.","Mutation services reject foreign or mismatched current objects and replay receipts before returning data or committing effects.","Organization, session, workspace and applicable team grants are re-proven and locked on the same transaction as event and outbox persistence.","Canonical scope and principal must match verified authority; caller-selected read_only or suggest_only labels cannot authorize mutation.","Authorized idempotent retries resolve the persisted receipt before object-existence or current-revision validation.","Approval-required and reserved mutations remain denied until an actual approval verifier is composed."]},Ve={key:"work.canonical-scope-binding",version:"1.0.0",invariants:["New actor bindings reuse canonical tenant, organization and workspace IDs for the same verified legacy scope.","A principal retains its canonical identity across workspaces within a tenant.","Existing bindings and immutable Work events are never silently rewritten. Ambiguous legacy parents block new allocation until reviewed reconciliation.","Allocation is serialized per legacy tenant and enforced by the database during mixed-version rollout."]};import{z as i}from"zod";var H=i.enum(["import_once","mirror_remote","two_way"]),X=i.enum(["native","remote","merge"]),Z=i.enum(["content","status","assignment","dates","custom_fields"]),Je=i.object({id:e,metadata:c,workRef:o,providerKey:i.string().min(1),connectionId:e,remoteObjectType:i.string().min(1),remoteObjectId:i.string().min(1),remoteRevision:i.string().min(1).optional(),mode:H,authority:i.record(Z,X),lastSynchronizedSnapshotRef:i.string().min(1).optional(),adapterPayloadRef:i.string().min(1).optional()}),Ye=i.object({id:e,metadata:c,bindingRef:o,workRef:o,fieldPath:i.string().min(1),baseValueRef:i.string().min(1),nativeValueRef:i.string().min(1),remoteValueRef:i.string().min(1),detectedAt:a,status:i.enum(["open","resolved_native","resolved_remote","resolved_merge"]),resolvedAt:a.optional(),resolvedByRef:o.optional()}),$e=i.object({id:e,metadata:c,workRef:o,bindingRef:o.optional(),deletedAt:a,recoverUntil:a,reason:i.string().min(1)});import{z as S}from"zod";var Q=S.object({objectId:e,expectedRevision:S.number().int().positive(),statusCategory:y,idempotencyKey:S.string().min(8).max(200)}).strict(),tt=Q.omit({objectId:!0}),ot=S.object({event:w}).strict(),rt={key:"work.task.status.set",version:"1.1.0",method:"POST",path:"/api/companyos/work/objects/:objectId/status",invariants:["Current write authority, canonical actor and scope are server-derived and checked in the commit transaction.","Only a current unarchived task at the displayed revision can change status; unrelated fields remain unchanged.","A category change clears the previous custom status identifier; only an unchanged category may preserve that identifier.","Completion timestamps use server time; reopening clears completion time. No owner or deadline is inferred.","Identical retries resolve the saved event before current-state validation; changed request keys cannot reuse a receipt.","The existing canonical Work service commits the event, idempotency receipt and outbox atomically."]};var nt={id:"libs.work-spec.feature",title:"Canonical Work Graph",body:["Defines provider-neutral Work OS v2 identity and contracts.","CompanyOS retains authority and evidence; OPA retains schedule placement.","Remote provider identifiers are external bindings and UUIDv7 Work IDs remain canonical.","Every mutation includes actor, scope, idempotency, correlation, evidence, and autonomy class."].join(" "),kind:"reference",visibility:"public",route:"/libs/work-spec",version:"2.0.0",owners:["@companyos-work"],relatedSpecs:["work.*@2.0.0"]};import{z as g}from"zod";var pt=g.object({scope:u,heads:g.array(g.object({aggregateId:e,revision:g.number().int().positive()}).strict()).max(1e4)}).strict().superRefine((s,f)=>{for(let b=1;b<s.heads.length;b++)if(s.heads[b-1].aggregateId>=s.heads[b].aggregateId)f.addIssue({code:"custom",message:"Work revision heads must be unique and sorted"})}),mt=(s)=>{let f=u.parse(s);return JSON.stringify(["work-workspace-revision",f.tenantId,f.organizationId,f.workspaceId])},dt={version:"1.0.0",invariants:["Canonical Work commits acquire a shared workspace revision lock before aggregate writes.","Proposal publication holds the exclusive matching workspace lock while checking all event heads and committing its proposal.","A changed, added or removed event head invalidates a prior snapshot, including unscheduled and completed work.","Mixed-version writers that omit the lock do not satisfy this concurrency contract."]};export{Ve as WORK_CANONICAL_SCOPE_BINDING_CONTRACT,Pe as WORK_MANAGED_COMMIT_AUTHORITY_CONTRACT,Ke as WORK_OBJECT_READ_CONTRACT,Te as WORK_OUTBOX_LEASE_CONTRACT,oe as WORK_SPEC_CAPABILITY_MANIFEST,rt as WORK_TASK_STATUS_CONTRACT,dt as WORK_WORKSPACE_REVISION_CONTRACT,J as WorkActionClassSchema,k as WorkActorRefSchema,G as WorkAttachmentLinkedEventSchema,te as WorkCapabilityManifestSchema,I as WorkCapabilitySchema,U as WorkCommentCreatedEventSchema,C as WorkCommentSchema,ue as WorkCustomFieldDefinitionSchema,L as WorkCustomFieldSetEventSchema,T as WorkCustomFieldValueSchema,le as WorkDependencySchema,w as WorkEventSchema,_e as WorkEventTypeSchema,Je as WorkExternalBindingSchema,X as WorkFieldAuthoritySchema,Z as WorkFieldGroupSchema,ye as WorkGoalProgressSchema,e as WorkIdSchema,a as WorkIsoDateTimeSchema,Fe as WorkMutationEnvelopeSchema,q as WorkObjectArchivedEventSchema,K as WorkObjectCreatedEventSchema,v as WorkObjectKindSchema,Ee as WorkObjectReadRequestSchema,De as WorkObjectReadResponseSchema,o as WorkObjectRefSchema,B as WorkObjectRestoredEventSchema,h as WorkObjectSchema,M as WorkObjectUpdatedEventSchema,Y as WorkOperationKeySchema,Ce as WorkOutboxRecordSchema,c as WorkRecordMetadataSchema,z as WorkRecurrenceSchema,F as WorkRecurrenceSetEventSchema,_ as WorkRelationshipEdgeSchema,W as WorkRelationshipKindSchema,Se as WorkRelationshipSchema,V as WorkRelationshipSetEventSchema,fe as WorkSavedViewSchema,u as WorkScopeSchema,y as WorkStatusCategorySchema,D as WorkStatusDefinitionSchema,ke as WorkStatusWorkflowSchema,Ye as WorkSyncConflictSchema,H as WorkSyncModeSchema,tt as WorkTaskStatusBodySchema,Q as WorkTaskStatusRequestSchema,ot as WorkTaskStatusResponseSchema,A as WorkTimeEntrySchema,N as WorkTimeStartedEventSchema,P as WorkTimeStoppedEventSchema,$e as WorkTombstoneSchema,pt as WorkWorkspaceRevisionSchema,Ne as mutationRequiresApproval,nt as workSpecFeatureDoc,mt as workWorkspaceRevisionLockKey};