@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.
- package/README.md +66 -0
- package/dist/browser/capabilities.js +1 -0
- package/dist/browser/common.js +1 -0
- package/dist/browser/entities.js +1 -0
- package/dist/browser/events.js +1 -0
- package/dist/browser/index.js +1 -0
- package/dist/browser/models.js +1 -0
- package/dist/browser/object-read.js +1 -0
- package/dist/browser/operations.js +1 -0
- package/dist/browser/sync.js +1 -0
- package/dist/browser/task-status.js +1 -0
- package/dist/browser/taxonomy.js +1 -0
- package/dist/browser/work-spec.feature.js +1 -0
- package/dist/browser/workspace-revision.js +1 -0
- package/dist/capabilities.d.ts +42 -0
- package/dist/capabilities.js +2 -0
- package/dist/common.d.ts +115 -0
- package/dist/common.js +2 -0
- package/dist/entities.d.ts +1143 -0
- package/dist/entities.js +2 -0
- package/dist/events.d.ts +10057 -0
- package/dist/events.js +2 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +2 -0
- package/dist/models.d.ts +1080 -0
- package/dist/models.js +2 -0
- package/dist/node/capabilities.js +1 -0
- package/dist/node/common.js +1 -0
- package/dist/node/entities.js +1 -0
- package/dist/node/events.js +1 -0
- package/dist/node/index.js +1 -0
- package/dist/node/models.js +1 -0
- package/dist/node/object-read.js +1 -0
- package/dist/node/operations.js +1 -0
- package/dist/node/sync.js +1 -0
- package/dist/node/task-status.js +1 -0
- package/dist/node/taxonomy.js +1 -0
- package/dist/node/work-spec.feature.js +1 -0
- package/dist/node/workspace-revision.js +1 -0
- package/dist/object-read.d.ts +644 -0
- package/dist/object-read.js +2 -0
- package/dist/operations.d.ts +165 -0
- package/dist/operations.js +2 -0
- package/dist/sync.d.ts +545 -0
- package/dist/sync.js +2 -0
- package/dist/task-status.d.ts +3369 -0
- package/dist/task-status.js +2 -0
- package/dist/taxonomy.d.ts +84 -0
- package/dist/taxonomy.js +2 -0
- package/dist/work-spec.feature.d.ts +11 -0
- package/dist/work-spec.feature.js +2 -0
- package/dist/work-spec.test.d.ts +1 -0
- package/dist/workspace-revision.d.ts +19 -0
- package/dist/workspace-revision.js +2 -0
- package/package.json +343 -0
package/README.md
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# `@lssm/lib.work-spec`
|
|
2
|
+
|
|
3
|
+
Canonical provider-neutral Work Graph contracts for CompanyOS and independent
|
|
4
|
+
downstream products.
|
|
5
|
+
|
|
6
|
+
The package owns opaque UUIDv7 work identity, tenant structure, strategy and
|
|
7
|
+
execution objects, organization metadata, collaboration metadata, personal
|
|
8
|
+
productivity records, external bindings, sync conflicts, immutable events,
|
|
9
|
+
mutation envelopes, and capability manifests.
|
|
10
|
+
|
|
11
|
+
Custom-field definitions and values are native contracts. A value always
|
|
12
|
+
references both its `custom_field_definition` and the Work object it applies to;
|
|
13
|
+
provider-specific fields remain external binding payloads rather than becoming
|
|
14
|
+
canonical required fields.
|
|
15
|
+
|
|
16
|
+
`WorkObjectRef.kind` is restricted to the canonical Work taxonomy. Events are
|
|
17
|
+
explicit and immutable: object lifecycle, recurrence configuration, time
|
|
18
|
+
tracking, relationship, comment-creation, and attachment-link events. Recurrence
|
|
19
|
+
rules are attached to recurrence-template aggregates; time entries, comments,
|
|
20
|
+
and attachment links are attached to their tracked Work aggregate. Relationship
|
|
21
|
+
events are attached to their source aggregate, including blocking dependencies
|
|
22
|
+
consumed by OPA planning projections.
|
|
23
|
+
|
|
24
|
+
It does not schedule work, call providers, persist data, evaluate CompanyOS
|
|
25
|
+
authority, or store collaborative document bodies. OPA owns actual placement;
|
|
26
|
+
CRDT packages own document and canvas bodies.
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
import {
|
|
30
|
+
WorkObjectSchema,
|
|
31
|
+
WorkMutationEnvelopeSchema,
|
|
32
|
+
WorkObjectRefSchema,
|
|
33
|
+
} from "@lssm/lib.work-spec";
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Production integrations must map provider IDs into external bindings and
|
|
37
|
+
declare field-group authority. They must never substitute remote identity for a
|
|
38
|
+
canonical Work ID.
|
|
39
|
+
|
|
40
|
+
Managed host implementations must satisfy `WORK_MANAGED_COMMIT_AUTHORITY_CONTRACT`: keep current organization/session/workspace/team authority and canonical Work event/outbox persistence in one transaction. A caller-selected action label never grants mutation authority. Existing operation envelopes and canonical identity bindings remain unchanged.
|
|
41
|
+
|
|
42
|
+
### Canonical Work hierarchy and legacy parity
|
|
43
|
+
|
|
44
|
+
Apply additive migration 0081 after 0080 before enabling new Work identity allocation. New operators reuse canonical tenant/organization/workspace IDs for the same verified legacy scope, and a principal retains its canonical ID across workspaces within a tenant. The database enforces this during mixed-version rollout; new allocation is serialized per legacy tenant. Existing bindings are read without taking the allocation lock.
|
|
45
|
+
|
|
46
|
+
Existing rows and Work events remain intact. A coherent legacy mapping is adopted for new operators; conflicting parent or principal mappings block new allocation with `WORK_IDENTITY_RECONCILIATION_REQUIRED`. Use `inspectWorkIdentityParity` inside an authorized transaction with the physical tenant GUC set to inventory conflicts. It reports scope categories and counts without rewriting data. Do not pick an arbitrary legacy ID or rewrite immutable Work events to clear the error. A reviewed reconciliation and parity/restore proof are required before enabling shared projection for a conflicted tenant.
|
|
47
|
+
|
|
48
|
+
The preparation function rejects foreign scope or unavailable trigger enforcement. Personal-context provisioning uses distinct physical tenants/workspaces, which remain isolated. This change is locally verified on PostgreSQL 15; production migration and existing-data reconciliation remain separate release gates.
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
Work scope validation now includes tenant, organization and workspace on object reads, including both materialized projections and replay fallback. Mismatched projection identities fail closed. Mutation services validate the current object's identity/scope and replay receipts against the authorized actor and scope. PostgreSQL commits serialize by aggregate before revision checks and reject changing an existing aggregate's scope; projection upserts cannot replace a newer revision with an older worker result. These changes preserve existing wire contracts and require no schema migration. Tenant-only event/outbox worker ports remain trusted internal surfaces and must not be exposed as workspace-authorized reads.
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
Work object reads compare materialized projection revision with the committed event head in one SQL snapshot. A lagging or missing projection falls back to scoped event replay, so committed updates, archives and restores are visible without waiting for the outbox worker. Returned metadata carries the current aggregate revision, including lifecycle-only events. Reads do not mutate projections. Long aggregate histories still require performance qualification.
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
`GET /api/companyos/work/objects/:objectId` reads a canonical UUIDv7 Work object under current server-derived workspace authority. The request accepts no scope parameters. Existing coherent canonical workspace mappings are read without allocation; conflicting mappings fail closed. The API uses the scoped, event-head-aware Work store and reproves read authority before returning. Responses are private/no-store, and absent, foreign or archived objects return not found. Native task-detail presentation is separate qualification work.
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
POST `/api/companyos/work/objects/:objectId/status` accepts only a canonical object ID, expected revision, status category and idempotency key. Current writable authority and actor/scope are derived server-side inside the transaction. The existing Work service commits status changes and three outbox destinations atomically. Completion uses server time; reopening clears completion time. Identical retries resolve the stored event before current-state validation. Native controls and live end-to-end qualification remain open.
|
|
61
|
+
|
|
62
|
+
Work outbox lease validity uses the PostgreSQL clock. A caller availability cutoff cannot expire another worker’s active lease, and expired leases cannot acknowledge or release work even before replacement. Settlement checks expiry again in its conditional write. Hosts must still use distinct claim identities and authorize effects independently; this does not activate the OPA consumer.
|
|
63
|
+
|
|
64
|
+
Work outbox lease contract v2 requires `deliveryAttempt` on acknowledge/release, copied from the claimed record's `deliveryAttempts`. The dispatcher supplies it automatically. Matching a worker name and future expiry is insufficient: settlement also checks the exact persisted attempt. Old or missing attempt values fail closed. Update custom callers before upgrading; no database migration or stored-record reset is required.
|
|
65
|
+
|
|
66
|
+
Workspace revision fencing hashes every canonical Work aggregate head, including unplaced, completed and archived work. Work commits take a shared workspace advisory lock; proposal publication takes its exclusive counterpart and checks the complete digest before persistence. The interactive planner and internal background proposal publisher use this fence. Upgrade all Work writers before qualifying it; older writers that omit the shared lock are not covered. Calendar freshness and policy/approval checks remain independent.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as t}from"zod";var a=t.enum(["tenant_structure","strategy","execution","organization","collaboration","personal_productivity","sync","events","search","realtime_metadata"]),i=t.object({contractVersion:t.literal("2.0.0"),capabilities:t.array(a).min(1),requires:t.array(t.string().min(1)).default([]),optional:t.array(t.string().min(1)).default([]),productionSafe:t.boolean(),fakeDefaults:t.boolean()}),o={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};export{o as WORK_SPEC_CAPABILITY_MANIFEST,i as WorkCapabilityManifestSchema,a as WorkCapabilitySchema};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as e}from"zod";import{z as o}from"zod";var r=o.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"]),s=o.enum(["backlog","unstarted","started","completed","cancelled"]),m=o.enum(["parent","child","blocks","blocked_by","relates_to","duplicates","duplicated_by","supersedes","multi_homed_in"]);var a=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,t=e.string().regex(a,"UUIDv7 required"),c=e.string().datetime({offset:!0}),_=e.object({id:t,kind:r}),n=e.object({principalId:t,principalKind:e.enum(["member","guest","contractor","service_principal"])}),i=e.object({tenantId:t,organizationId:t,workspaceId:t}),k=e.object({scope:i,createdAt:c,createdBy:n,updatedAt:c,updatedBy:n,revision:e.number().int().nonnegative()});export{n as WorkActorRefSchema,t as WorkIdSchema,c as WorkIsoDateTimeSchema,_ as WorkObjectRefSchema,k as WorkRecordMetadataSchema,i as WorkScopeSchema};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as e}from"zod";import{z as a}from"zod";import{z as m}from"zod";var s=m.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"]),p=m.enum(["backlog","unstarted","started","completed","cancelled"]),d=m.enum(["parent","child","blocks","blocked_by","relates_to","duplicates","duplicated_by","supersedes","multi_homed_in"]);var u=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,t=a.string().regex(u,"UUIDv7 required"),n=a.string().datetime({offset:!0}),o=a.object({id:t,kind:s}),i=a.object({principalId:t,principalKind:a.enum(["member","guest","contractor","service_principal"])}),k=a.object({tenantId:t,organizationId:t,workspaceId:t}),r=a.object({scope:k,createdAt:n,createdBy:i,updatedAt:n,updatedBy:i,revision:a.number().int().nonnegative()});var f=e.object({from:o,to:o}).refine(({from:c,to:l})=>c.id!==l.id,"Work graph links cannot self-reference"),R=e.object({id:t,metadata:r,kind:e.enum(["blocks","blocked_by"]),lagMinutes:e.number().int().nonnegative().default(0)}).and(f),v=e.object({id:t,metadata:r,kind:d}).and(f),z=e.object({id:t,metadata:r,workRef:o,body:e.string().min(1).max(1e5),mentionedPrincipalIds:e.array(t).default([]),attachmentRefs:e.array(o).default([]),parentCommentRef:o.optional(),resolvedAt:n.optional(),resolvedBy:i.optional()}),y=e.object({id:t,name:e.string().min(1).max(120),category:p,position:e.number().int().nonnegative(),color:e.string().regex(/^#[0-9a-f]{6}$/i).optional()}),w=e.object({id:t,metadata:r,title:e.string().min(1).max(200),statuses:e.array(y).min(1),allowedTransitions:e.array(e.object({fromStatusId:t,toStatusId:t}))}),C=e.object({id:t,metadata:r,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:t,label:e.string().min(1)})).default([]),formula:e.string().min(1).optional(),required:e.boolean().default(!1)}),I=e.object({id:t,metadata:r,fieldRef:o.refine(({kind:c})=>c==="custom_field_definition","Custom field values must reference a custom-field definition"),workRef:o,value:e.unknown()}),D=e.object({id:t,metadata:r,name:e.string().min(1).max(200),viewType:e.enum(["list","board","table","calendar","timeline","gantt","workload"]),containerRef:o,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(o).default([])}),A=e.object({id:t,metadata:r,goalRef:o,current:e.number(),target:e.number(),unit:e.string().min(1).max(80),updatedAt:n});export{z as WorkCommentSchema,C as WorkCustomFieldDefinitionSchema,I as WorkCustomFieldValueSchema,R as WorkDependencySchema,A as WorkGoalProgressSchema,v as WorkRelationshipEdgeSchema,D as WorkSavedViewSchema,y as WorkStatusDefinitionSchema,w as WorkStatusWorkflowSchema};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
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 @@
|
|
|
1
|
+
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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as e}from"zod";import{z as a}from"zod";import{z as c}from"zod";var i=c.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"]),p=c.enum(["backlog","unstarted","started","completed","cancelled"]),m=c.enum(["parent","child","blocks","blocked_by","relates_to","duplicates","duplicated_by","supersedes","multi_homed_in"]);var f=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,o=a.string().regex(f,"UUIDv7 required"),r=a.string().datetime({offset:!0}),t=a.object({id:o,kind:i}),s=a.object({principalId:o,principalKind:a.enum(["member","guest","contractor","service_principal"])}),l=a.object({tenantId:o,organizationId:o,workspaceId:o}),n=a.object({scope:l,createdAt:r,createdBy:s,updatedAt:r,updatedBy:s,revision:a.number().int().nonnegative()});var x=e.object({id:o,kind:i,title:e.string().min(1).max(500),description:e.string().max(1e5).optional(),metadata:n,parentRef:t.optional(),ownerRefs:e.array(t).default([]),assigneeRefs:e.array(t).default([]),statusId:o.optional(),statusCategory:p.optional(),priority:e.number().int().min(0).max(100).optional(),estimateMinutes:e.number().int().positive().optional(),desiredStartAt:r.optional(),dueAt:r.optional(),completedAt:r.optional(),recurrenceTemplateRef:t.optional(),captureRef:t.refine(({kind:d})=>d==="capture_reference","Capture provenance must reference a capture_reference Work object").optional(),customFieldValueRefs:e.array(t).default([]),evidenceRefs:e.array(t).default([]),externalBindingRefs:e.array(t).default([]),archivedAt:r.optional()}),R=e.object({id:o,metadata:n,from:t,to:t,kind:m}),g=e.object({id:o,metadata:n,templateRef:t,rule:e.object({frequency:e.enum(["daily","weekly","monthly","yearly"]),interval:e.number().int().positive().default(1),timeZone:e.string().min(1),startsAt:r,endsAt:r.optional(),count:e.number().int().positive().optional()})}),j=e.object({id:o,metadata:n,workRef:t,memberRef:t,startedAt:r,endedAt:r.optional(),durationMinutes:e.number().int().nonnegative(),note:e.string().max(1e4).optional()});export{x as WorkObjectSchema,g as WorkRecurrenceSchema,R as WorkRelationshipSchema,j as WorkTimeEntrySchema};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as p}from"zod";import{z as a}from"zod";import{z as c}from"zod";var i=c.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"]),s=c.enum(["backlog","unstarted","started","completed","cancelled"]),m=c.enum(["parent","child","blocks","blocked_by","relates_to","duplicates","duplicated_by","supersedes","multi_homed_in"]);var u=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,o=a.string().regex(u,"UUIDv7 required"),r=a.string().datetime({offset:!0}),t=a.object({id:o,kind:i}),d=a.object({principalId:o,principalKind:a.enum(["member","guest","contractor","service_principal"])}),k=a.object({tenantId:o,organizationId:o,workspaceId:o}),n=a.object({scope:k,createdAt:r,createdBy:d,updatedAt:r,updatedBy:d,revision:a.number().int().nonnegative()});import{z as e}from"zod";var f=e.object({id:o,kind:i,title:e.string().min(1).max(500),description:e.string().max(1e5).optional(),metadata:n,parentRef:t.optional(),ownerRefs:e.array(t).default([]),assigneeRefs:e.array(t).default([]),statusId:o.optional(),statusCategory:s.optional(),priority:e.number().int().min(0).max(100).optional(),estimateMinutes:e.number().int().positive().optional(),desiredStartAt:r.optional(),dueAt:r.optional(),completedAt:r.optional(),recurrenceTemplateRef:t.optional(),captureRef:t.refine(({kind:l})=>l==="capture_reference","Capture provenance must reference a capture_reference Work object").optional(),customFieldValueRefs:e.array(t).default([]),evidenceRefs:e.array(t).default([]),externalBindingRefs:e.array(t).default([]),archivedAt:r.optional()}),j=e.object({id:o,metadata:n,from:t,to:t,kind:m}),x=e.object({id:o,metadata:n,templateRef:t,rule:e.object({frequency:e.enum(["daily","weekly","monthly","yearly"]),interval:e.number().int().positive().default(1),timeZone:e.string().min(1),startsAt:r,endsAt:r.optional(),count:e.number().int().positive().optional()})}),v=e.object({id:o,metadata:n,workRef:t,memberRef:t,startedAt:r,endedAt:r.optional(),durationMinutes:e.number().int().nonnegative(),note:e.string().max(1e4).optional()});var T=p.object({objectId:o}).strict(),w=p.object({object:f,canUpdateStatus:p.boolean().optional()}).strict(),C={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."]};export{C as WORK_OBJECT_READ_CONTRACT,T as WorkObjectReadRequestSchema,w as WorkObjectReadResponseSchema};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as e}from"zod";import{z as o}from"zod";import{z as n}from"zod";var c=n.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"]),k=n.enum(["backlog","unstarted","started","completed","cancelled"]),f=n.enum(["parent","child","blocks","blocked_by","relates_to","duplicates","duplicated_by","supersedes","multi_homed_in"]);var d=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,t=o.string().regex(d,"UUIDv7 required"),s=o.string().datetime({offset:!0}),p=o.object({id:t,kind:c}),r=o.object({principalId:t,principalKind:o.enum(["member","guest","contractor","service_principal"])}),a=o.object({tenantId:t,organizationId:t,workspaceId:t}),b=o.object({scope:a,createdAt:s,createdBy:r,updatedAt:s,updatedBy:r,revision:o.number().int().nonnegative()});var l=e.enum(["read_only","suggest_only","within_policy","approval_required","reserved_human_only"]),m=e.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"]),W=e.object({operationId:t,operationKey:m,scope:a,actor:r,target:p.optional(),expectedRevision:e.number().int().nonnegative().optional(),idempotencyKey:e.string().min(1).max(255),correlationId:t,causationId:t.optional(),evidenceRef:e.string().min(1),actionClass:l,approvalRef:e.string().min(1).optional(),payload:e.record(e.string(),e.unknown())});function x(i){return i.actionClass==="approval_required"||i.actionClass==="reserved_human_only"}var S={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."]},j={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."]};export{j as WORK_CANONICAL_SCOPE_BINDING_CONTRACT,S as WORK_MANAGED_COMMIT_AUTHORITY_CONTRACT,l as WorkActionClassSchema,W as WorkMutationEnvelopeSchema,m as WorkOperationKeySchema,x as mutationRequiresApproval};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as e}from"zod";import{z as o}from"zod";import{z as a}from"zod";var c=a.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=a.enum(["backlog","unstarted","started","completed","cancelled"]),u=a.enum(["parent","child","blocks","blocked_by","relates_to","duplicates","duplicated_by","supersedes","multi_homed_in"]);var m=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,t=o.string().regex(m,"UUIDv7 required"),r=o.string().datetime({offset:!0}),n=o.object({id:t,kind:c}),p=o.object({principalId:t,principalKind:o.enum(["member","guest","contractor","service_principal"])}),s=o.object({tenantId:t,organizationId:t,workspaceId:t}),i=o.object({scope:s,createdAt:r,createdBy:p,updatedAt:r,updatedBy:p,revision:o.number().int().nonnegative()});var d=e.enum(["import_once","mirror_remote","two_way"]),f=e.enum(["native","remote","merge"]),l=e.enum(["content","status","assignment","dates","custom_fields"]),x=e.object({id:t,metadata:i,workRef:n,providerKey:e.string().min(1),connectionId:t,remoteObjectType:e.string().min(1),remoteObjectId:e.string().min(1),remoteRevision:e.string().min(1).optional(),mode:d,authority:e.record(l,f),lastSynchronizedSnapshotRef:e.string().min(1).optional(),adapterPayloadRef:e.string().min(1).optional()}),R=e.object({id:t,metadata:i,bindingRef:n,workRef:n,fieldPath:e.string().min(1),baseValueRef:e.string().min(1),nativeValueRef:e.string().min(1),remoteValueRef:e.string().min(1),detectedAt:r,status:e.enum(["open","resolved_native","resolved_remote","resolved_merge"]),resolvedAt:r.optional(),resolvedByRef:n.optional()}),v=e.object({id:t,metadata:i,workRef:n,bindingRef:n.optional(),deletedAt:r,recoverUntil:r,reason:e.string().min(1)});export{x as WorkExternalBindingSchema,f as WorkFieldAuthoritySchema,l as WorkFieldGroupSchema,R as WorkSyncConflictSchema,d as WorkSyncModeSchema,v as WorkTombstoneSchema};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as f}from"zod";import{z as m}from"zod";import{z as u}from"zod";var l=u.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"]),s=u.enum(["backlog","unstarted","started","completed","cancelled"]),k=u.enum(["parent","child","blocks","blocked_by","relates_to","duplicates","duplicated_by","supersedes","multi_homed_in"]);var w=/^[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(w,"UUIDv7 required"),n=m.string().datetime({offset:!0}),r=m.object({id:o,kind:l}),p=m.object({principalId:o,principalKind:m.enum(["member","guest","contractor","service_principal"])}),h=m.object({tenantId:o,organizationId:o,workspaceId:o}),i=m.object({scope:h,createdAt:n,createdBy:p,updatedAt:n,updatedBy:p,revision:m.number().int().nonnegative()});import{z as t}from"zod";import{z as e}from"zod";var W=e.object({from:r,to:r}).refine(({from:d,to:_})=>d.id!==_.id,"Work graph links cannot self-reference"),H=e.object({id:o,metadata:i,kind:e.enum(["blocks","blocked_by"]),lagMinutes:e.number().int().nonnegative().default(0)}).and(W),b=e.object({id:o,metadata:i,kind:k}).and(W),v=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()}),T=e.object({id:o,name:e.string().min(1).max(120),category:s,position:e.number().int().nonnegative(),color:e.string().regex(/^#[0-9a-f]{6}$/i).optional()}),J=e.object({id:o,metadata:i,title:e.string().min(1).max(200),statuses:e.array(T).min(1),allowedTransitions:e.array(e.object({fromStatusId:o,toStatusId:o}))}),Q=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)}),x=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()}),Y=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([])}),ee=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:l,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:s.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()}),ne=a.object({id:o,metadata:i,from:r,to:r,kind:k}),g=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()})}),j=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 de=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:h,actor:p,occurredAt:n,idempotencyKey:t.string().min(1).max(255),correlationId:o,causationId:o.optional(),evidenceRef:t.string().min(1)}),E=c.extend({eventType:t.literal("work.object.created"),payload:t.object({object:y})}),z=c.extend({eventType:t.literal("work.object.updated"),payload:t.object({object:y})}),C=c.extend({eventType:t.literal("work.object.archived"),payload:t.object({}).strict()}),O=c.extend({eventType:t.literal("work.object.restored"),payload:t.object({}).strict()}),A=c.extend({eventType:t.literal("work.recurrence.set"),payload:t.object({recurrence:g})}),R=t.object({timeEntry:j}),I=c.extend({eventType:t.literal("work.time.started"),payload:R}),D=c.extend({eventType:t.literal("work.time.stopped"),payload:R}),K=c.extend({eventType:t.literal("work.relationship.set"),payload:t.object({edge:b})}),V=c.extend({eventType:t.literal("work.comment.created"),payload:t.object({comment:v})}),F=c.extend({eventType:t.literal("work.attachment.linked"),payload:t.object({attachmentRef:r})}),q=c.extend({eventType:t.literal("work.custom_field.set"),payload:t.object({value:x})}),S=t.discriminatedUnion("eventType",[E,z,C,O,A,I,D,K,V,F,q]),le=t.object({id:o,event:S,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()}),ke={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."]};var B=f.object({objectId:o,expectedRevision:f.number().int().positive(),statusCategory:s,idempotencyKey:f.string().min(8).max(200)}).strict(),We=B.omit({objectId:!0}),be=f.object({event:S}).strict(),ve={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."]};export{ve as WORK_TASK_STATUS_CONTRACT,We as WorkTaskStatusBodySchema,B as WorkTaskStatusRequestSchema,be as WorkTaskStatusResponseSchema};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as e}from"zod";var o=e.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"]),r=e.enum(["backlog","unstarted","started","completed","cancelled"]),n=e.enum(["parent","child","blocks","blocked_by","relates_to","duplicates","duplicated_by","supersedes","multi_homed_in"]);export{o as WorkObjectKindSchema,n as WorkRelationshipKindSchema,r as WorkStatusCategorySchema};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={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"]};export{e as workSpecFeatureDoc};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as n}from"zod";import{z as e}from"zod";import{z as i}from"zod";var s=i.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"]),k=i.enum(["backlog","unstarted","started","completed","cancelled"]),l=i.enum(["parent","child","blocks","blocked_by","relates_to","duplicates","duplicated_by","supersedes","multi_homed_in"]);var m=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,t=e.string().regex(m,"UUIDv7 required"),p=e.string().datetime({offset:!0}),_=e.object({id:t,kind:s}),d=e.object({principalId:t,principalKind:e.enum(["member","guest","contractor","service_principal"])}),c=e.object({tenantId:t,organizationId:t,workspaceId:t}),y=e.object({scope:c,createdAt:p,createdBy:d,updatedAt:p,updatedBy:d,revision:e.number().int().nonnegative()});var v=n.object({scope:c,heads:n.array(n.object({aggregateId:t,revision:n.number().int().positive()}).strict()).max(1e4)}).strict().superRefine((o,r)=>{for(let a=1;a<o.heads.length;a++)if(o.heads[a-1].aggregateId>=o.heads[a].aggregateId)r.addIssue({code:"custom",message:"Work revision heads must be unique and sorted"})}),x=(o)=>{let r=c.parse(o);return JSON.stringify(["work-workspace-revision",r.tenantId,r.organizationId,r.workspaceId])},I={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{I as WORK_WORKSPACE_REVISION_CONTRACT,v as WorkWorkspaceRevisionSchema,x as workWorkspaceRevisionLockKey};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const WorkCapabilitySchema: z.ZodEnum<{
|
|
3
|
+
collaboration: "collaboration";
|
|
4
|
+
events: "events";
|
|
5
|
+
execution: "execution";
|
|
6
|
+
organization: "organization";
|
|
7
|
+
personal_productivity: "personal_productivity";
|
|
8
|
+
realtime_metadata: "realtime_metadata";
|
|
9
|
+
search: "search";
|
|
10
|
+
strategy: "strategy";
|
|
11
|
+
sync: "sync";
|
|
12
|
+
tenant_structure: "tenant_structure";
|
|
13
|
+
}>;
|
|
14
|
+
export type WorkCapability = z.infer<typeof WorkCapabilitySchema>;
|
|
15
|
+
export declare const WorkCapabilityManifestSchema: z.ZodObject<{
|
|
16
|
+
contractVersion: z.ZodLiteral<"2.0.0">;
|
|
17
|
+
capabilities: z.ZodArray<z.ZodEnum<{
|
|
18
|
+
collaboration: "collaboration";
|
|
19
|
+
events: "events";
|
|
20
|
+
execution: "execution";
|
|
21
|
+
organization: "organization";
|
|
22
|
+
personal_productivity: "personal_productivity";
|
|
23
|
+
realtime_metadata: "realtime_metadata";
|
|
24
|
+
search: "search";
|
|
25
|
+
strategy: "strategy";
|
|
26
|
+
sync: "sync";
|
|
27
|
+
tenant_structure: "tenant_structure";
|
|
28
|
+
}>>;
|
|
29
|
+
requires: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
30
|
+
optional: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
31
|
+
productionSafe: z.ZodBoolean;
|
|
32
|
+
fakeDefaults: z.ZodBoolean;
|
|
33
|
+
}, z.core.$strip>;
|
|
34
|
+
export type WorkCapabilityManifest = z.infer<typeof WorkCapabilityManifestSchema>;
|
|
35
|
+
export declare const WORK_SPEC_CAPABILITY_MANIFEST: {
|
|
36
|
+
readonly contractVersion: '2.0.0';
|
|
37
|
+
readonly capabilities: ["tenant_structure", "strategy", "execution", "organization", "collaboration", "personal_productivity", "sync", "events", "search", "realtime_metadata"];
|
|
38
|
+
readonly requires: [];
|
|
39
|
+
readonly optional: ["@lssm/lib.organization-planning-spec", "@lssm/lib.knowledge", "@lssm/lib.workflow-orchestration"];
|
|
40
|
+
readonly productionSafe: false;
|
|
41
|
+
readonly fakeDefaults: false;
|
|
42
|
+
};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{z as t}from"zod";var a=t.enum(["tenant_structure","strategy","execution","organization","collaboration","personal_productivity","sync","events","search","realtime_metadata"]),i=t.object({contractVersion:t.literal("2.0.0"),capabilities:t.array(a).min(1),requires:t.array(t.string().min(1)).default([]),optional:t.array(t.string().min(1)).default([]),productionSafe:t.boolean(),fakeDefaults:t.boolean()}),o={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};export{o as WORK_SPEC_CAPABILITY_MANIFEST,i as WorkCapabilityManifestSchema,a as WorkCapabilitySchema};
|
package/dist/common.d.ts
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const WorkIdSchema: z.ZodString;
|
|
3
|
+
export type WorkId = z.infer<typeof WorkIdSchema>;
|
|
4
|
+
export declare const WorkIsoDateTimeSchema: z.ZodString;
|
|
5
|
+
export declare const WorkObjectRefSchema: z.ZodObject<{
|
|
6
|
+
id: z.ZodString;
|
|
7
|
+
kind: z.ZodEnum<{
|
|
8
|
+
activity: "activity";
|
|
9
|
+
agent_reference: "agent_reference";
|
|
10
|
+
approval_reference: "approval_reference";
|
|
11
|
+
attachment: "attachment";
|
|
12
|
+
automation_reference: "automation_reference";
|
|
13
|
+
bug: "bug";
|
|
14
|
+
canvas_reference: "canvas_reference";
|
|
15
|
+
capture_reference: "capture_reference";
|
|
16
|
+
collection: "collection";
|
|
17
|
+
comment: "comment";
|
|
18
|
+
contractor: "contractor";
|
|
19
|
+
cross_organization_acl_grant: "cross_organization_acl_grant";
|
|
20
|
+
custom_field_definition: "custom_field_definition";
|
|
21
|
+
custom_field_value: "custom_field_value";
|
|
22
|
+
cycle: "cycle";
|
|
23
|
+
dependency: "dependency";
|
|
24
|
+
document_reference: "document_reference";
|
|
25
|
+
epic: "epic";
|
|
26
|
+
estimate: "estimate";
|
|
27
|
+
evidence_reference: "evidence_reference";
|
|
28
|
+
external_binding: "external_binding";
|
|
29
|
+
focus_policy: "focus_policy";
|
|
30
|
+
folder_projection: "folder_projection";
|
|
31
|
+
form: "form";
|
|
32
|
+
guest: "guest";
|
|
33
|
+
habit: "habit";
|
|
34
|
+
inbox_item: "inbox_item";
|
|
35
|
+
initiative: "initiative";
|
|
36
|
+
issue: "issue";
|
|
37
|
+
key_result: "key_result";
|
|
38
|
+
list: "list";
|
|
39
|
+
member: "member";
|
|
40
|
+
mention: "mention";
|
|
41
|
+
milestone: "milestone";
|
|
42
|
+
objective: "objective";
|
|
43
|
+
occurrence: "occurrence";
|
|
44
|
+
organization: "organization";
|
|
45
|
+
planning_intent: "planning_intent";
|
|
46
|
+
portfolio: "portfolio";
|
|
47
|
+
program: "program";
|
|
48
|
+
project: "project";
|
|
49
|
+
proofing_request: "proofing_request";
|
|
50
|
+
reaction: "reaction";
|
|
51
|
+
recurrence_template: "recurrence_template";
|
|
52
|
+
relationship: "relationship";
|
|
53
|
+
roadmap: "roadmap";
|
|
54
|
+
saved_view: "saved_view";
|
|
55
|
+
schedule_binding_reference: "schedule_binding_reference";
|
|
56
|
+
service_principal: "service_principal";
|
|
57
|
+
status_workflow: "status_workflow";
|
|
58
|
+
story: "story";
|
|
59
|
+
subtask: "subtask";
|
|
60
|
+
sync_conflict: "sync_conflict";
|
|
61
|
+
sync_cursor: "sync_cursor";
|
|
62
|
+
task: "task";
|
|
63
|
+
team: "team";
|
|
64
|
+
template: "template";
|
|
65
|
+
time_entry: "time_entry";
|
|
66
|
+
tombstone: "tombstone";
|
|
67
|
+
workspace: "workspace";
|
|
68
|
+
}>;
|
|
69
|
+
}, z.core.$strip>;
|
|
70
|
+
export type WorkObjectRef = z.infer<typeof WorkObjectRefSchema>;
|
|
71
|
+
export declare const WorkActorRefSchema: z.ZodObject<{
|
|
72
|
+
principalId: z.ZodString;
|
|
73
|
+
principalKind: z.ZodEnum<{
|
|
74
|
+
contractor: "contractor";
|
|
75
|
+
guest: "guest";
|
|
76
|
+
member: "member";
|
|
77
|
+
service_principal: "service_principal";
|
|
78
|
+
}>;
|
|
79
|
+
}, z.core.$strip>;
|
|
80
|
+
export type WorkActorRef = z.infer<typeof WorkActorRefSchema>;
|
|
81
|
+
export declare const WorkScopeSchema: z.ZodObject<{
|
|
82
|
+
tenantId: z.ZodString;
|
|
83
|
+
organizationId: z.ZodString;
|
|
84
|
+
workspaceId: z.ZodString;
|
|
85
|
+
}, z.core.$strip>;
|
|
86
|
+
export type WorkScope = z.infer<typeof WorkScopeSchema>;
|
|
87
|
+
export declare const WorkRecordMetadataSchema: z.ZodObject<{
|
|
88
|
+
scope: z.ZodObject<{
|
|
89
|
+
tenantId: z.ZodString;
|
|
90
|
+
organizationId: z.ZodString;
|
|
91
|
+
workspaceId: z.ZodString;
|
|
92
|
+
}, z.core.$strip>;
|
|
93
|
+
createdAt: z.ZodString;
|
|
94
|
+
createdBy: z.ZodObject<{
|
|
95
|
+
principalId: z.ZodString;
|
|
96
|
+
principalKind: z.ZodEnum<{
|
|
97
|
+
contractor: "contractor";
|
|
98
|
+
guest: "guest";
|
|
99
|
+
member: "member";
|
|
100
|
+
service_principal: "service_principal";
|
|
101
|
+
}>;
|
|
102
|
+
}, z.core.$strip>;
|
|
103
|
+
updatedAt: z.ZodString;
|
|
104
|
+
updatedBy: z.ZodObject<{
|
|
105
|
+
principalId: z.ZodString;
|
|
106
|
+
principalKind: z.ZodEnum<{
|
|
107
|
+
contractor: "contractor";
|
|
108
|
+
guest: "guest";
|
|
109
|
+
member: "member";
|
|
110
|
+
service_principal: "service_principal";
|
|
111
|
+
}>;
|
|
112
|
+
}, z.core.$strip>;
|
|
113
|
+
revision: z.ZodNumber;
|
|
114
|
+
}, z.core.$strip>;
|
|
115
|
+
export type WorkRecordMetadata = z.infer<typeof WorkRecordMetadataSchema>;
|
package/dist/common.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{z as e}from"zod";import{z as o}from"zod";var r=o.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"]),s=o.enum(["backlog","unstarted","started","completed","cancelled"]),m=o.enum(["parent","child","blocks","blocked_by","relates_to","duplicates","duplicated_by","supersedes","multi_homed_in"]);var a=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,t=e.string().regex(a,"UUIDv7 required"),c=e.string().datetime({offset:!0}),_=e.object({id:t,kind:r}),n=e.object({principalId:t,principalKind:e.enum(["member","guest","contractor","service_principal"])}),i=e.object({tenantId:t,organizationId:t,workspaceId:t}),k=e.object({scope:i,createdAt:c,createdBy:n,updatedAt:c,updatedBy:n,revision:e.number().int().nonnegative()});export{n as WorkActorRefSchema,t as WorkIdSchema,c as WorkIsoDateTimeSchema,_ as WorkObjectRefSchema,k as WorkRecordMetadataSchema,i as WorkScopeSchema};
|