@owlmeans/planning 0.1.18-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/README.md +169 -0
  2. package/agent-meta/manifest.json +16 -0
  3. package/agent-meta/skills/planning/SKILL.md +248 -0
  4. package/build/consts.d.ts +126 -0
  5. package/build/consts.d.ts.map +1 -0
  6. package/build/consts.js +129 -0
  7. package/build/consts.js.map +1 -0
  8. package/build/entrypoints.d.ts +14 -0
  9. package/build/entrypoints.d.ts.map +1 -0
  10. package/build/entrypoints.js +69 -0
  11. package/build/entrypoints.js.map +1 -0
  12. package/build/errors.d.ts +94 -0
  13. package/build/errors.d.ts.map +1 -0
  14. package/build/errors.js +169 -0
  15. package/build/errors.js.map +1 -0
  16. package/build/helpers/apply.d.ts +27 -0
  17. package/build/helpers/apply.d.ts.map +1 -0
  18. package/build/helpers/apply.js +162 -0
  19. package/build/helpers/apply.js.map +1 -0
  20. package/build/helpers/card.d.ts +17 -0
  21. package/build/helpers/card.d.ts.map +1 -0
  22. package/build/helpers/card.js +31 -0
  23. package/build/helpers/card.js.map +1 -0
  24. package/build/helpers/changes.d.ts +51 -0
  25. package/build/helpers/changes.d.ts.map +1 -0
  26. package/build/helpers/changes.js +277 -0
  27. package/build/helpers/changes.js.map +1 -0
  28. package/build/helpers/code.d.ts +24 -0
  29. package/build/helpers/code.d.ts.map +1 -0
  30. package/build/helpers/code.js +47 -0
  31. package/build/helpers/code.js.map +1 -0
  32. package/build/helpers/index.d.ts +9 -0
  33. package/build/helpers/index.d.ts.map +1 -0
  34. package/build/helpers/index.js +9 -0
  35. package/build/helpers/index.js.map +1 -0
  36. package/build/helpers/query.d.ts +39 -0
  37. package/build/helpers/query.d.ts.map +1 -0
  38. package/build/helpers/query.js +293 -0
  39. package/build/helpers/query.js.map +1 -0
  40. package/build/helpers/specification.d.ts +21 -0
  41. package/build/helpers/specification.d.ts.map +1 -0
  42. package/build/helpers/specification.js +48 -0
  43. package/build/helpers/specification.js.map +1 -0
  44. package/build/helpers/status.d.ts +44 -0
  45. package/build/helpers/status.d.ts.map +1 -0
  46. package/build/helpers/status.js +78 -0
  47. package/build/helpers/status.js.map +1 -0
  48. package/build/helpers/validate.d.ts +30 -0
  49. package/build/helpers/validate.d.ts.map +1 -0
  50. package/build/helpers/validate.js +93 -0
  51. package/build/helpers/validate.js.map +1 -0
  52. package/build/i18n/be.json +51 -0
  53. package/build/i18n/de.json +51 -0
  54. package/build/i18n/en.json +51 -0
  55. package/build/i18n/es.json +51 -0
  56. package/build/i18n/pl.json +51 -0
  57. package/build/i18n/ru.json +51 -0
  58. package/build/i18n/uk.json +51 -0
  59. package/build/i18n.d.ts +2 -0
  60. package/build/i18n.d.ts.map +1 -0
  61. package/build/i18n.js +19 -0
  62. package/build/i18n.js.map +1 -0
  63. package/build/index.d.ts +10 -0
  64. package/build/index.d.ts.map +1 -0
  65. package/build/index.js +9 -0
  66. package/build/index.js.map +1 -0
  67. package/build/models/index.d.ts +7 -0
  68. package/build/models/index.d.ts.map +1 -0
  69. package/build/models/index.js +19 -0
  70. package/build/models/index.js.map +1 -0
  71. package/build/models/project.d.ts +4 -0
  72. package/build/models/project.d.ts.map +1 -0
  73. package/build/models/project.js +17 -0
  74. package/build/models/project.js.map +1 -0
  75. package/build/models/specification.d.ts +4 -0
  76. package/build/models/specification.d.ts.map +1 -0
  77. package/build/models/specification.js +15 -0
  78. package/build/models/specification.js.map +1 -0
  79. package/build/models/workcard.d.ts +14 -0
  80. package/build/models/workcard.d.ts.map +1 -0
  81. package/build/models/workcard.js +103 -0
  82. package/build/models/workcard.js.map +1 -0
  83. package/build/queue/index.d.ts +25 -0
  84. package/build/queue/index.d.ts.map +1 -0
  85. package/build/queue/index.js +14 -0
  86. package/build/queue/index.js.map +1 -0
  87. package/build/registry.d.ts +10 -0
  88. package/build/registry.d.ts.map +1 -0
  89. package/build/registry.js +75 -0
  90. package/build/registry.js.map +1 -0
  91. package/build/schemas.d.ts +56 -0
  92. package/build/schemas.d.ts.map +1 -0
  93. package/build/schemas.js +578 -0
  94. package/build/schemas.js.map +1 -0
  95. package/build/types.d.ts +785 -0
  96. package/build/types.d.ts.map +1 -0
  97. package/build/types.js +2 -0
  98. package/build/types.js.map +1 -0
  99. package/package.json +58 -0
  100. package/src/consts.ts +136 -0
  101. package/src/entrypoints.ts +127 -0
  102. package/src/errors.ts +207 -0
  103. package/src/helpers/apply.ts +183 -0
  104. package/src/helpers/card.ts +42 -0
  105. package/src/helpers/changes.ts +333 -0
  106. package/src/helpers/code.ts +66 -0
  107. package/src/helpers/index.ts +8 -0
  108. package/src/helpers/query.ts +345 -0
  109. package/src/helpers/specification.ts +65 -0
  110. package/src/helpers/status.ts +117 -0
  111. package/src/helpers/validate.ts +107 -0
  112. package/src/i18n/be.json +51 -0
  113. package/src/i18n/de.json +51 -0
  114. package/src/i18n/en.json +51 -0
  115. package/src/i18n/es.json +51 -0
  116. package/src/i18n/pl.json +51 -0
  117. package/src/i18n/ru.json +51 -0
  118. package/src/i18n/uk.json +51 -0
  119. package/src/i18n.ts +21 -0
  120. package/src/index.ts +9 -0
  121. package/src/models/index.ts +21 -0
  122. package/src/models/project.ts +24 -0
  123. package/src/models/specification.ts +21 -0
  124. package/src/models/workcard.ts +138 -0
  125. package/src/queue/index.ts +31 -0
  126. package/src/registry.ts +90 -0
  127. package/src/schemas.ts +654 -0
  128. package/src/types.ts +837 -0
  129. package/tests/apply.spec.ts +176 -0
  130. package/tests/code.spec.ts +40 -0
  131. package/tests/entrypoints.spec.ts +57 -0
  132. package/tests/fixtures.ts +124 -0
  133. package/tests/i18n.spec.ts +30 -0
  134. package/tests/models.spec.ts +133 -0
  135. package/tests/query.spec.ts +90 -0
  136. package/tests/schemas.spec.ts +74 -0
  137. package/tests/status.spec.ts +75 -0
  138. package/tests/tsconfig.json +17 -0
  139. package/tsconfig.json +15 -0
