devchain-cli 0.22.1 → 0.23.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/dist/drizzle/0077_familiar_morbius.sql +6 -0
- package/dist/drizzle/0078_preserve_legacy_connection_ownership.sql +180 -0
- package/dist/drizzle/0079_premium_forgotten_one.sql +18 -0
- package/dist/drizzle/0080_lethal_thunderbolt_ross.sql +49 -0
- package/dist/drizzle/0081_early_kronos.sql +58 -0
- package/dist/drizzle/0082_huge_black_queen.sql +14 -0
- package/dist/drizzle/meta/0077_snapshot.json +6957 -0
- package/dist/drizzle/meta/0078_snapshot.json +6957 -0
- package/dist/drizzle/meta/0079_snapshot.json +7093 -0
- package/dist/drizzle/meta/0080_snapshot.json +7241 -0
- package/dist/drizzle/meta/0081_snapshot.json +7482 -0
- package/dist/drizzle/meta/0082_snapshot.json +7571 -0
- package/dist/drizzle/meta/_journal.json +42 -0
- package/dist/node_modules/@devchain/shared/tsconfig.tsbuildinfo +1 -1
- package/dist/server/common/errors/error-types.d.ts +7 -0
- package/dist/server/common/errors/error-types.js +7 -1
- package/dist/server/common/errors/error-types.js.map +1 -1
- package/dist/server/modules/epic-time/controllers/agent-time-buffer.controller.d.ts +9 -0
- package/dist/server/modules/epic-time/controllers/agent-time-buffer.controller.js +90 -0
- package/dist/server/modules/epic-time/controllers/agent-time-buffer.controller.js.map +1 -0
- package/dist/server/modules/epic-time/controllers/external-estimate-log.controller.d.ts +12 -0
- package/dist/server/modules/epic-time/controllers/external-estimate-log.controller.js +322 -0
- package/dist/server/modules/epic-time/controllers/external-estimate-log.controller.js.map +1 -0
- package/dist/server/modules/epic-time/epic-time-store.module.d.ts +2 -0
- package/dist/server/modules/epic-time/epic-time-store.module.js +23 -0
- package/dist/server/modules/epic-time/epic-time-store.module.js.map +1 -0
- package/dist/server/modules/epic-time/epic-time.module.js +10 -6
- package/dist/server/modules/epic-time/epic-time.module.js.map +1 -1
- package/dist/server/modules/epic-time/models/epic-time-daily-allocator.d.ts +30 -0
- package/dist/server/modules/epic-time/models/epic-time-daily-allocator.js +125 -0
- package/dist/server/modules/epic-time/models/epic-time-daily-allocator.js.map +1 -0
- package/dist/server/modules/epic-time/models/epic-time-local-day.d.ts +9 -0
- package/dist/server/modules/epic-time/models/epic-time-local-day.js +164 -0
- package/dist/server/modules/epic-time/models/epic-time-local-day.js.map +1 -0
- package/dist/server/modules/epic-time/models/epic-time.models.d.ts +147 -0
- package/dist/server/modules/epic-time/models/epic-time.models.js +2 -0
- package/dist/server/modules/epic-time/models/epic-time.models.js.map +1 -1
- package/dist/server/modules/epic-time/services/agent-time-accounting.service.d.ts +1 -0
- package/dist/server/modules/epic-time/services/agent-time-accounting.service.js +31 -8
- package/dist/server/modules/epic-time/services/agent-time-accounting.service.js.map +1 -1
- package/dist/server/modules/epic-time/services/epic-estimate-logging.service.d.ts +37 -0
- package/dist/server/modules/epic-time/services/epic-estimate-logging.service.js +716 -0
- package/dist/server/modules/epic-time/services/epic-estimate-logging.service.js.map +1 -0
- package/dist/server/modules/epic-time/services/epic-time.service.d.ts +13 -3
- package/dist/server/modules/epic-time/services/epic-time.service.js +162 -69
- package/dist/server/modules/epic-time/services/epic-time.service.js.map +1 -1
- package/dist/server/modules/epic-time/services/epic-time.store.d.ts +50 -3
- package/dist/server/modules/epic-time/services/epic-time.store.js +705 -146
- package/dist/server/modules/epic-time/services/epic-time.store.js.map +1 -1
- package/dist/server/modules/epics/controllers/epics.controller.d.ts +10 -1
- package/dist/server/modules/epics/controllers/epics.controller.js +108 -2
- package/dist/server/modules/epics/controllers/epics.controller.js.map +1 -1
- package/dist/server/modules/epics/epics.module.js +8 -2
- package/dist/server/modules/epics/epics.module.js.map +1 -1
- package/dist/server/modules/epics/models/epic-relations.models.d.ts +34 -0
- package/dist/server/modules/epics/models/epic-relations.models.js +16 -0
- package/dist/server/modules/epics/models/epic-relations.models.js.map +1 -0
- package/dist/server/modules/epics/services/epic-relation-target-resolver.d.ts +8 -0
- package/dist/server/modules/epics/services/epic-relation-target-resolver.js +37 -0
- package/dist/server/modules/epics/services/epic-relation-target-resolver.js.map +1 -0
- package/dist/server/modules/epics/services/epic-relations.service.d.ts +52 -0
- package/dist/server/modules/epics/services/epic-relations.service.js +135 -0
- package/dist/server/modules/epics/services/epic-relations.service.js.map +1 -0
- package/dist/server/modules/epics/services/epics.service.d.ts +9 -2
- package/dist/server/modules/epics/services/epics.service.js +115 -11
- package/dist/server/modules/epics/services/epics.service.js.map +1 -1
- package/dist/server/modules/events/catalog/broadcast-registry.js +16 -0
- package/dist/server/modules/events/catalog/broadcast-registry.js.map +1 -1
- package/dist/server/modules/events/catalog/epic.relations.invalidated.d.ts +12 -0
- package/dist/server/modules/events/catalog/epic.relations.invalidated.js +13 -0
- package/dist/server/modules/events/catalog/epic.relations.invalidated.js.map +1 -0
- package/dist/server/modules/events/catalog/epic.time.scope.invalidated.d.ts +12 -0
- package/dist/server/modules/events/catalog/epic.time.scope.invalidated.js +13 -0
- package/dist/server/modules/events/catalog/epic.time.scope.invalidated.js.map +1 -0
- package/dist/server/modules/events/catalog/index.d.ts +27 -4
- package/dist/server/modules/events/catalog/index.js +6 -0
- package/dist/server/modules/events/catalog/index.js.map +1 -1
- package/dist/server/modules/events/catalog/integration.connection.created.d.ts +4 -1
- package/dist/server/modules/events/catalog/integration.connection.created.js +5 -2
- package/dist/server/modules/events/catalog/integration.connection.created.js.map +1 -1
- package/dist/server/modules/events/catalog/integration.connection.deleted.d.ts +4 -1
- package/dist/server/modules/events/catalog/integration.connection.deleted.js +5 -2
- package/dist/server/modules/events/catalog/integration.connection.deleted.js.map +1 -1
- package/dist/server/modules/events/catalog/integration.connection.legacy.d.ts +85 -0
- package/dist/server/modules/events/catalog/integration.connection.legacy.js +41 -0
- package/dist/server/modules/events/catalog/integration.connection.legacy.js.map +1 -0
- package/dist/server/modules/events/catalog/integration.connection.updated.d.ts +4 -1
- package/dist/server/modules/events/catalog/integration.connection.updated.js +5 -2
- package/dist/server/modules/events/catalog/integration.connection.updated.js.map +1 -1
- package/dist/server/modules/events/services/committed-event-replay.d.ts +10 -0
- package/dist/server/modules/events/services/committed-event-replay.js +30 -0
- package/dist/server/modules/events/services/committed-event-replay.js.map +1 -0
- package/dist/server/modules/events/services/committed-event.store.d.ts +1 -0
- package/dist/server/modules/events/services/committed-event.store.js +12 -7
- package/dist/server/modules/events/services/committed-event.store.js.map +1 -1
- package/dist/server/modules/events/services/durable-event-registry.service.d.ts +9 -2
- package/dist/server/modules/events/services/durable-event-registry.service.js.map +1 -1
- package/dist/server/modules/external-integrations/adapters/clickup-external-task.provider.d.ts +7 -0
- package/dist/server/modules/external-integrations/adapters/clickup-external-task.provider.js +158 -50
- package/dist/server/modules/external-integrations/adapters/clickup-external-task.provider.js.map +1 -1
- package/dist/server/modules/external-integrations/adapters/jira-external-task.provider.d.ts +4 -0
- package/dist/server/modules/external-integrations/adapters/jira-external-task.provider.js +73 -33
- package/dist/server/modules/external-integrations/adapters/jira-external-task.provider.js.map +1 -1
- package/dist/server/modules/external-integrations/connections/integration-connections.controller.d.ts +6 -3
- package/dist/server/modules/external-integrations/connections/integration-connections.controller.js +67 -12
- package/dist/server/modules/external-integrations/connections/integration-connections.controller.js.map +1 -1
- package/dist/server/modules/external-integrations/connections/integration-connections.service.d.ts +35 -3
- package/dist/server/modules/external-integrations/connections/integration-connections.service.js +178 -17
- package/dist/server/modules/external-integrations/connections/integration-connections.service.js.map +1 -1
- package/dist/server/modules/external-integrations/connections/managed-subtask-sync.controller.d.ts +6 -3
- package/dist/server/modules/external-integrations/connections/managed-subtask-sync.controller.js +51 -11
- package/dist/server/modules/external-integrations/connections/managed-subtask-sync.controller.js.map +1 -1
- package/dist/server/modules/external-integrations/external-integrations.module.js +6 -1
- package/dist/server/modules/external-integrations/external-integrations.module.js.map +1 -1
- package/dist/server/modules/external-integrations/models/external-edit-session.models.d.ts +1 -0
- package/dist/server/modules/external-integrations/models/external-provider.models.d.ts +6 -2
- package/dist/server/modules/external-integrations/models/external-provider.models.js +2 -3
- package/dist/server/modules/external-integrations/models/external-provider.models.js.map +1 -1
- package/dist/server/modules/external-integrations/models/external-time-mutation.models.d.ts +33 -2
- package/dist/server/modules/external-integrations/models/external-time-mutation.models.js +14 -0
- package/dist/server/modules/external-integrations/models/external-time-mutation.models.js.map +1 -1
- package/dist/server/modules/external-integrations/my-work/external-edit-session.service.d.ts +10 -9
- package/dist/server/modules/external-integrations/my-work/external-edit-session.service.js +81 -46
- package/dist/server/modules/external-integrations/my-work/external-edit-session.service.js.map +1 -1
- package/dist/server/modules/external-integrations/my-work/external-my-work.controller.d.ts +22 -20
- package/dist/server/modules/external-integrations/my-work/external-my-work.controller.js +136 -64
- package/dist/server/modules/external-integrations/my-work/external-my-work.controller.js.map +1 -1
- package/dist/server/modules/external-integrations/my-work/external-my-work.openapi.d.ts +7 -0
- package/dist/server/modules/external-integrations/my-work/external-my-work.openapi.js +289 -4
- package/dist/server/modules/external-integrations/my-work/external-my-work.openapi.js.map +1 -1
- package/dist/server/modules/external-integrations/my-work/external-my-work.service.d.ts +12 -7
- package/dist/server/modules/external-integrations/my-work/external-my-work.service.js +114 -54
- package/dist/server/modules/external-integrations/my-work/external-my-work.service.js.map +1 -1
- package/dist/server/modules/external-integrations/my-work/external-time-mutation.service.d.ts +19 -6
- package/dist/server/modules/external-integrations/my-work/external-time-mutation.service.js +346 -46
- package/dist/server/modules/external-integrations/my-work/external-time-mutation.service.js.map +1 -1
- package/dist/server/modules/external-integrations/sessions/external-edit-session.store.d.ts +2 -1
- package/dist/server/modules/external-integrations/sessions/external-edit-session.store.js +3 -2
- package/dist/server/modules/external-integrations/sessions/external-edit-session.store.js.map +1 -1
- package/dist/server/modules/external-integrations/sessions/external-time-mutation.store.d.ts +6 -1
- package/dist/server/modules/external-integrations/sessions/external-time-mutation.store.js +19 -0
- package/dist/server/modules/external-integrations/sessions/external-time-mutation.store.js.map +1 -1
- package/dist/server/modules/external-integrations/sessions/provider-operation-gate.d.ts +15 -2
- package/dist/server/modules/external-integrations/sessions/provider-operation-gate.js +33 -6
- package/dist/server/modules/external-integrations/sessions/provider-operation-gate.js.map +1 -1
- package/dist/server/modules/external-integrations/subscribers/external-subtask-sync.subscriber.d.ts +13 -6
- package/dist/server/modules/external-integrations/subscribers/external-subtask-sync.subscriber.js +212 -75
- package/dist/server/modules/external-integrations/subscribers/external-subtask-sync.subscriber.js.map +1 -1
- package/dist/server/modules/external-integrations/subscribers/managed-subtask-content.d.ts +13 -4
- package/dist/server/modules/external-integrations/subscribers/managed-subtask-content.js +98 -0
- package/dist/server/modules/external-integrations/subscribers/managed-subtask-content.js.map +1 -1
- package/dist/server/modules/external-integrations/subscribers/managed-subtask-sync-health.service.d.ts +10 -4
- package/dist/server/modules/external-integrations/subscribers/managed-subtask-sync-health.service.js +57 -18
- package/dist/server/modules/external-integrations/subscribers/managed-subtask-sync-health.service.js.map +1 -1
- package/dist/server/modules/mcp/dtos/mcp.dto.d.ts +139 -0
- package/dist/server/modules/mcp/dtos/mcp.dto.js +41 -1
- package/dist/server/modules/mcp/dtos/mcp.dto.js.map +1 -1
- package/dist/server/modules/mcp/services/handlers/epic-context.d.ts +2 -0
- package/dist/server/modules/mcp/services/handlers/epic-tools.d.ts +4 -0
- package/dist/server/modules/mcp/services/handlers/epic-tools.js +275 -0
- package/dist/server/modules/mcp/services/handlers/epic-tools.js.map +1 -1
- package/dist/server/modules/mcp/services/mcp-tool-binding.registry.d.ts +2 -1
- package/dist/server/modules/mcp/services/mcp-tool-binding.registry.js +13 -8
- package/dist/server/modules/mcp/services/mcp-tool-binding.registry.js.map +1 -1
- package/dist/server/modules/mcp/services/testing/mcp-tool-binding-registry.fixture.d.ts +1 -1
- package/dist/server/modules/mcp/services/testing/mcp-tool-binding-registry.fixture.js +1 -1
- package/dist/server/modules/mcp/services/testing/mcp-tool-binding-registry.fixture.js.map +1 -1
- package/dist/server/modules/mcp/tool-descriptors/binding-types.d.ts +2 -0
- package/dist/server/modules/mcp/tool-descriptors/binding-types.js.map +1 -1
- package/dist/server/modules/mcp/tool-descriptors/epic.bindings.js +6 -0
- package/dist/server/modules/mcp/tool-descriptors/epic.bindings.js.map +1 -1
- package/dist/server/modules/mcp/tool-descriptors/epic.metadata.js +132 -0
- package/dist/server/modules/mcp/tool-descriptors/epic.metadata.js.map +1 -1
- package/dist/server/modules/projects/controllers/projects.controller.js +1 -4
- package/dist/server/modules/projects/controllers/projects.controller.js.map +1 -1
- package/dist/server/modules/projects/projects.module.js +2 -0
- package/dist/server/modules/projects/projects.module.js.map +1 -1
- package/dist/server/modules/projects/services/projects.service.d.ts +4 -1
- package/dist/server/modules/projects/services/projects.service.js +23 -2
- package/dist/server/modules/projects/services/projects.service.js.map +1 -1
- package/dist/server/modules/providers/adapters/claude.adapter.d.ts +4 -2
- package/dist/server/modules/providers/adapters/claude.adapter.js +31 -0
- package/dist/server/modules/providers/adapters/claude.adapter.js.map +1 -1
- package/dist/server/modules/providers/services/provider-mcp-ensure.service.d.ts +7 -0
- package/dist/server/modules/providers/services/provider-mcp-ensure.service.js +69 -4
- package/dist/server/modules/providers/services/provider-mcp-ensure.service.js.map +1 -1
- package/dist/server/modules/session-reader/data/pricing.json +452 -56
- package/dist/server/modules/session-reader/services/session-reader.service.d.ts +2 -0
- package/dist/server/modules/session-reader/services/session-reader.service.js +85 -9
- package/dist/server/modules/session-reader/services/session-reader.service.js.map +1 -1
- package/dist/server/modules/session-reader/services/transcript-path-validator.service.js +8 -2
- package/dist/server/modules/session-reader/services/transcript-path-validator.service.js.map +1 -1
- package/dist/server/modules/session-reader/services/transcript-watcher.service.js +44 -17
- package/dist/server/modules/session-reader/services/transcript-watcher.service.js.map +1 -1
- package/dist/server/modules/sessions/services/session-runtime/__test-utils__/pipeline-harness.d.ts +1 -0
- package/dist/server/modules/sessions/services/session-runtime/__test-utils__/pipeline-harness.js +1 -0
- package/dist/server/modules/sessions/services/session-runtime/__test-utils__/pipeline-harness.js.map +1 -1
- package/dist/server/modules/sessions/services/session-runtime/session-launch-pipeline.service.js +11 -1
- package/dist/server/modules/sessions/services/session-runtime/session-launch-pipeline.service.js.map +1 -1
- package/dist/server/modules/sessions/services/sessions.service.d.ts +3 -1
- package/dist/server/modules/sessions/services/sessions.service.js +36 -6
- package/dist/server/modules/sessions/services/sessions.service.js.map +1 -1
- package/dist/server/modules/sessions/sessions.module.js +2 -0
- package/dist/server/modules/sessions/sessions.module.js.map +1 -1
- package/dist/server/modules/sessions/utils/claude-config.d.ts +4 -1
- package/dist/server/modules/sessions/utils/claude-config.js +265 -60
- package/dist/server/modules/sessions/utils/claude-config.js.map +1 -1
- package/dist/server/modules/storage/db/schema.d.ts +1109 -98
- package/dist/server/modules/storage/db/schema.js +141 -3
- package/dist/server/modules/storage/db/schema.js.map +1 -1
- package/dist/server/modules/storage/db/sqlite-json.d.ts +1 -0
- package/dist/server/modules/storage/db/sqlite-json.js +4 -0
- package/dist/server/modules/storage/db/sqlite-json.js.map +1 -1
- package/dist/server/modules/storage/interfaces/storage.interface.d.ts +58 -10
- package/dist/server/modules/storage/interfaces/storage.interface.js.map +1 -1
- package/dist/server/modules/storage/local/delegates/epic.delegate.d.ts +30 -5
- package/dist/server/modules/storage/local/delegates/epic.delegate.js +718 -14
- package/dist/server/modules/storage/local/delegates/epic.delegate.js.map +1 -1
- package/dist/server/modules/storage/local/delegates/external-estimate-log.delegate.d.ts +52 -0
- package/dist/server/modules/storage/local/delegates/external-estimate-log.delegate.js +659 -0
- package/dist/server/modules/storage/local/delegates/external-estimate-log.delegate.js.map +1 -0
- package/dist/server/modules/storage/local/delegates/external-managed-subtask.delegate.d.ts +2 -1
- package/dist/server/modules/storage/local/delegates/external-managed-subtask.delegate.js +17 -4
- package/dist/server/modules/storage/local/delegates/external-managed-subtask.delegate.js.map +1 -1
- package/dist/server/modules/storage/local/delegates/integration.delegate.d.ts +23 -8
- package/dist/server/modules/storage/local/delegates/integration.delegate.js +238 -52
- package/dist/server/modules/storage/local/delegates/integration.delegate.js.map +1 -1
- package/dist/server/modules/storage/local/delegates/project.delegate.d.ts +2 -0
- package/dist/server/modules/storage/local/delegates/project.delegate.js +180 -130
- package/dist/server/modules/storage/local/delegates/project.delegate.js.map +1 -1
- package/dist/server/modules/storage/local/local-storage.service.d.ts +45 -10
- package/dist/server/modules/storage/local/local-storage.service.js +99 -15
- package/dist/server/modules/storage/local/local-storage.service.js.map +1 -1
- package/dist/server/modules/storage/models/domain.models.d.ts +170 -0
- package/dist/server/modules/storage/models/domain.models.js +9 -0
- package/dist/server/modules/storage/models/domain.models.js.map +1 -1
- package/dist/server/templates/teams-dev.json +311 -301
- package/dist/server/tsconfig.tsbuildinfo +1 -1
- package/dist/server/ui/assets/{ExternalRichEditor-DMtnZIMZ.js → ExternalRichEditor-FwCAalXO.js} +1 -1
- package/dist/server/ui/assets/{ReviewDetailPage-BmyiM5IR.js → ReviewDetailPage-D8DVpsJm.js} +1 -1
- package/dist/server/ui/assets/{ReviewsPage-CQ87BMwT.js → ReviewsPage-DcWpRFbm.js} +1 -1
- package/dist/server/ui/assets/index-CV8ydm7w.css +32 -0
- package/dist/server/ui/assets/index-Cwe7LxcW.js +1197 -0
- package/dist/server/ui/assets/{useReviewSubscription-DjbEUzt4.js → useReviewSubscription-CYoSg-88.js} +1 -1
- package/dist/server/ui/index.html +2 -2
- package/dist/templates/teams-dev.json +311 -301
- package/package.json +20 -2
- package/dist/server/ui/assets/index-BX6Yze-A.js +0 -1177
- package/dist/server/ui/assets/index-qoQEv_u4.css +0 -32
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"durable-event-registry.service.js","sourceRoot":"","sources":["../../../../src/modules/events/services/durable-event-registry.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,wCAAiF;
|
|
1
|
+
{"version":3,"file":"durable-event-registry.service.js","sourceRoot":"","sources":["../../../../src/modules/events/services/durable-event-registry.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,wCAAiF;AAiC1E,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IACrB,WAAW,GAAG,IAAI,GAAG,EAA4C,CAAC;IAEnF,QAAQ,CAAC,UAAkC;QACzC,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,IAAA,0BAAgB,EAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,+BAA+B,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,gCAAgC,WAAW,yBAAyB,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,UAAU,GAAqC;YACnD,GAAG,UAAU;YACb,WAAW;YACX,UAAU,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC/C,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,KAAK;SACrC,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC9C,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,UAAU,EAAE,CAAC;gBACrD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACvC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,WAAmB;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACnD,CAAC;IAED,cAAc;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,eAAe,CAAC,SAAoB;QAClC,OAAO,IAAI,CAAC,cAAc,EAAE;aACzB,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;aACjE,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IACjD,CAAC;CACF,CAAA;AA/CY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,mBAAU,GAAE;GACA,2BAA2B,CA+CvC"}
|
package/dist/server/modules/external-integrations/adapters/clickup-external-task.provider.d.ts
CHANGED
|
@@ -54,8 +54,13 @@ export declare class ClickUpExternalTaskProvider implements ExternalTaskProvider
|
|
|
54
54
|
private addTaskComment;
|
|
55
55
|
private loadTaskWorkspace;
|
|
56
56
|
private createTimeEntry;
|
|
57
|
+
private confirmCreatedEntryExactly;
|
|
58
|
+
private provesExactTaskAssociation;
|
|
59
|
+
private isStrictClickUpTaskUrl;
|
|
57
60
|
private isDocumentedCreateReceipt;
|
|
58
61
|
private readTimeEntryExact;
|
|
62
|
+
private updateTimeEntry;
|
|
63
|
+
private assertTimeEntryEditable;
|
|
59
64
|
private singularTimeEntryBody;
|
|
60
65
|
private deleteTimeEntry;
|
|
61
66
|
private listOwnTimeEntryIdsInRange;
|
|
@@ -71,6 +76,8 @@ export declare class ClickUpExternalTaskProvider implements ExternalTaskProvider
|
|
|
71
76
|
private loadWorkspaces;
|
|
72
77
|
private loadTaskPages;
|
|
73
78
|
private normalizeTask;
|
|
79
|
+
private supplementalListMemberships;
|
|
80
|
+
private baseListWorkArea;
|
|
74
81
|
private normalizeTaskSubtasks;
|
|
75
82
|
private normalizeTaskSubtask;
|
|
76
83
|
private optionalTaskParentId;
|
package/dist/server/modules/external-integrations/adapters/clickup-external-task.provider.js
CHANGED
|
@@ -20,13 +20,13 @@ const clickup_comment_converter_2 = require("./rich/clickup-comment-converter");
|
|
|
20
20
|
const safe_vendor_http_client_1 = require("../transport/safe-vendor-http-client");
|
|
21
21
|
const vendor_shared_1 = require("./vendor-shared");
|
|
22
22
|
const CLICKUP_ORIGIN = 'https://api.clickup.com';
|
|
23
|
+
const CLICKUP_TASK_URL_HOST = 'prod.clickup.com';
|
|
23
24
|
const CLICKUP_TASK_PAGE_SIZE = 100;
|
|
24
25
|
const CLICKUP_MAX_TASK_PAGES = 1_000;
|
|
25
26
|
const CLICKUP_COMMENT_PAGE_SIZE = 25;
|
|
26
27
|
const CLICKUP_SUBTASK_PAGE_SIZE = 100;
|
|
27
28
|
const CLICKUP_SUBTASK_MAX_PAGES = 10;
|
|
28
|
-
const
|
|
29
|
-
const CLICKUP_OWNERSHIP_SUFFIX = '`';
|
|
29
|
+
const CLICKUP_SOURCE_ID_MARKER_PATTERN = /^(?:([\s\S]*)\n\n)?SourceId: ([0-9a-f]{8})$/;
|
|
30
30
|
const CLICKUP_COMMENT_CURSOR_PATTERN = /^[A-Za-z0-9_-]+$/;
|
|
31
31
|
const CLICKUP_COMMENT_AUTHOR = {
|
|
32
32
|
nameKey: 'username',
|
|
@@ -51,10 +51,12 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
|
|
|
51
51
|
};
|
|
52
52
|
timeEntryMutations = {
|
|
53
53
|
createTimeEntry: (credentials, context, remoteTaskId, input) => this.createTimeEntry(credentials, context, remoteTaskId, input),
|
|
54
|
+
updateTimeEntry: (credentials, context, remoteTaskId, remoteEntryId, input) => this.updateTimeEntry(credentials, context, remoteTaskId, remoteEntryId, input),
|
|
54
55
|
deleteTimeEntry: (credentials, context, remoteTaskId, remoteEntryId) => this.deleteTimeEntry(credentials, context, remoteTaskId, remoteEntryId),
|
|
55
56
|
readTimeEntryExact: (credentials, context, remoteTaskId, remoteEntryId) => this.readTimeEntryExact(credentials, context, remoteTaskId, remoteEntryId),
|
|
56
57
|
listOwnTimeEntryIdsInRange: (credentials, context, remoteTaskId, startedAfterMs, startedBeforeMs) => this.listOwnTimeEntryIdsInRange(credentials, context, remoteTaskId, startedAfterMs, startedBeforeMs),
|
|
57
58
|
assertTimeEntryDeletable: (credentials, context, remoteTaskId, remoteEntryId) => this.assertTimeEntryDeletable(credentials, context, remoteTaskId, remoteEntryId),
|
|
59
|
+
assertTimeEntryEditable: (credentials, context, remoteTaskId, remoteEntryId) => this.assertTimeEntryEditable(credentials, context, remoteTaskId, remoteEntryId),
|
|
58
60
|
};
|
|
59
61
|
listMetadataCache = new vendor_shared_1.VendorMetadataCache(vendor_shared_1.WORK_AREA_METADATA_CACHE_MAX_ENTRIES);
|
|
60
62
|
validate = (0, vendor_shared_1.createVendorValidators)((reason) => new external_provider_errors_1.ClickUpProviderError(reason));
|
|
@@ -264,33 +266,18 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
|
|
|
264
266
|
};
|
|
265
267
|
}
|
|
266
268
|
managedMarkdown(description, ownershipToken) {
|
|
267
|
-
const
|
|
268
|
-
return description === null ?
|
|
269
|
+
const marker = `SourceId: ${ownershipToken}`;
|
|
270
|
+
return description === null ? marker : `${description}\n\n${marker}`;
|
|
269
271
|
}
|
|
270
272
|
parseManagedMarkdown(value) {
|
|
271
273
|
if (value === null || value === '') {
|
|
272
274
|
return { description: null, ownershipToken: null };
|
|
273
275
|
}
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
? notePosition + 2 + external_provider_models_1.EXTERNAL_SUBTASK_MANAGEMENT_NOTE.length + 2
|
|
278
|
-
: startsWithNote
|
|
279
|
-
? external_provider_models_1.EXTERNAL_SUBTASK_MANAGEMENT_NOTE.length + 2
|
|
280
|
-
: -1;
|
|
281
|
-
if (markerStart < 0 || !value.startsWith(CLICKUP_OWNERSHIP_PREFIX, markerStart)) {
|
|
282
|
-
return { description: value || null, ownershipToken: null };
|
|
276
|
+
const match = CLICKUP_SOURCE_ID_MARKER_PATTERN.exec(value);
|
|
277
|
+
if (match === null) {
|
|
278
|
+
return { description: value, ownershipToken: null };
|
|
283
279
|
}
|
|
284
|
-
|
|
285
|
-
if (!value.endsWith(CLICKUP_OWNERSHIP_SUFFIX)) {
|
|
286
|
-
return { description: value || null, ownershipToken: null };
|
|
287
|
-
}
|
|
288
|
-
const token = value.slice(tokenStart, -CLICKUP_OWNERSHIP_SUFFIX.length);
|
|
289
|
-
if (!this.isSubtaskOwnershipToken(token)) {
|
|
290
|
-
return { description: value || null, ownershipToken: null };
|
|
291
|
-
}
|
|
292
|
-
const description = notePosition > 0 ? value.slice(0, notePosition) : null;
|
|
293
|
-
return { description: description || null, ownershipToken: token };
|
|
280
|
+
return { description: match[1] || null, ownershipToken: match[2] };
|
|
294
281
|
}
|
|
295
282
|
requireSubtaskTitle(value) {
|
|
296
283
|
if (typeof value !== 'string' ||
|
|
@@ -310,8 +297,7 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
|
|
|
310
297
|
return value;
|
|
311
298
|
}
|
|
312
299
|
isSubtaskOwnershipToken(value) {
|
|
313
|
-
return (value
|
|
314
|
-
/^[A-Za-z0-9][A-Za-z0-9._:-]*$/.test(value));
|
|
300
|
+
return external_provider_models_1.EXTERNAL_SUBTASK_SOURCE_ID_PATTERN.test(value);
|
|
315
301
|
}
|
|
316
302
|
requireSubtaskOwnershipToken(value) {
|
|
317
303
|
if (typeof value !== 'string' || !this.isSubtaskOwnershipToken(value)) {
|
|
@@ -630,10 +616,10 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
|
|
|
630
616
|
async createTimeEntry(credentials, _context, remoteTaskId, input) {
|
|
631
617
|
const token = this.requireToken(credentials);
|
|
632
618
|
const taskId = this.validate.requiredTaskId(remoteTaskId);
|
|
633
|
-
const
|
|
619
|
+
const startedAtMs = this.validate.timeEntryInput(input);
|
|
634
620
|
const workspaceId = await this.loadTaskWorkspace(token, taskId);
|
|
635
621
|
const body = {
|
|
636
|
-
start:
|
|
622
|
+
start: startedAtMs,
|
|
637
623
|
duration: input.durationMs,
|
|
638
624
|
};
|
|
639
625
|
if (input.note !== null) {
|
|
@@ -641,10 +627,70 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
|
|
|
641
627
|
}
|
|
642
628
|
body.tid = taskId;
|
|
643
629
|
const payload = await this.requestJson(token, `${CLICKUP_ORIGIN}/api/v2/team/${encodeURIComponent(workspaceId)}/time_entries`, { method: 'POST', body: JSON.stringify(body) });
|
|
644
|
-
|
|
630
|
+
const receipt = this.singularTimeEntryBody(payload);
|
|
631
|
+
if (receipt !== null && this.isDocumentedCreateReceipt(receipt, taskId)) {
|
|
632
|
+
return { remoteEntryId: this.optionalIdentifier(receipt.id) };
|
|
633
|
+
}
|
|
634
|
+
const entryId = receipt !== null ? this.optionalIdentifier(receipt.id) : null;
|
|
635
|
+
if (entryId === null) {
|
|
645
636
|
throw new external_provider_errors_1.ClickUpProviderError('invalid_response', undefined, true);
|
|
646
637
|
}
|
|
647
|
-
|
|
638
|
+
await this.confirmCreatedEntryExactly(token, workspaceId, entryId, taskId, startedAtMs, input.durationMs);
|
|
639
|
+
return { remoteEntryId: entryId };
|
|
640
|
+
}
|
|
641
|
+
async confirmCreatedEntryExactly(token, workspaceId, entryId, taskId, startedAtMs, durationMs) {
|
|
642
|
+
try {
|
|
643
|
+
const payload = await this.requestJson(token, `${CLICKUP_ORIGIN}/api/v2/team/${encodeURIComponent(workspaceId)}/time_entries/${encodeURIComponent(entryId)}`);
|
|
644
|
+
const entry = this.singularTimeEntryBody(payload);
|
|
645
|
+
if (entry === null) {
|
|
646
|
+
throw new external_provider_errors_1.ClickUpProviderError('invalid_response');
|
|
647
|
+
}
|
|
648
|
+
const remoteId = this.optionalIdentifier(entry.id);
|
|
649
|
+
if (remoteId !== entryId) {
|
|
650
|
+
throw new external_provider_errors_1.ClickUpProviderError('invalid_response');
|
|
651
|
+
}
|
|
652
|
+
if (!this.provesExactTaskAssociation(entry, taskId)) {
|
|
653
|
+
throw new external_provider_errors_1.ClickUpProviderError('invalid_response');
|
|
654
|
+
}
|
|
655
|
+
if (this.numericValue(entry.start) !== startedAtMs) {
|
|
656
|
+
throw new external_provider_errors_1.ClickUpProviderError('invalid_response');
|
|
657
|
+
}
|
|
658
|
+
if (this.numericValue(entry.duration) !== durationMs) {
|
|
659
|
+
throw new external_provider_errors_1.ClickUpProviderError('invalid_response');
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
catch {
|
|
663
|
+
throw new external_provider_errors_1.ClickUpProviderError('invalid_response', undefined, true);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
provesExactTaskAssociation(entry, taskId) {
|
|
667
|
+
if ((0, vendor_shared_1.isRecord)(entry.task)) {
|
|
668
|
+
const taskRemoteId = this.optionalIdentifier(entry.task.id);
|
|
669
|
+
if (taskRemoteId !== null && taskRemoteId === taskId) {
|
|
670
|
+
return true;
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
return this.isStrictClickUpTaskUrl(entry.task_url, taskId);
|
|
674
|
+
}
|
|
675
|
+
isStrictClickUpTaskUrl(value, taskId) {
|
|
676
|
+
if (typeof value !== 'string' || value === '') {
|
|
677
|
+
return false;
|
|
678
|
+
}
|
|
679
|
+
let url;
|
|
680
|
+
try {
|
|
681
|
+
url = new URL(value);
|
|
682
|
+
}
|
|
683
|
+
catch {
|
|
684
|
+
return false;
|
|
685
|
+
}
|
|
686
|
+
return (url.protocol === 'https:' &&
|
|
687
|
+
url.hostname === CLICKUP_TASK_URL_HOST &&
|
|
688
|
+
url.port === '' &&
|
|
689
|
+
url.username === '' &&
|
|
690
|
+
url.password === '' &&
|
|
691
|
+
url.pathname === `/t/${taskId}` &&
|
|
692
|
+
url.search === '' &&
|
|
693
|
+
url.hash === '');
|
|
648
694
|
}
|
|
649
695
|
isDocumentedCreateReceipt(payload, taskId) {
|
|
650
696
|
if (!this.isNumericValue(payload.start) || !this.isNumericValue(payload.duration)) {
|
|
@@ -692,13 +738,45 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
|
|
|
692
738
|
if (owner === null) {
|
|
693
739
|
throw new external_provider_errors_1.ClickUpProviderError('invalid_response');
|
|
694
740
|
}
|
|
741
|
+
const description = entry.description;
|
|
742
|
+
if (description !== null && description !== undefined && typeof description !== 'string') {
|
|
743
|
+
throw new external_provider_errors_1.ClickUpProviderError('invalid_response');
|
|
744
|
+
}
|
|
695
745
|
return {
|
|
696
746
|
remoteId,
|
|
697
747
|
startedAt: new Date(this.numericValue(entry.start)).toISOString(),
|
|
698
748
|
durationMs: this.numericValue(entry.duration),
|
|
749
|
+
note: description || null,
|
|
699
750
|
owned: owner === ownerId,
|
|
700
751
|
};
|
|
701
752
|
}
|
|
753
|
+
async updateTimeEntry(credentials, _context, remoteTaskId, remoteEntryId, input) {
|
|
754
|
+
const token = this.requireToken(credentials);
|
|
755
|
+
const taskId = this.validate.requiredTaskId(remoteTaskId);
|
|
756
|
+
const entryId = this.validate.requiredIdentifier(remoteEntryId);
|
|
757
|
+
const startedAtMs = this.validate.timeEntryInput(input);
|
|
758
|
+
const workspaceId = await this.loadTaskWorkspace(token, taskId);
|
|
759
|
+
await this.requestJson(token, `${CLICKUP_ORIGIN}/api/v2/team/${encodeURIComponent(workspaceId)}/time_entries/${encodeURIComponent(entryId)}`, {
|
|
760
|
+
method: 'PUT',
|
|
761
|
+
body: JSON.stringify({
|
|
762
|
+
start: startedAtMs,
|
|
763
|
+
end: startedAtMs + input.durationMs,
|
|
764
|
+
duration: input.durationMs,
|
|
765
|
+
description: input.note ?? '',
|
|
766
|
+
}),
|
|
767
|
+
});
|
|
768
|
+
}
|
|
769
|
+
async assertTimeEntryEditable(credentials, context, remoteTaskId, remoteEntryId) {
|
|
770
|
+
await this.assertTimeEntryDeletable(credentials, context, remoteTaskId, remoteEntryId);
|
|
771
|
+
const exact = await this.readTimeEntryExact(credentials, context, remoteTaskId, remoteEntryId);
|
|
772
|
+
if (exact === null) {
|
|
773
|
+
throw new external_provider_errors_1.ClickUpProviderError('not_found');
|
|
774
|
+
}
|
|
775
|
+
if (!exact.owned) {
|
|
776
|
+
throw new external_provider_errors_1.ClickUpProviderError('permission_denied');
|
|
777
|
+
}
|
|
778
|
+
return exact;
|
|
779
|
+
}
|
|
702
780
|
singularTimeEntryBody(payload) {
|
|
703
781
|
if (!(0, vendor_shared_1.isRecord)(payload)) {
|
|
704
782
|
return null;
|
|
@@ -841,6 +919,7 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
|
|
|
841
919
|
startedAt,
|
|
842
920
|
note: note ? note.slice(0, external_provider_models_1.MAX_TIME_ENTRY_NOTE_LENGTH) : null,
|
|
843
921
|
noteTruncated: note.length > external_provider_models_1.MAX_TIME_ENTRY_NOTE_LENGTH,
|
|
922
|
+
canEdit: true,
|
|
844
923
|
canDelete: true,
|
|
845
924
|
},
|
|
846
925
|
running: false,
|
|
@@ -970,6 +1049,7 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
|
|
|
970
1049
|
continue;
|
|
971
1050
|
}
|
|
972
1051
|
result.push(task);
|
|
1052
|
+
result.push(...this.supplementalListMemberships(value, workspace, task));
|
|
973
1053
|
}
|
|
974
1054
|
if (payload.tasks.length < CLICKUP_TASK_PAGE_SIZE) {
|
|
975
1055
|
return result;
|
|
@@ -993,22 +1073,7 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
|
|
|
993
1073
|
const remoteId = this.validate.requiredIdentifier(value.id);
|
|
994
1074
|
const statusType = this.validate.requiredString(value.status.type).toLowerCase();
|
|
995
1075
|
const completedAt = this.optionalTimestamp(value.date_done ?? value.date_closed);
|
|
996
|
-
const workArea =
|
|
997
|
-
remoteId: this.validate.requiredIdentifier(value.list.id),
|
|
998
|
-
scopeKey: workspace.id,
|
|
999
|
-
name: this.validate.requiredString(value.list.name),
|
|
1000
|
-
kind: 'list',
|
|
1001
|
-
description: null,
|
|
1002
|
-
assignedTaskCount: 0,
|
|
1003
|
-
hierarchy: [{ kind: 'workspace', remoteId: workspace.id, name: workspace.name }],
|
|
1004
|
-
workflow: { isOverridden: false, columns: [] },
|
|
1005
|
-
refresh: {
|
|
1006
|
-
state: 'error',
|
|
1007
|
-
refreshedAt: null,
|
|
1008
|
-
retryable: true,
|
|
1009
|
-
retryAt: null,
|
|
1010
|
-
},
|
|
1011
|
-
};
|
|
1076
|
+
const workArea = this.baseListWorkArea(workspace, this.validate.requiredIdentifier(value.list.id), this.validate.requiredString(value.list.name));
|
|
1012
1077
|
return {
|
|
1013
1078
|
workArea,
|
|
1014
1079
|
task: {
|
|
@@ -1029,6 +1094,45 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
|
|
|
1029
1094
|
},
|
|
1030
1095
|
};
|
|
1031
1096
|
}
|
|
1097
|
+
supplementalListMemberships(value, workspace, home) {
|
|
1098
|
+
if (!Array.isArray(value.locations)) {
|
|
1099
|
+
return [];
|
|
1100
|
+
}
|
|
1101
|
+
const memberships = [];
|
|
1102
|
+
for (const location of value.locations) {
|
|
1103
|
+
if (!(0, vendor_shared_1.isRecord)(location)) {
|
|
1104
|
+
continue;
|
|
1105
|
+
}
|
|
1106
|
+
const remoteId = this.optionalIdentifier(location.id);
|
|
1107
|
+
const name = typeof location.name === 'string' ? location.name.trim() : '';
|
|
1108
|
+
if (remoteId === null || !name) {
|
|
1109
|
+
continue;
|
|
1110
|
+
}
|
|
1111
|
+
memberships.push({
|
|
1112
|
+
workArea: this.baseListWorkArea(workspace, remoteId, name),
|
|
1113
|
+
task: home.task,
|
|
1114
|
+
});
|
|
1115
|
+
}
|
|
1116
|
+
return memberships;
|
|
1117
|
+
}
|
|
1118
|
+
baseListWorkArea(workspace, remoteId, name) {
|
|
1119
|
+
return {
|
|
1120
|
+
remoteId,
|
|
1121
|
+
scopeKey: workspace.id,
|
|
1122
|
+
name,
|
|
1123
|
+
kind: 'list',
|
|
1124
|
+
description: null,
|
|
1125
|
+
assignedTaskCount: 0,
|
|
1126
|
+
hierarchy: [{ kind: 'workspace', remoteId: workspace.id, name: workspace.name }],
|
|
1127
|
+
workflow: { isOverridden: false, columns: [] },
|
|
1128
|
+
refresh: {
|
|
1129
|
+
state: 'error',
|
|
1130
|
+
refreshedAt: null,
|
|
1131
|
+
retryable: true,
|
|
1132
|
+
retryAt: null,
|
|
1133
|
+
},
|
|
1134
|
+
};
|
|
1135
|
+
}
|
|
1032
1136
|
normalizeTaskSubtasks(value, parentRemoteTaskId) {
|
|
1033
1137
|
if (value === null || value === undefined) {
|
|
1034
1138
|
return { items: [], truncated: false };
|
|
@@ -1106,9 +1210,9 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
|
|
|
1106
1210
|
}
|
|
1107
1211
|
addTasks(tasks, additions) {
|
|
1108
1212
|
for (const item of additions) {
|
|
1109
|
-
const
|
|
1110
|
-
if (!tasks.has(
|
|
1111
|
-
tasks.set(
|
|
1213
|
+
const membershipKey = this.workAreaKey(item.workArea, item.task.remoteId);
|
|
1214
|
+
if (!tasks.has(membershipKey)) {
|
|
1215
|
+
tasks.set(membershipKey, item);
|
|
1112
1216
|
}
|
|
1113
1217
|
}
|
|
1114
1218
|
}
|
|
@@ -1299,8 +1403,12 @@ let ClickUpExternalTaskProvider = class ClickUpExternalTaskProvider {
|
|
|
1299
1403
|
}
|
|
1300
1404
|
return url;
|
|
1301
1405
|
}
|
|
1302
|
-
workAreaKey(workArea) {
|
|
1303
|
-
|
|
1406
|
+
workAreaKey(workArea, taskId) {
|
|
1407
|
+
const parts = [workArea.scopeKey, workArea.remoteId];
|
|
1408
|
+
if (taskId !== undefined) {
|
|
1409
|
+
parts.push(taskId);
|
|
1410
|
+
}
|
|
1411
|
+
return JSON.stringify(parts);
|
|
1304
1412
|
}
|
|
1305
1413
|
optionalDescription(value) {
|
|
1306
1414
|
if (value === null || value === undefined || value === '') {
|