package/build/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export * from './consts.js';
2
+ export * from './schemas.js';
3
+ export * from './errors.js';
4
+ export * from './entrypoints.js';
5
+ export * from './registry.js';
6
+ export * from './helpers/index.js';
7
+ export * from './models/index.js';
8
+ export * from './i18n.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,WAAW,CAAA"}
@@ -0,0 +1,7 @@
1
+ import type { PlanningFacade, Workcard, WorkcardModel } from '../types.js';
2
+ export { executeFor, makeWorkcardModel } from './workcard.js';
3
+ export { makeProjectModel } from './project.js';
4
+ export { makeSpecificationModel } from './specification.js';
5
+ /** The model a record's kind calls for — what a facade's `model()` answers. */
6
+ export declare const modelOf: <T extends Workcard = Workcard>(record: T, facade: PlanningFacade) => WorkcardModel<T>;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAA0B,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAKlG,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAE3D,+EAA+E;AAC/E,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,QAAQ,GAAG,QAAQ,UAAU,CAAC,UAAU,cAAc,KAAG,aAAa,CAAC,CAAC,CASzG,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { WorkcardKind } from '../consts.js';
2
+ import { makeProjectModel } from './project.js';
3
+ import { makeSpecificationModel } from './specification.js';
4
+ import { makeWorkcardModel } from './workcard.js';
5
+ export { executeFor, makeWorkcardModel } from './workcard.js';
6
+ export { makeProjectModel } from './project.js';
7
+ export { makeSpecificationModel } from './specification.js';
8
+ /** The model a record's kind calls for — what a facade's `model()` answers. */
9
+ export const modelOf = (record, facade) => {
10
+ switch (record.kind) {
11
+ case WorkcardKind.Project:
12
+ return makeProjectModel(record, facade);
13
+ case WorkcardKind.Specification:
14
+ return makeSpecificationModel(record, facade);
15
+ default:
16
+ return makeWorkcardModel(record, facade);
17
+ }
18
+ };
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEjD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAE3D,+EAA+E;AAC/E,MAAM,CAAC,MAAM,OAAO,GAAG,CAAgC,MAAS,EAAE,MAAsB,EAAoB,EAAE;IAC5G,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,YAAY,CAAC,OAAO;YACvB,OAAO,gBAAgB,CAAC,MAA4B,EAAE,MAAM,CAAgC,CAAA;QAC9F,KAAK,YAAY,CAAC,aAAa;YAC7B,OAAO,sBAAsB,CAAC,MAAkC,EAAE,MAAM,CAAgC,CAAA;QAC1G;YACE,OAAO,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { PlanningFacade, Project, ProjectModel } from '../types.js';
2
+ /** A workcard model plus the project's own reads: its cards, its sub-projects, its summary. */
3
+ export declare const makeProjectModel: (record: Project, facade: PlanningFacade) => ProjectModel;
4
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/models/project.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAGxE,+FAA+F;AAC/F,eAAO,MAAM,gBAAgB,WAAY,OAAO,UAAU,cAAc,KAAG,YAkB1E,CAAA"}
@@ -0,0 +1,17 @@
1
+ import { IntrinsicStatus, WorkcardKind } from '../consts.js';
2
+ import { makeWorkcardModel } from './workcard.js';
3
+ /** A workcard model plus the project's own reads: its cards, its sub-projects, its summary. */
4
+ export const makeProjectModel = (record, facade) => {
5
+ const model = makeWorkcardModel(record, facade);
6
+ return {
7
+ ...model,
8
+ cards: query => facade.cards.list({ ...query, within: model.id, kind: WorkcardKind.Card }),
9
+ projects: query => facade.cards.list({ ...query, within: model.id, kind: WorkcardKind.Project }),
10
+ summary: async (query) => (await facade.cards.summary([model.id], query))[model.id] ?? {
11
+ total: 0, [IntrinsicStatus.Planned]: 0, [IntrinsicStatus.InProgress]: 0, [IntrinsicStatus.Closed]: 0,
12
+ },
13
+ purge: opts => model.remove(opts),
14
+ reload: async () => makeProjectModel(await facade.cards.get(model.id), facade),
15
+ };
16
+ };
17
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/models/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEjD,+FAA+F;AAC/F,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAe,EAAE,MAAsB,EAAgB,EAAE;IACxF,MAAM,KAAK,GAAG,iBAAiB,CAAU,MAAM,EAAE,MAAM,CAAC,CAAA;IAExD,OAAO;QACL,GAAG,KAAK;QAER,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC;QAE1F,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC;QAEhG,OAAO,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;YACnF,KAAK,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;SACrG;QAED,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;QAEjC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,gBAAgB,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAY,EAAE,MAAM,CAAC;KAC1F,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { PlanningFacade, Specification, SpecificationModel } from '../types.js';
2
+ /** A workcard model over one document: its body, a revision of it, and its history from the log. */
3
+ export declare const makeSpecificationModel: (record: Specification, facade: PlanningFacade) => SpecificationModel;
4
+ //# sourceMappingURL=specification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specification.d.ts","sourceRoot":"","sources":["../../src/models/specification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAGpF,oGAAoG;AACpG,eAAO,MAAM,sBAAsB,WAAY,aAAa,UAAU,cAAc,KAAG,kBAgBtF,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { makeWorkcardModel } from './workcard.js';
2
+ /** A workcard model over one document: its body, a revision of it, and its history from the log. */
3
+ export const makeSpecificationModel = (record, facade) => {
4
+ const model = makeWorkcardModel(record, facade);
5
+ return {
6
+ ...model,
7
+ body: () => record.body,
8
+ revise: (body, opts) => model.update(Object.fromEntries(Object.entries({
9
+ body, version: opts?.version, ref: opts?.ref,
10
+ }).filter(([, value]) => value !== undefined)), opts),
11
+ history: limit => facade.specifications.revisions(model.id, limit),
12
+ reload: async () => makeSpecificationModel(await facade.specifications.get(model.id), facade),
13
+ };
14
+ };
15
+ //# sourceMappingURL=specification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specification.js","sourceRoot":"","sources":["../../src/models/specification.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEjD,oGAAoG;AACpG,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,MAAqB,EAAE,MAAsB,EAAsB,EAAE;IAC1G,MAAM,KAAK,GAAG,iBAAiB,CAAgB,MAAM,EAAE,MAAM,CAAC,CAAA;IAE9D,OAAO;QACL,GAAG,KAAK;QAER,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI;QAEvB,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;YACrE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;SAC7C,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;QAErD,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC;QAElE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,sBAAsB,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;KAC9F,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,14 @@
1
+ import type { ModelExecuteOptions, PlanningFacade, TransitionExecution, TransitionReceipt, Workcard, WorkcardModel } from '../types.js';
2
+ /**
3
+ * Run an execution with a model's defaults: `expectSeq` is the record's head (its seq when nothing
4
+ * is in flight) unless the caller names one — `null` opts out.
5
+ */
6
+ export declare const executeFor: (facade: PlanningFacade, record: Pick<Workcard, 'seq' | 'head'> | null, exec: TransitionExecution, opts?: ModelExecuteOptions) => Promise<TransitionReceipt>;
7
+ /**
8
+ * The same object on a server and in a browser: reads answer from the schema registry with no I/O,
9
+ * writes build a {@link TransitionExecution} and hand it to the facade.
10
+ *
11
+ * @throws {PlanningError} `malformed:model-without-id` for a record that was never stored
12
+ */
13
+ export declare const makeWorkcardModel: <T extends Workcard = Workcard>(record: T, facade: PlanningFacade) => WorkcardModel<T>;
14
+ //# sourceMappingURL=workcard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workcard.d.ts","sourceRoot":"","sources":["../../src/models/workcard.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACM,mBAAmB,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAC3F,QAAQ,EAAE,aAAa,EACxB,MAAM,aAAa,CAAA;AAEpB;;;GAGG;AACH,eAAO,MAAM,UAAU,WACb,cAAc,UAAU,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI,QAAQ,mBAAmB,SACzF,mBAAmB,KACzB,OAAO,CAAC,iBAAiB,CAY3B,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,QAAQ,GAAG,QAAQ,UAAU,CAAC,UAAU,cAAc,KAAG,aAAa,CAAC,CAAC,CAkGnH,CAAA"}
@@ -0,0 +1,103 @@
1
+ import { IntrinsicStatus, TransitionAction, WorkcardKind } from '../consts.js';
2
+ import { PlanningError } from '../errors.js';
3
+ import { isPending } from '../helpers/card.js';
4
+ import { slotOf, specificationTypeOf } from '../helpers/specification.js';
5
+ import { canTransit, initialStatusOf, intrinsicOf, primaryFlowOf, transitionsFrom, } from '../helpers/status.js';
6
+ /**
7
+ * Run an execution with a model's defaults: `expectSeq` is the record's head (its seq when nothing
8
+ * is in flight) unless the caller names one — `null` opts out.
9
+ */
10
+ export const executeFor = (facade, record, exec, opts) => {
11
+ const { wait, timeout, actor, cause, key, expectSeq } = opts ?? {};
12
+ const options = Object.fromEntries(Object.entries({ wait, timeout })
13
+ .filter(([, value]) => value !== undefined));
14
+ return facade.execute(Object.fromEntries(Object.entries({
15
+ ...exec,
16
+ actor,
17
+ cause,
18
+ key,
19
+ expectSeq: expectSeq !== undefined ? expectSeq : record == null ? undefined : record.head ?? record.seq,
20
+ }).filter(([, value]) => value !== undefined)), options);
21
+ };
22
+ /**
23
+ * The same object on a server and in a browser: reads answer from the schema registry with no I/O,
24
+ * writes build a {@link TransitionExecution} and hand it to the facade.
25
+ *
26
+ * @throws {PlanningError} `malformed:model-without-id` for a record that was never stored
27
+ */
28
+ export const makeWorkcardModel = (record, facade) => {
29
+ if (record.id == null) {
30
+ throw new PlanningError('malformed:model-without-id');
31
+ }
32
+ const id = record.id;
33
+ const run = (exec, opts) => executeFor(facade, record, { ...exec, card: id }, opts);
34
+ const model = {
35
+ record,
36
+ id,
37
+ kind: record.kind,
38
+ type: record.type,
39
+ schema: () => facade.schemas.type(record.type),
40
+ flow: flowId => facade.schemas.flow(flowId ?? primaryFlowOf(model.schema())),
41
+ statusOf: flowId => {
42
+ const primary = primaryFlowOf(model.schema());
43
+ if (flowId == null || flowId === primary) {
44
+ return record.status;
45
+ }
46
+ return record.flows[flowId] ?? initialStatusOf(model.flow(flowId));
47
+ },
48
+ intrinsicOf: flowId => flowId == null
49
+ ? record.intrinsic
50
+ : intrinsicOf(model.flow(flowId), model.statusOf(flowId)) ?? IntrinsicStatus.Planned,
51
+ can: (transition, flowId) => canTransit(model.flow(flowId), transition, model.statusOf(flowId)),
52
+ available: flowId => transitionsFrom(model.flow(flowId), model.statusOf(flowId)),
53
+ pending: () => isPending(record),
54
+ transit: (transition, changes, opts) => run({
55
+ action: TransitionAction.Transit, transition, flow: opts?.flow, changes,
56
+ }, opts),
57
+ update: (changes, opts) => run({ action: TransitionAction.Update, changes, unset: opts?.unset }, opts),
58
+ remove: opts => run({ action: TransitionAction.Delete }, opts),
59
+ link: (type, to, fields, opts) => run({
60
+ action: TransitionAction.Link, link: { type, from: id, to, ...(fields != null ? { fields } : {}) },
61
+ }, opts),
62
+ unlink: (type, to, opts) => run({ action: TransitionAction.Unlink, link: { type, from: id, to } }, opts),
63
+ children: query => facade.cards.list({ ...query, parent: id }),
64
+ relationships: query => facade.relationships.list({ ...query, from: query?.from ?? id }),
65
+ transitions: query => facade.transitions.list({ ...query, card: id }),
66
+ specification: category => facade.specifications.current(id, category),
67
+ specifications: query => facade.specifications.list(id, query),
68
+ revisions: async (category, limit) => {
69
+ const current = await facade.specifications.current(id, category);
70
+ return current?.id == null ? [] : facade.specifications.revisions(current.id, limit);
71
+ },
72
+ write: async (category, body, opts) => {
73
+ const current = await facade.specifications.current(id, category);
74
+ if (current?.id != null) {
75
+ return executeFor(facade, current, {
76
+ card: current.id,
77
+ action: TransitionAction.Update,
78
+ changes: Object.fromEntries(Object.entries({
79
+ body, format: opts?.format, version: opts?.version, ref: opts?.ref,
80
+ }).filter(([, value]) => value !== undefined)),
81
+ }, opts);
82
+ }
83
+ const slot = slotOf(model.schema(), category);
84
+ return executeFor(facade, null, {
85
+ card: Object.fromEntries(Object.entries({
86
+ kind: WorkcardKind.Specification,
87
+ type: opts?.type ?? specificationTypeOf(facade.schemas, record.type, slot),
88
+ parent: id,
89
+ title: opts?.title ?? category,
90
+ category,
91
+ format: opts?.format ?? slot?.format,
92
+ body,
93
+ ref: opts?.ref,
94
+ version: opts?.version ?? slot?.version,
95
+ }).filter(([, value]) => value !== undefined)),
96
+ action: TransitionAction.Create,
97
+ }, opts);
98
+ },
99
+ reload: async () => makeWorkcardModel(await facade.cards.get(id), facade),
100
+ };
101
+ return model;
102
+ };
103
+ //# sourceMappingURL=workcard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workcard.js","sourceRoot":"","sources":["../../src/models/workcard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Config, JobOptions, QueueWorkerOptions } from '@owlmeans/queue';
2
+ /**
3
+ * The projection queue — a separate subpath so a browser bundle importing `@owlmeans/planning`
4
+ * never pulls `@owlmeans/queue`.
5
+ *
6
+ * The projection is a BARE processor, not a queued entrypoint: a queued entrypoint names one
7
+ * service, and the same queue is served by every process that folds.
8
+ */
9
+ export declare const PLANNING_PROJECTION_QUEUE = "planning-projection";
10
+ /** The one job the projection queue accepts. */
11
+ export declare const PLANNING_PROJECT_JOB = "planning:project";
12
+ /** What one projection job folds. */
13
+ export interface ProjectionRequest {
14
+ cardId: string;
15
+ entityId: string;
16
+ /** The transition that asked for it — a hint, never the fold's bound. */
17
+ transition?: string;
18
+ }
19
+ export interface PlanningQueueOptions {
20
+ worker?: QueueWorkerOptions;
21
+ defaults?: JobOptions;
22
+ }
23
+ /** Declare the projection queue in the SHARED config; `listenQueues` stays each process's own. */
24
+ export declare const declarePlanningQueue: <C extends Config>(cfg: C, opts?: PlanningQueueOptions) => C;
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAE7E;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,wBAAwB,CAAA;AAE9D,gDAAgD;AAChD,eAAO,MAAM,oBAAoB,qBAAqB,CAAA;AAEtD,qCAAqC;AACrC,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,QAAQ,CAAC,EAAE,UAAU,CAAA;CACtB;AAED,kGAAkG;AAClG,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,MAAM,OAAO,CAAC,SAAS,oBAAoB,KAAG,CACjB,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { declareQueue } from '@owlmeans/queue';
2
+ /**
3
+ * The projection queue — a separate subpath so a browser bundle importing `@owlmeans/planning`
4
+ * never pulls `@owlmeans/queue`.
5
+ *
6
+ * The projection is a BARE processor, not a queued entrypoint: a queued entrypoint names one
7
+ * service, and the same queue is served by every process that folds.
8
+ */
9
+ export const PLANNING_PROJECTION_QUEUE = 'planning-projection';
10
+ /** The one job the projection queue accepts. */
11
+ export const PLANNING_PROJECT_JOB = 'planning:project';
12
+ /** Declare the projection queue in the SHARED config; `listenQueues` stays each process's own. */
13
+ export const declarePlanningQueue = (cfg, opts) => declareQueue(cfg, PLANNING_PROJECTION_QUEUE, [PLANNING_PROJECT_JOB], opts);
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAG9C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,qBAAqB,CAAA;AAE9D,gDAAgD;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAA;AAetD,kGAAkG;AAClG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAmB,GAAM,EAAE,IAA2B,EAAK,EAAE,CAC/F,YAAY,CAAC,GAAG,EAAE,yBAAyB,EAAE,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,CAAA"}
@@ -0,0 +1,10 @@
1
+ import type { PlanningSchemaBundle, PlanningSchemaRegistry } from './types.js';
2
+ /**
3
+ * Types, flows and the compiled validator of each type's `fields`.
4
+ *
5
+ * It lives in the contract package so a client answers `can()` / `available()` from a loaded bundle
6
+ * with no round trip. A later registration of the same type or flow id replaces the earlier one;
7
+ * `load(bundle)` replaces everything.
8
+ */
9
+ export declare const makeSchemaRegistry: (bundle?: Partial<PlanningSchemaBundle>) => PlanningSchemaRegistry;
10
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAiB,oBAAoB,EAAE,sBAAsB,EAAoB,MAAM,YAAY,CAAA;AAE/G;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,YAAa,OAAO,CAAC,oBAAoB,CAAC,KAAG,sBA4E3E,CAAA"}
@@ -0,0 +1,75 @@
1
+ import { PLANNING_SCHEMA_VERSION } from './consts.js';
2
+ import { UnknownStatusFlow, UnknownWorkcardType } from './errors.js';
3
+ import { makeAjv } from './helpers/validate.js';
4
+ /**
5
+ * Types, flows and the compiled validator of each type's `fields`.
6
+ *
7
+ * It lives in the contract package so a client answers `can()` / `available()` from a loaded bundle
8
+ * with no round trip. A later registration of the same type or flow id replaces the earlier one;
9
+ * `load(bundle)` replaces everything.
10
+ */
11
+ export const makeSchemaRegistry = (bundle) => {
12
+ const types = new Map();
13
+ const flows = new Map();
14
+ const validators = new Map();
15
+ let ajv = makeAjv();
16
+ const registry = {
17
+ registerType: schema => {
18
+ types.set(schema.type, schema);
19
+ validators.delete(schema.type);
20
+ },
21
+ registerFlow: flow => {
22
+ flows.set(flow.id, flow);
23
+ },
24
+ types: () => [...types.values()],
25
+ type: type => {
26
+ const schema = types.get(type);
27
+ if (schema == null) {
28
+ throw new UnknownWorkcardType(type);
29
+ }
30
+ return schema;
31
+ },
32
+ has: type => types.has(type),
33
+ flows: () => [...flows.values()],
34
+ flow: id => {
35
+ const flow = flows.get(id);
36
+ if (flow == null) {
37
+ throw new UnknownStatusFlow(id);
38
+ }
39
+ return flow;
40
+ },
41
+ primaryFlow: type => {
42
+ const primary = registry.type(type).flows[0];
43
+ if (primary == null) {
44
+ throw new UnknownStatusFlow(`${type}:primary`);
45
+ }
46
+ return registry.flow(primary);
47
+ },
48
+ validator: type => {
49
+ let validate = validators.get(type);
50
+ if (validate == null) {
51
+ validate = ajv.compile(registry.type(type).fields);
52
+ validators.set(type, validate);
53
+ }
54
+ return validate;
55
+ },
56
+ bundle: () => structuredClone({
57
+ version: PLANNING_SCHEMA_VERSION,
58
+ types: [...types.values()],
59
+ flows: [...flows.values()],
60
+ }),
61
+ load: next => {
62
+ types.clear();
63
+ flows.clear();
64
+ validators.clear();
65
+ // A fresh ajv: a replaced type must not collide with a schema `$id` the old one compiled.
66
+ ajv = makeAjv();
67
+ next.flows.forEach(registry.registerFlow);
68
+ next.types.forEach(registry.registerType);
69
+ },
70
+ };
71
+ bundle?.flows?.forEach(registry.registerFlow);
72
+ bundle?.types?.forEach(registry.registerType);
73
+ return registry;
74
+ };
75
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { JSONSchemaType } from 'ajv';
2
+ import type { ListResult } from '@owlmeans/resource';
3
+ import { CommitState, IntrinsicPolicy, IntrinsicStatus, SpecificationFormat, TransitionAction, WorkcardKind } from './consts.js';
4
+ import type { AnyTypeSchema, CodePolicy, CommitEvent, CommitFeedQuery, CommitQuery, CommitStatus, ExecuteRequest, PlanningSchemaBundle, ProjectTypeSchema, Relationship, RelationshipDraft, RelationshipQueryWire, RelationshipType, RevisionsQuery, Specification, SpecificationQueryWire, SpecificationRevision, SpecificationRevisionList, SpecificationSlot, StatusDefinition, StatusFlowSchema, StatusTransitionRule, SummaryQueryWire, SummaryView, Transition, TransitionActor, TransitionCommit, TransitionExecution, TransitionParams, TransitionQueryWire, TransitionReceiptView, Workcard, WorkcardChanges, WorkcardDraft, WorkcardParams, WorkcardQueryWire, WorkcardTypeSchema } from './types.js';
5
+ export declare const WorkcardKindSchema: JSONSchemaType<WorkcardKind>;
6
+ export declare const IntrinsicStatusSchema: JSONSchemaType<IntrinsicStatus>;
7
+ export declare const IntrinsicPolicySchema: JSONSchemaType<IntrinsicPolicy>;
8
+ export declare const TransitionActionSchema: JSONSchemaType<TransitionAction>;
9
+ export declare const CommitStateSchema: JSONSchemaType<CommitState>;
10
+ export declare const SpecificationFormatSchema: JSONSchemaType<SpecificationFormat>;
11
+ export declare const TransitionActorSchema: JSONSchemaType<TransitionActor>;
12
+ export declare const WorkcardSchema: JSONSchemaType<Workcard>;
13
+ export declare const SpecificationSchema: JSONSchemaType<Specification>;
14
+ /** Any kind of workcard — what a receipt, a commit or a view carries. */
15
+ export declare const AnyWorkcardSchema: JSONSchemaType<Workcard>;
16
+ export declare const RelationshipDraftSchema: JSONSchemaType<RelationshipDraft>;
17
+ export declare const RelationshipSchema: JSONSchemaType<Relationship>;
18
+ /** Every changeable field, each nullable: `null` in an update asks for the field to be cleared. */
19
+ export declare const WorkcardChangesSchema: JSONSchemaType<WorkcardChanges>;
20
+ export declare const TransitionCommitSchema: JSONSchemaType<TransitionCommit>;
21
+ export declare const TransitionSchema: JSONSchemaType<Transition>;
22
+ export declare const StatusDefinitionSchema: JSONSchemaType<StatusDefinition>;
23
+ export declare const StatusTransitionRuleSchema: JSONSchemaType<StatusTransitionRule>;
24
+ export declare const StatusFlowSchemaSchema: JSONSchemaType<StatusFlowSchema>;
25
+ export declare const SpecificationSlotSchema: JSONSchemaType<SpecificationSlot>;
26
+ export declare const CodePolicySchema: JSONSchemaType<CodePolicy>;
27
+ export declare const RelationshipTypeSchema: JSONSchemaType<RelationshipType>;
28
+ export declare const WorkcardTypeSchemaSchema: JSONSchemaType<WorkcardTypeSchema>;
29
+ export declare const ProjectTypeSchemaSchema: JSONSchemaType<ProjectTypeSchema>;
30
+ /** Either type schema — `cardTypes` is required by the project kind only. */
31
+ export declare const AnyTypeSchemaSchema: JSONSchemaType<AnyTypeSchema>;
32
+ export declare const PlanningSchemaBundleSchema: JSONSchemaType<PlanningSchemaBundle>;
33
+ export declare const WorkcardDraftSchema: JSONSchemaType<WorkcardDraft>;
34
+ export declare const TransitionExecutionSchema: JSONSchemaType<TransitionExecution>;
35
+ export declare const ExecuteRequestSchema: JSONSchemaType<ExecuteRequest>;
36
+ export declare const TransitionReceiptViewSchema: JSONSchemaType<TransitionReceiptView>;
37
+ export declare const CommitStatusSchema: JSONSchemaType<CommitStatus>;
38
+ export declare const CommitEventSchema: JSONSchemaType<CommitEvent>;
39
+ export declare const SummaryViewSchema: JSONSchemaType<SummaryView>;
40
+ export declare const SpecificationRevisionSchema: JSONSchemaType<SpecificationRevision>;
41
+ export declare const SpecificationRevisionListSchema: JSONSchemaType<SpecificationRevisionList>;
42
+ export declare const WorkcardListSchema: JSONSchemaType<ListResult<Workcard>>;
43
+ export declare const SpecificationListSchema: JSONSchemaType<ListResult<Specification>>;
44
+ export declare const RelationshipListSchema: JSONSchemaType<ListResult<Relationship>>;
45
+ export declare const TransitionListSchema: JSONSchemaType<ListResult<Transition>>;
46
+ export declare const WorkcardQuerySchema: JSONSchemaType<WorkcardQueryWire>;
47
+ export declare const SpecificationQuerySchema: JSONSchemaType<SpecificationQueryWire>;
48
+ export declare const RelationshipQuerySchema: JSONSchemaType<RelationshipQueryWire>;
49
+ export declare const TransitionQuerySchema: JSONSchemaType<TransitionQueryWire>;
50
+ export declare const SummaryQuerySchema: JSONSchemaType<SummaryQueryWire>;
51
+ export declare const WorkcardParamsSchema: JSONSchemaType<WorkcardParams>;
52
+ export declare const TransitionParamsSchema: JSONSchemaType<TransitionParams>;
53
+ export declare const CommitQuerySchema: JSONSchemaType<CommitQuery>;
54
+ export declare const CommitFeedQuerySchema: JSONSchemaType<CommitFeedQuery>;
55
+ export declare const RevisionsQuerySchema: JSONSchemaType<RevisionsQuery>;
56
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}