monday-cli 0.2.0 → 0.3.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.
- package/CHANGELOG.md +324 -2
- package/README.md +128 -30
- package/dist/api/board-favorites.d.ts +329 -0
- package/dist/api/board-favorites.d.ts.map +1 -0
- package/dist/api/board-favorites.js +353 -0
- package/dist/api/board-favorites.js.map +1 -0
- package/dist/api/board-mutation-result.d.ts +9 -5
- package/dist/api/board-mutation-result.d.ts.map +1 -1
- package/dist/api/board-mutation-result.js +9 -5
- package/dist/api/board-mutation-result.js.map +1 -1
- package/dist/api/board-relation-validation.d.ts +161 -0
- package/dist/api/board-relation-validation.d.ts.map +1 -0
- package/dist/api/board-relation-validation.js +317 -0
- package/dist/api/board-relation-validation.js.map +1 -0
- package/dist/api/cache.d.ts +14 -5
- package/dist/api/cache.d.ts.map +1 -1
- package/dist/api/cache.js +8 -10
- package/dist/api/cache.js.map +1 -1
- package/dist/api/column-mapping.js +2 -2
- package/dist/api/column-mapping.js.map +1 -1
- package/dist/api/column-mutation-result.d.ts +9 -5
- package/dist/api/column-mutation-result.d.ts.map +1 -1
- package/dist/api/column-mutation-result.js +9 -5
- package/dist/api/column-mutation-result.js.map +1 -1
- package/dist/api/column-types.d.ts +26 -7
- package/dist/api/column-types.d.ts.map +1 -1
- package/dist/api/column-types.js +42 -3
- package/dist/api/column-types.js.map +1 -1
- package/dist/api/column-values.d.ts +228 -31
- package/dist/api/column-values.d.ts.map +1 -1
- package/dist/api/column-values.js +551 -124
- package/dist/api/column-values.js.map +1 -1
- package/dist/api/cross-board-search.d.ts +501 -0
- package/dist/api/cross-board-search.d.ts.map +1 -0
- package/dist/api/cross-board-search.js +547 -0
- package/dist/api/cross-board-search.js.map +1 -0
- package/dist/api/dev-conventions.d.ts +1038 -0
- package/dist/api/dev-conventions.d.ts.map +1 -0
- package/dist/api/dev-conventions.js +1556 -0
- package/dist/api/dev-conventions.js.map +1 -0
- package/dist/api/dry-run.d.ts +32 -5
- package/dist/api/dry-run.d.ts.map +1 -1
- package/dist/api/dry-run.js +149 -32
- package/dist/api/dry-run.js.map +1 -1
- package/dist/api/errors.d.ts.map +1 -1
- package/dist/api/errors.js +28 -7
- package/dist/api/errors.js.map +1 -1
- package/dist/api/group-mutation-result.d.ts +9 -5
- package/dist/api/group-mutation-result.d.ts.map +1 -1
- package/dist/api/group-mutation-result.js +9 -5
- package/dist/api/group-mutation-result.js.map +1 -1
- package/dist/api/item-history-projection.d.ts +919 -0
- package/dist/api/item-history-projection.d.ts.map +1 -0
- package/dist/api/item-history-projection.js +1104 -0
- package/dist/api/item-history-projection.js.map +1 -0
- package/dist/api/item-mutation-execute.d.ts +82 -0
- package/dist/api/item-mutation-execute.d.ts.map +1 -0
- package/dist/api/item-mutation-execute.js +199 -0
- package/dist/api/item-mutation-execute.js.map +1 -0
- package/dist/api/notifications.d.ts +156 -0
- package/dist/api/notifications.d.ts.map +1 -0
- package/dist/api/notifications.js +215 -0
- package/dist/api/notifications.js.map +1 -0
- package/dist/api/oauth-test-helper.d.ts +64 -0
- package/dist/api/oauth-test-helper.d.ts.map +1 -0
- package/dist/api/oauth-test-helper.js +179 -0
- package/dist/api/oauth-test-helper.js.map +1 -0
- package/dist/api/oauth.d.ts +198 -0
- package/dist/api/oauth.d.ts.map +1 -0
- package/dist/api/oauth.js +471 -0
- package/dist/api/oauth.js.map +1 -0
- package/dist/api/partial-success-bulk.d.ts +422 -0
- package/dist/api/partial-success-bulk.d.ts.map +1 -0
- package/dist/api/partial-success-bulk.js +378 -0
- package/dist/api/partial-success-bulk.js.map +1 -0
- package/dist/api/people.d.ts +54 -1
- package/dist/api/people.d.ts.map +1 -1
- package/dist/api/people.js +27 -3
- package/dist/api/people.js.map +1 -1
- package/dist/api/probes.d.ts +487 -0
- package/dist/api/probes.d.ts.map +1 -0
- package/dist/api/probes.js +881 -0
- package/dist/api/probes.js.map +1 -0
- package/dist/api/raw-document.d.ts.map +1 -1
- package/dist/api/raw-document.js +2 -2
- package/dist/api/raw-document.js.map +1 -1
- package/dist/api/raw-write.d.ts.map +1 -1
- package/dist/api/raw-write.js +11 -3
- package/dist/api/raw-write.js.map +1 -1
- package/dist/api/resolution-context.d.ts +23 -11
- package/dist/api/resolution-context.d.ts.map +1 -1
- package/dist/api/resolution-context.js +53 -12
- package/dist/api/resolution-context.js.map +1 -1
- package/dist/api/resolution-pass.d.ts +30 -1
- package/dist/api/resolution-pass.d.ts.map +1 -1
- package/dist/api/resolution-pass.js +36 -1
- package/dist/api/resolution-pass.js.map +1 -1
- package/dist/api/resolve-client.d.ts +11 -0
- package/dist/api/resolve-client.d.ts.map +1 -1
- package/dist/api/resolve-client.js +1 -1
- package/dist/api/resolve-client.js.map +1 -1
- package/dist/api/response-root.d.ts +92 -46
- package/dist/api/response-root.d.ts.map +1 -1
- package/dist/api/response-root.js +93 -41
- package/dist/api/response-root.js.map +1 -1
- package/dist/api/tag-directory.d.ts +154 -0
- package/dist/api/tag-directory.d.ts.map +1 -0
- package/dist/api/tag-directory.js +325 -0
- package/dist/api/tag-directory.js.map +1 -0
- package/dist/api/time-tracking.d.ts +165 -0
- package/dist/api/time-tracking.d.ts.map +1 -0
- package/dist/api/time-tracking.js +135 -0
- package/dist/api/time-tracking.js.map +1 -0
- package/dist/api/transport.js +3 -3
- package/dist/api/transport.js.map +1 -1
- package/dist/api/usage.d.ts +190 -0
- package/dist/api/usage.d.ts.map +1 -0
- package/dist/api/usage.js +194 -0
- package/dist/api/usage.js.map +1 -0
- package/dist/api/users-fan-out-mutation.d.ts.map +1 -1
- package/dist/api/users-fan-out-mutation.js +10 -5
- package/dist/api/users-fan-out-mutation.js.map +1 -1
- package/dist/api/webhooks.d.ts +357 -0
- package/dist/api/webhooks.d.ts.map +1 -0
- package/dist/api/webhooks.js +333 -0
- package/dist/api/webhooks.js.map +1 -0
- package/dist/cli/envelope-out.d.ts +18 -1
- package/dist/cli/envelope-out.d.ts.map +1 -1
- package/dist/cli/envelope-out.js +16 -2
- package/dist/cli/envelope-out.js.map +1 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +120 -1
- package/dist/cli/program.js.map +1 -1
- package/dist/cli/run.d.ts +12 -0
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +2 -0
- package/dist/cli/run.js.map +1 -1
- package/dist/commands/account/tags.d.ts +37 -0
- package/dist/commands/account/tags.d.ts.map +1 -0
- package/dist/commands/account/tags.js +84 -0
- package/dist/commands/account/tags.js.map +1 -0
- package/dist/commands/auth/login.d.ts +14 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +314 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +28 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +94 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/board/archive.d.ts.map +1 -1
- package/dist/commands/board/archive.js +14 -14
- package/dist/commands/board/archive.js.map +1 -1
- package/dist/commands/board/column-create.d.ts +3 -3
- package/dist/commands/board/column-create.d.ts.map +1 -1
- package/dist/commands/board/column-create.js +52 -45
- package/dist/commands/board/column-create.js.map +1 -1
- package/dist/commands/board/column-delete.d.ts.map +1 -1
- package/dist/commands/board/column-delete.js +15 -16
- package/dist/commands/board/column-delete.js.map +1 -1
- package/dist/commands/board/column-update.d.ts.map +1 -1
- package/dist/commands/board/column-update.js +23 -22
- package/dist/commands/board/column-update.js.map +1 -1
- package/dist/commands/board/create.d.ts.map +1 -1
- package/dist/commands/board/create.js +14 -17
- package/dist/commands/board/create.js.map +1 -1
- package/dist/commands/board/delete.d.ts.map +1 -1
- package/dist/commands/board/delete.js +12 -15
- package/dist/commands/board/delete.js.map +1 -1
- package/dist/commands/board/describe.d.ts.map +1 -1
- package/dist/commands/board/describe.js +30 -0
- package/dist/commands/board/describe.js.map +1 -1
- package/dist/commands/board/duplicate.d.ts.map +1 -1
- package/dist/commands/board/duplicate.js +12 -13
- package/dist/commands/board/duplicate.js.map +1 -1
- package/dist/commands/board/favorites.d.ts +33 -0
- package/dist/commands/board/favorites.d.ts.map +1 -0
- package/dist/commands/board/favorites.js +74 -0
- package/dist/commands/board/favorites.js.map +1 -0
- package/dist/commands/board/find.d.ts +1 -1
- package/dist/commands/board/group-archive.d.ts.map +1 -1
- package/dist/commands/board/group-archive.js +12 -16
- package/dist/commands/board/group-archive.js.map +1 -1
- package/dist/commands/board/group-create.d.ts.map +1 -1
- package/dist/commands/board/group-create.js +9 -19
- package/dist/commands/board/group-create.js.map +1 -1
- package/dist/commands/board/group-delete.d.ts.map +1 -1
- package/dist/commands/board/group-delete.js +12 -16
- package/dist/commands/board/group-delete.js.map +1 -1
- package/dist/commands/board/group-duplicate.d.ts.map +1 -1
- package/dist/commands/board/group-duplicate.js +12 -16
- package/dist/commands/board/group-duplicate.js.map +1 -1
- package/dist/commands/board/group-update.d.ts.map +1 -1
- package/dist/commands/board/group-update.js +12 -11
- package/dist/commands/board/group-update.js.map +1 -1
- package/dist/commands/board/list.d.ts +1 -1
- package/dist/commands/board/update.d.ts.map +1 -1
- package/dist/commands/board/update.js +16 -11
- package/dist/commands/board/update.js.map +1 -1
- package/dist/commands/cache/list.d.ts +2 -0
- package/dist/commands/cache/list.d.ts.map +1 -1
- package/dist/commands/cache/list.js +2 -2
- package/dist/commands/cache/list.js.map +1 -1
- package/dist/commands/dev/_shared.d.ts +40 -0
- package/dist/commands/dev/_shared.d.ts.map +1 -0
- package/dist/commands/dev/_shared.js +104 -0
- package/dist/commands/dev/_shared.js.map +1 -0
- package/dist/commands/dev/configure.d.ts +36 -0
- package/dist/commands/dev/configure.d.ts.map +1 -0
- package/dist/commands/dev/configure.js +145 -0
- package/dist/commands/dev/configure.js.map +1 -0
- package/dist/commands/dev/discover.d.ts +34 -0
- package/dist/commands/dev/discover.d.ts.map +1 -0
- package/dist/commands/dev/discover.js +117 -0
- package/dist/commands/dev/discover.js.map +1 -0
- package/dist/commands/dev/doctor.d.ts +39 -0
- package/dist/commands/dev/doctor.d.ts.map +1 -0
- package/dist/commands/dev/doctor.js +91 -0
- package/dist/commands/dev/doctor.js.map +1 -0
- package/dist/commands/dev/epic/items.d.ts +24 -0
- package/dist/commands/dev/epic/items.d.ts.map +1 -0
- package/dist/commands/dev/epic/items.js +103 -0
- package/dist/commands/dev/epic/items.js.map +1 -0
- package/dist/commands/dev/epic/list.d.ts +36 -0
- package/dist/commands/dev/epic/list.d.ts.map +1 -0
- package/dist/commands/dev/epic/list.js +120 -0
- package/dist/commands/dev/epic/list.js.map +1 -0
- package/dist/commands/dev/release/list.d.ts +21 -0
- package/dist/commands/dev/release/list.d.ts.map +1 -0
- package/dist/commands/dev/release/list.js +73 -0
- package/dist/commands/dev/release/list.js.map +1 -0
- package/dist/commands/dev/sprint/current.d.ts +24 -0
- package/dist/commands/dev/sprint/current.d.ts.map +1 -0
- package/dist/commands/dev/sprint/current.js +90 -0
- package/dist/commands/dev/sprint/current.js.map +1 -0
- package/dist/commands/dev/sprint/items.d.ts +34 -0
- package/dist/commands/dev/sprint/items.d.ts.map +1 -0
- package/dist/commands/dev/sprint/items.js +118 -0
- package/dist/commands/dev/sprint/items.js.map +1 -0
- package/dist/commands/dev/sprint/list.d.ts +41 -0
- package/dist/commands/dev/sprint/list.d.ts.map +1 -0
- package/dist/commands/dev/sprint/list.js +104 -0
- package/dist/commands/dev/sprint/list.js.map +1 -0
- package/dist/commands/dev/task/block.d.ts +29 -0
- package/dist/commands/dev/task/block.d.ts.map +1 -0
- package/dist/commands/dev/task/block.js +106 -0
- package/dist/commands/dev/task/block.js.map +1 -0
- package/dist/commands/dev/task/done.d.ts +30 -0
- package/dist/commands/dev/task/done.d.ts.map +1 -0
- package/dist/commands/dev/task/done.js +113 -0
- package/dist/commands/dev/task/done.js.map +1 -0
- package/dist/commands/dev/task/list.d.ts +42 -0
- package/dist/commands/dev/task/list.d.ts.map +1 -0
- package/dist/commands/dev/task/list.js +227 -0
- package/dist/commands/dev/task/list.js.map +1 -0
- package/dist/commands/dev/task/start.d.ts +29 -0
- package/dist/commands/dev/task/start.d.ts.map +1 -0
- package/dist/commands/dev/task/start.js +90 -0
- package/dist/commands/dev/task/start.js.map +1 -0
- package/dist/commands/emit.d.ts.map +1 -1
- package/dist/commands/emit.js +5 -3
- package/dist/commands/emit.js.map +1 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +95 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/item/archive.d.ts.map +1 -1
- package/dist/commands/item/archive.js +11 -0
- package/dist/commands/item/archive.js.map +1 -1
- package/dist/commands/item/clear.d.ts.map +1 -1
- package/dist/commands/item/clear.js +15 -0
- package/dist/commands/item/clear.js.map +1 -1
- package/dist/commands/item/create.d.ts.map +1 -1
- package/dist/commands/item/create.js +41 -8
- package/dist/commands/item/create.js.map +1 -1
- package/dist/commands/item/delete.d.ts.map +1 -1
- package/dist/commands/item/delete.js +11 -0
- package/dist/commands/item/delete.js.map +1 -1
- package/dist/commands/item/duplicate.d.ts.map +1 -1
- package/dist/commands/item/duplicate.js +12 -0
- package/dist/commands/item/duplicate.js.map +1 -1
- package/dist/commands/item/history.d.ts +60 -0
- package/dist/commands/item/history.d.ts.map +1 -0
- package/dist/commands/item/history.js +309 -0
- package/dist/commands/item/history.js.map +1 -0
- package/dist/commands/item/list.d.ts.map +1 -1
- package/dist/commands/item/list.js +16 -13
- package/dist/commands/item/list.js.map +1 -1
- package/dist/commands/item/move.d.ts.map +1 -1
- package/dist/commands/item/move.js +41 -7
- package/dist/commands/item/move.js.map +1 -1
- package/dist/commands/item/search.d.ts +99 -15
- package/dist/commands/item/search.d.ts.map +1 -1
- package/dist/commands/item/search.js +480 -36
- package/dist/commands/item/search.js.map +1 -1
- package/dist/commands/item/set.d.ts.map +1 -1
- package/dist/commands/item/set.js +52 -8
- package/dist/commands/item/set.js.map +1 -1
- package/dist/commands/item/time-track/start.d.ts +61 -0
- package/dist/commands/item/time-track/start.d.ts.map +1 -0
- package/dist/commands/item/time-track/start.js +138 -0
- package/dist/commands/item/time-track/start.js.map +1 -0
- package/dist/commands/item/time-track/stop.d.ts +32 -0
- package/dist/commands/item/time-track/stop.d.ts.map +1 -0
- package/dist/commands/item/time-track/stop.js +97 -0
- package/dist/commands/item/time-track/stop.js.map +1 -0
- package/dist/commands/item/update.d.ts +1 -0
- package/dist/commands/item/update.d.ts.map +1 -1
- package/dist/commands/item/update.js +103 -113
- package/dist/commands/item/update.js.map +1 -1
- package/dist/commands/item/upsert.d.ts.map +1 -1
- package/dist/commands/item/upsert.js +48 -1
- package/dist/commands/item/upsert.js.map +1 -1
- package/dist/commands/notification/send.d.ts +60 -0
- package/dist/commands/notification/send.d.ts.map +1 -0
- package/dist/commands/notification/send.js +147 -0
- package/dist/commands/notification/send.js.map +1 -0
- package/dist/commands/parse-argv.d.ts.map +1 -1
- package/dist/commands/parse-argv.js +14 -4
- package/dist/commands/parse-argv.js.map +1 -1
- package/dist/commands/raw/index.d.ts.map +1 -1
- package/dist/commands/raw/index.js +13 -15
- package/dist/commands/raw/index.js.map +1 -1
- package/dist/commands/run-by-id-lookup.d.ts.map +1 -1
- package/dist/commands/run-by-id-lookup.js +2 -2
- package/dist/commands/run-by-id-lookup.js.map +1 -1
- package/dist/commands/schema/index.d.ts +2 -0
- package/dist/commands/schema/index.d.ts.map +1 -1
- package/dist/commands/status.d.ts +120 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +365 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update/body-source.d.ts.map +1 -1
- package/dist/commands/update/body-source.js +2 -2
- package/dist/commands/update/body-source.js.map +1 -1
- package/dist/commands/update/create.d.ts +2 -3
- package/dist/commands/update/create.d.ts.map +1 -1
- package/dist/commands/update/create.js +15 -3
- package/dist/commands/update/create.js.map +1 -1
- package/dist/commands/update/delete.d.ts.map +1 -1
- package/dist/commands/update/delete.js +11 -0
- package/dist/commands/update/delete.js.map +1 -1
- package/dist/commands/update/edit.d.ts.map +1 -1
- package/dist/commands/update/edit.js +11 -0
- package/dist/commands/update/edit.js.map +1 -1
- package/dist/commands/update/list.d.ts.map +1 -1
- package/dist/commands/update/list.js +15 -12
- package/dist/commands/update/list.js.map +1 -1
- package/dist/commands/update/reply.d.ts.map +1 -1
- package/dist/commands/update/reply.js +11 -0
- package/dist/commands/update/reply.js.map +1 -1
- package/dist/commands/update/toggle.d.ts.map +1 -1
- package/dist/commands/update/toggle.js +13 -0
- package/dist/commands/update/toggle.js.map +1 -1
- package/dist/commands/usage.d.ts +58 -0
- package/dist/commands/usage.d.ts.map +1 -0
- package/dist/commands/usage.js +94 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/commands/webhook/create.d.ts +74 -0
- package/dist/commands/webhook/create.d.ts.map +1 -0
- package/dist/commands/webhook/create.js +150 -0
- package/dist/commands/webhook/create.js.map +1 -0
- package/dist/commands/webhook/delete.d.ts +46 -0
- package/dist/commands/webhook/delete.d.ts.map +1 -0
- package/dist/commands/webhook/delete.js +141 -0
- package/dist/commands/webhook/delete.js.map +1 -0
- package/dist/commands/webhook/list.d.ts +23 -0
- package/dist/commands/webhook/list.d.ts.map +1 -0
- package/dist/commands/webhook/list.js +68 -0
- package/dist/commands/webhook/list.js.map +1 -0
- package/dist/commands/workspace/create.d.ts.map +1 -1
- package/dist/commands/workspace/create.js +16 -0
- package/dist/commands/workspace/create.js.map +1 -1
- package/dist/commands/workspace/delete.d.ts.map +1 -1
- package/dist/commands/workspace/delete.js +13 -13
- package/dist/commands/workspace/delete.js.map +1 -1
- package/dist/commands/workspace/list.d.ts +1 -1
- package/dist/commands/workspace/update.d.ts.map +1 -1
- package/dist/commands/workspace/update.js +15 -15
- package/dist/commands/workspace/update.js.map +1 -1
- package/dist/config/credentials.d.ts +189 -0
- package/dist/config/credentials.d.ts.map +1 -0
- package/dist/config/credentials.js +300 -0
- package/dist/config/credentials.js.map +1 -0
- package/dist/config/profiles.d.ts +125 -0
- package/dist/config/profiles.d.ts.map +1 -0
- package/dist/config/profiles.js +227 -0
- package/dist/config/profiles.js.map +1 -0
- package/dist/types/global-flags.d.ts +1 -1
- package/dist/types/global-flags.d.ts.map +1 -1
- package/dist/types/global-flags.js +28 -16
- package/dist/types/global-flags.js.map +1 -1
- package/dist/types/ids.d.ts +2 -0
- package/dist/types/ids.d.ts.map +1 -1
- package/dist/types/ids.js +5 -3
- package/dist/types/ids.js.map +1 -1
- package/dist/utils/errors.d.ts +57 -3
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +69 -2
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/fs.d.ts +35 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +36 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/json.d.ts +60 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +86 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/output/ndjson.d.ts +65 -3
- package/dist/utils/output/ndjson.d.ts.map +1 -1
- package/dist/utils/output/ndjson.js +21 -0
- package/dist/utils/output/ndjson.js.map +1 -1
- package/dist/utils/redact.d.ts.map +1 -1
- package/dist/utils/redact.js +31 -0
- package/dist/utils/redact.js.map +1 -1
- package/package.json +2 -1
- package/dist/commands/account/client-helper.d.ts +0 -37
- package/dist/commands/account/client-helper.d.ts.map +0 -1
- package/dist/commands/account/client-helper.js +0 -55
- package/dist/commands/account/client-helper.js.map +0 -1
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-board fan-out walker for the v0.3-M23 `monday item search`
|
|
3
|
+
* cross-board path (`cli-design.md` §13 v0.3 entry).
|
|
4
|
+
*
|
|
5
|
+
* **What `monday item search` cross-board answers:** "find items
|
|
6
|
+
* matching `--where` across N boards in one call" without the agent
|
|
7
|
+
* iterating boards by hand. The v0.1 `monday item search --board <bid>`
|
|
8
|
+
* path uses Monday's top-level `items_page_by_column_values(board_id:
|
|
9
|
+
* ID!, ...)` query which is SINGULAR — it accepts ONE board ID. The
|
|
10
|
+
* cross-board path can't reuse that surface; it uses the different
|
|
11
|
+
* shape `boards(ids: [...]) { items_page(query_params: { rules }) }`
|
|
12
|
+
* which fans out a single GraphQL call across N boards and returns
|
|
13
|
+
* each board's first-page results.
|
|
14
|
+
*
|
|
15
|
+
* **Decision 5 closure (`3a2f1db`).** Per-call cap pinned at
|
|
16
|
+
* `--max-boards 25` default + hard cap 100; above-cap surfaces
|
|
17
|
+
* `usage_error` with hint pointing the agent at `--workspace` /
|
|
18
|
+
* `--favorites` to narrow. Empirical-probe finding: complexity is
|
|
19
|
+
* NOT the constraint (~25-30 points per board against a ~999_950
|
|
20
|
+
* per-call budget supports ~30,000+ boards complexity-wise); the
|
|
21
|
+
* REAL constraint is wall-clock latency — the fan-out call scales
|
|
22
|
+
* roughly linearly at ~0.5-1.5s per call at small N, putting N=25
|
|
23
|
+
* comfortably under the 30s `MONDAY_REQUEST_TIMEOUT_MS` default and
|
|
24
|
+
* N≥60 at the timeout ceiling. The 25/100 cap is calibrated for the
|
|
25
|
+
* latency envelope, not the complexity budget.
|
|
26
|
+
*
|
|
27
|
+
* **Three load-bearing empirical probe findings (2026-05-11, API
|
|
28
|
+
* `2026-01`, `scripts/probe/m23-cross-board.ts` +
|
|
29
|
+
* `scripts/probe/m23-cross-board-search-2.ts`):**
|
|
30
|
+
*
|
|
31
|
+
* 1. **Single-call surface; no resumable cross-board cursor at
|
|
32
|
+
* v0.3.** Each board returns its own `items_page.cursor`. The
|
|
33
|
+
* v0.3 walker fans out across N boards in ONE GraphQL call,
|
|
34
|
+
* collects each board's first page, and stops. When any
|
|
35
|
+
* board's per-board cursor comes back non-null (board has
|
|
36
|
+
* more items) OR the aggregate `--limit` short-circuited
|
|
37
|
+
* mid-fan-out, the walker surfaces
|
|
38
|
+
* {@link CrossBoardTruncatedWarning} with per-board state
|
|
39
|
+
* (`exhausted` / `has_more` / `not_started`) for agent
|
|
40
|
+
* introspection — but does NOT expose a resumable
|
|
41
|
+
* cross-board cursor (Codex round-1 P1-2 resolution; v0.4
|
|
42
|
+
* may add an opaque-token cursor envelope-additively). Agents
|
|
43
|
+
* needing pagination today narrow with `--workspace` /
|
|
44
|
+
* `--favorites` or use the v0.1 `--board <bid>` single-board
|
|
45
|
+
* path (which has its own resumable cursor per §5.6).
|
|
46
|
+
* 2. **Inaccessible board IDs silently omitted.**
|
|
47
|
+
* `boards(ids: [<bad-id>])` returns `{"boards":[]}` (empty,
|
|
48
|
+
* not null, not error) even on mixed accessible+inaccessible
|
|
49
|
+
* input. The walker detects `response.boards.length <
|
|
50
|
+
* input_ids.length` and surfaces an `inaccessible_boards`
|
|
51
|
+
* warning rather than silently delivering partial results.
|
|
52
|
+
* 3. **Per-board column resolution required for `--where`.** The
|
|
53
|
+
* `items_page(query_params: { rules })` shape uses each
|
|
54
|
+
* board's own column IDs; passing a column token (e.g.
|
|
55
|
+
* `status`) that doesn't resolve on ONE board errors the
|
|
56
|
+
* WHOLE cross-board query with `"Column not found"`. The
|
|
57
|
+
* cross-board walker MUST resolve column tokens per-board
|
|
58
|
+
* independently, build per-board query_params, and skip
|
|
59
|
+
* boards where the column doesn't resolve (with a
|
|
60
|
+
* `column_not_found_on_board` warning) rather than failing
|
|
61
|
+
* the entire fan-out.
|
|
62
|
+
*
|
|
63
|
+
* **What's stub vs runtime at the pre-flight.** `crossBoardSearch`
|
|
64
|
+
* ships as a `Promise.reject(internal_error)` stub under `c8 ignore
|
|
65
|
+
* start/stop` — M23 implementation lands the runtime body alongside
|
|
66
|
+
* the `monday item search` cross-board action's action. The schema
|
|
67
|
+
* definitions, type exports, the cap constants, the pure-helper
|
|
68
|
+
* `validateMaxBoards`, the per-board input/output shapes ship as
|
|
69
|
+
* REAL implementations so the pre-flight Codex review can verify
|
|
70
|
+
* the contract surface against the empirical-probe findings inline.
|
|
71
|
+
*
|
|
72
|
+
* **Streaming reuse.** Per the v0.3-plan §3 M23 spec, the
|
|
73
|
+
* cross-board path reuses `startNdjsonStream` (R52) + the existing
|
|
74
|
+
* pagination helpers (`walkPages.onItem` / `paginate.onItem`). The
|
|
75
|
+
* fan-out shape is a PARENT stream that merges N child walkers —
|
|
76
|
+
* the child walker per board uses the same cursor-walker shape as
|
|
77
|
+
* the v0.1 `item list` cursor walker, then the parent emits items
|
|
78
|
+
* per-arrival across boards (no buffering — backpressure flows
|
|
79
|
+
* through `startNdjsonStream.onItem`).
|
|
80
|
+
*/
|
|
81
|
+
import { z } from 'zod';
|
|
82
|
+
import { ApiError } from '../utils/errors.js';
|
|
83
|
+
import { unwrapOrThrow } from '../utils/parse-boundary.js';
|
|
84
|
+
import { BoardIdSchema } from '../types/ids.js';
|
|
85
|
+
/**
|
|
86
|
+
* Default cross-board fan-out cap per Decision 5 closure (`3a2f1db`).
|
|
87
|
+
* Calibrated against wall-clock latency: at ~0.5-1.5s per cross-board
|
|
88
|
+
* call at small N, N=25 lands ~12-18s — comfortable under the 30s
|
|
89
|
+
* `MONDAY_REQUEST_TIMEOUT_MS` default with margin for slower per-board
|
|
90
|
+
* resolutions.
|
|
91
|
+
*/
|
|
92
|
+
export const DEFAULT_MAX_BOARDS = 25;
|
|
93
|
+
/**
|
|
94
|
+
* Hard cap on `--max-boards` per Decision 5 closure (`3a2f1db`).
|
|
95
|
+
* Above-cap surfaces `usage_error` with a hint pointing the agent at
|
|
96
|
+
* `--workspace` / `--favorites` to narrow. The 100-board hard cap
|
|
97
|
+
* lands roughly at the 30s timeout ceiling at the measured per-call
|
|
98
|
+
* latency — above 100 the call risks the `MONDAY_REQUEST_TIMEOUT_MS`
|
|
99
|
+
* default, which is a worse failure mode than a clean `usage_error`
|
|
100
|
+
* at the parse boundary.
|
|
101
|
+
*/
|
|
102
|
+
export const HARD_CAP_MAX_BOARDS = 100;
|
|
103
|
+
/**
|
|
104
|
+
* Schema enforcing the `--max-boards` cap at the parse boundary.
|
|
105
|
+
* The runtime walker additionally guards as a defense in depth, but
|
|
106
|
+
* the parse-time enforcement catches obvious mistakes upfront with
|
|
107
|
+
* the cli-design §6.5 `usage_error` envelope rather than letting the
|
|
108
|
+
* fan-out fire N requests on Monday before the cap fires server-side.
|
|
109
|
+
*/
|
|
110
|
+
export const maxBoardsSchema = z.coerce
|
|
111
|
+
.number()
|
|
112
|
+
.int()
|
|
113
|
+
.positive()
|
|
114
|
+
.max(HARD_CAP_MAX_BOARDS, {
|
|
115
|
+
message: `--max-boards exceeds the hard cap of ${String(HARD_CAP_MAX_BOARDS)} (wall-clock fan-out latency cap, not a complexity-budget cap; ~0.5-1.5s per call at small N puts N>=60 at the 30s MONDAY_REQUEST_TIMEOUT_MS ceiling per the Decision 5 \`3a2f1db\` empirical-probe finding); narrow the cross-board set with --workspace or --favorites`,
|
|
116
|
+
});
|
|
117
|
+
/**
|
|
118
|
+
* Schema validating an individual cross-board item. Mirrors
|
|
119
|
+
* {@link CrossBoardItem} so the envelope is parse-safe at every
|
|
120
|
+
* emission path (in particular `monday schema` introspection of the
|
|
121
|
+
* cross-board `monday item search` output).
|
|
122
|
+
*/
|
|
123
|
+
export const crossBoardItemSchema = z
|
|
124
|
+
.object({
|
|
125
|
+
id: z.string().min(1),
|
|
126
|
+
name: z.string(),
|
|
127
|
+
state: z.string().nullable(),
|
|
128
|
+
board: z.object({ id: z.string().min(1), name: z.string() }).strict(),
|
|
129
|
+
column_values: z.record(z.string(), z.string().nullable()),
|
|
130
|
+
})
|
|
131
|
+
.strict();
|
|
132
|
+
/**
|
|
133
|
+
* Cross-board search-output schema. The v0.1 single-board
|
|
134
|
+
* `monday item search` returns `readonly ProjectedItem[]` (the
|
|
135
|
+
* `itemSearchOutputSchema` in `src/commands/item/search.ts`); the
|
|
136
|
+
* cross-board path returns a richer per-item shape (board ID + name
|
|
137
|
+
* attached) so agents can tell which board each hit came from.
|
|
138
|
+
*
|
|
139
|
+
* **Why a different output shape, not a union.** The single-board
|
|
140
|
+
* path's `ProjectedItem` includes a `meta.columns` title map on the
|
|
141
|
+
* envelope (R52 fold); the cross-board path can't reuse that because
|
|
142
|
+
* `meta.columns` is a single-board concept. Carrying per-board title
|
|
143
|
+
* maps on the envelope would balloon the meta payload; instead,
|
|
144
|
+
* cross-board items carry their column values keyed by the input
|
|
145
|
+
* column TOKEN (resolved per-board) rather than per-board column
|
|
146
|
+
* IDs. Same column token across boards = same key in `column_values`
|
|
147
|
+
* — the resolver step homogenises the keys.
|
|
148
|
+
*/
|
|
149
|
+
export const crossBoardSearchOutputSchema = z.array(crossBoardItemSchema);
|
|
150
|
+
export const inaccessibleBoardsWarningSchema = z
|
|
151
|
+
.object({
|
|
152
|
+
code: z.literal('inaccessible_boards'),
|
|
153
|
+
message: z.string().min(1),
|
|
154
|
+
details: z.object({
|
|
155
|
+
requested_count: z.number().int().nonnegative(),
|
|
156
|
+
returned_count: z.number().int().nonnegative(),
|
|
157
|
+
missing_board_ids: z.array(z.string().min(1)),
|
|
158
|
+
hint: z.string().min(1),
|
|
159
|
+
}).strict(),
|
|
160
|
+
})
|
|
161
|
+
.strict();
|
|
162
|
+
export const columnNotFoundOnBoardWarningSchema = z
|
|
163
|
+
.object({
|
|
164
|
+
code: z.literal('column_not_found_on_board'),
|
|
165
|
+
message: z.string().min(1),
|
|
166
|
+
details: z.object({
|
|
167
|
+
board_id: z.string().min(1),
|
|
168
|
+
column: z.string().min(1),
|
|
169
|
+
hint: z.string().min(1),
|
|
170
|
+
}).strict(),
|
|
171
|
+
})
|
|
172
|
+
.strict();
|
|
173
|
+
export const crossBoardTruncatedWarningSchema = z
|
|
174
|
+
.object({
|
|
175
|
+
code: z.literal('cross_board_truncated'),
|
|
176
|
+
message: z.string().min(1),
|
|
177
|
+
details: z
|
|
178
|
+
.object({
|
|
179
|
+
reason: z.enum(['limit_hit', 'board_has_more']),
|
|
180
|
+
total_returned: z.number().int().nonnegative(),
|
|
181
|
+
limit: z.number().int().positive().nullable(),
|
|
182
|
+
per_board_state: z.record(z.string(), z.enum(['exhausted', 'has_more', 'not_started'])),
|
|
183
|
+
hint: z.string().min(1),
|
|
184
|
+
})
|
|
185
|
+
.strict(),
|
|
186
|
+
})
|
|
187
|
+
.strict();
|
|
188
|
+
/**
|
|
189
|
+
* Validates `--max-boards <n>` at the parse boundary. Centralised
|
|
190
|
+
* pure helper so the command-action argv parser and the walker's
|
|
191
|
+
* defensive check share one rule. **Real implementation** at
|
|
192
|
+
* pre-flight (not a stub) — the rule is the contract surface, not
|
|
193
|
+
* the runtime cost.
|
|
194
|
+
*
|
|
195
|
+
* Returns the parsed cap on success; throws `UsageError`-routed
|
|
196
|
+
* `ApiError` on out-of-range. The thrown error's `details.hint`
|
|
197
|
+
* forward-references `--workspace` / `--favorites` per Decision 5's
|
|
198
|
+
* hint wording.
|
|
199
|
+
*/
|
|
200
|
+
export const validateMaxBoards = (rawValue) => {
|
|
201
|
+
const fallback = rawValue ?? DEFAULT_MAX_BOARDS;
|
|
202
|
+
// The schema's `.coerce.number().int().positive().max(HARD_CAP_MAX_BOARDS)`
|
|
203
|
+
// does the real check; this re-parse keeps the error shape consistent
|
|
204
|
+
// with the command-action argv parser.
|
|
205
|
+
const parsed = maxBoardsSchema.safeParse(fallback);
|
|
206
|
+
/* c8 ignore start */
|
|
207
|
+
// Defensive: callers (the command action's argv-parser) already
|
|
208
|
+
// run the same schema; this re-parse exists for any future
|
|
209
|
+
// non-CLI consumer that constructs CrossBoardSearchInputs by
|
|
210
|
+
// hand. Reaching this branch from the CLI path is not possible.
|
|
211
|
+
if (!parsed.success) {
|
|
212
|
+
throw new ApiError('usage_error', `invalid --max-boards: ${parsed.error.issues[0]?.message ?? 'out of range'}`, {
|
|
213
|
+
details: {
|
|
214
|
+
max_boards: rawValue,
|
|
215
|
+
hard_cap: HARD_CAP_MAX_BOARDS,
|
|
216
|
+
hint: 'the cap protects against the 30s request timeout (Decision 5 `3a2f1db` wall-clock-latency rationale, not complexity-budget); narrow the cross-board set with --workspace <wid> or --favorites',
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
/* c8 ignore stop */
|
|
221
|
+
return parsed.data;
|
|
222
|
+
};
|
|
223
|
+
/**
|
|
224
|
+
* Builds an {@link InaccessibleBoardsWarning} from the response /
|
|
225
|
+
* input deltas. **Real implementation** at pre-flight (pure helper,
|
|
226
|
+
* not a stub) — the warning shape is the contract surface.
|
|
227
|
+
*
|
|
228
|
+
* The `missing_board_ids` slot is deterministic-ordered (input
|
|
229
|
+
* order, filtered to ids NOT in the response set) so cassette
|
|
230
|
+
* fixtures remain stable across re-recordings.
|
|
231
|
+
*/
|
|
232
|
+
export const buildInaccessibleBoardsWarning = (requestedIds, returnedIds) => {
|
|
233
|
+
const returnedSet = new Set(returnedIds);
|
|
234
|
+
const missing = requestedIds.filter((id) => !returnedSet.has(id));
|
|
235
|
+
return {
|
|
236
|
+
code: 'inaccessible_boards',
|
|
237
|
+
message: `${String(missing.length)} of ${String(requestedIds.length)} requested boards were inaccessible or do not exist; ${String(returnedIds.length)} returned`,
|
|
238
|
+
details: {
|
|
239
|
+
requested_count: requestedIds.length,
|
|
240
|
+
returned_count: returnedIds.length,
|
|
241
|
+
missing_board_ids: missing,
|
|
242
|
+
hint: 'inaccessible boards are silently omitted by Monday\'s `boards(ids:)` query; verify board IDs or permissions',
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
};
|
|
246
|
+
/**
|
|
247
|
+
* Builds a {@link ColumnNotFoundOnBoardWarning} from the per-board
|
|
248
|
+
* column-resolution failure. **Real implementation** at pre-flight
|
|
249
|
+
* (pure helper, not a stub).
|
|
250
|
+
*/
|
|
251
|
+
export const buildColumnNotFoundOnBoardWarning = (boardId, columnToken) => ({
|
|
252
|
+
code: 'column_not_found_on_board',
|
|
253
|
+
message: `column "${columnToken}" not found on board ${boardId}; board skipped in cross-board fan-out`,
|
|
254
|
+
details: {
|
|
255
|
+
board_id: boardId,
|
|
256
|
+
column: columnToken,
|
|
257
|
+
hint: 'cross-board search requires the --where column to resolve on every board in the fan-out; boards without the column are skipped',
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
/**
|
|
261
|
+
* Builds a {@link CrossBoardTruncatedWarning} from the walker's
|
|
262
|
+
* end-of-walk per-board state. **Real implementation** at pre-flight
|
|
263
|
+
* (pure helper).
|
|
264
|
+
*
|
|
265
|
+
* The `reason` discriminant distinguishes:
|
|
266
|
+
* - `'limit_hit'` — the aggregate `--limit` short-circuited the
|
|
267
|
+
* walk. The hint points the agent at supplying a larger
|
|
268
|
+
* `--limit` or narrowing with `--workspace` / `--favorites`.
|
|
269
|
+
* - `'board_has_more'` — every board's per-board page-cap fired
|
|
270
|
+
* before the board exhausted. The hint points the agent at
|
|
271
|
+
* narrowing the cross-board set or running the v0.1 single-board
|
|
272
|
+
* `--board <bid>` path per board.
|
|
273
|
+
*/
|
|
274
|
+
export const buildCrossBoardTruncatedWarning = (reason, totalReturned, limit, perBoardState) => {
|
|
275
|
+
const hint = reason === 'limit_hit'
|
|
276
|
+
? `--limit ${String(limit ?? '?')} short-circuited the cross-board fan-out; supply a larger --limit, narrow with --workspace / --favorites, or use --board <bid> for the v0.1 single-board path`
|
|
277
|
+
: 'one or more boards still have items beyond the v0.3 cross-board single-call surface; narrow with --workspace / --favorites or use --board <bid> per board for the v0.1 resumable-cursor path';
|
|
278
|
+
return {
|
|
279
|
+
code: 'cross_board_truncated',
|
|
280
|
+
message: `cross-board walk truncated after ${String(totalReturned)} items (reason: ${reason})`,
|
|
281
|
+
details: {
|
|
282
|
+
reason,
|
|
283
|
+
total_returned: totalReturned,
|
|
284
|
+
limit,
|
|
285
|
+
per_board_state: perBoardState,
|
|
286
|
+
hint,
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
};
|
|
290
|
+
/**
|
|
291
|
+
* The GraphQL document the walker issues per board. Per the M23
|
|
292
|
+
* empirical probe (`scripts/probe/m23-cross-board-search-2.ts` (1)
|
|
293
|
+
* + (3)), `query_params.rules[].column_id` is `ID!` (not `String!`)
|
|
294
|
+
* and `compare_value` is `[JSON!]`. The cross-board surface uses
|
|
295
|
+
* `boards(ids: [...]) { items_page(query_params: {...}) }`; with
|
|
296
|
+
* per-board column resolution producing distinct rule sets per
|
|
297
|
+
* board, the walker issues ONE call per plan (the surface can't
|
|
298
|
+
* fold per-board rules into a single document without aliased
|
|
299
|
+
* sub-queries — N calls keep the document static and the per-board
|
|
300
|
+
* latency profile transparent per Decision 5's wall-clock-cap
|
|
301
|
+
* rationale). The boards(ids: [$boardId]) shape lets the same
|
|
302
|
+
* document detect inaccessible boards via the empty-array reply
|
|
303
|
+
* from Monday.
|
|
304
|
+
*/
|
|
305
|
+
const CROSS_BOARD_SEARCH_QUERY = `
|
|
306
|
+
query CrossBoardSearch($boardId: ID!, $rules: [ItemsQueryRule!]!, $limit: Int!) {
|
|
307
|
+
boards(ids: [$boardId]) {
|
|
308
|
+
id
|
|
309
|
+
name
|
|
310
|
+
items_page(limit: $limit, query_params: { rules: $rules }) {
|
|
311
|
+
cursor
|
|
312
|
+
items {
|
|
313
|
+
id
|
|
314
|
+
name
|
|
315
|
+
state
|
|
316
|
+
column_values {
|
|
317
|
+
id
|
|
318
|
+
text
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
`;
|
|
325
|
+
const wireColumnValueSchema = z
|
|
326
|
+
.object({
|
|
327
|
+
id: z.string().min(1),
|
|
328
|
+
text: z.string().nullable(),
|
|
329
|
+
})
|
|
330
|
+
.loose();
|
|
331
|
+
const wireItemSchema = z
|
|
332
|
+
.object({
|
|
333
|
+
id: z.string().min(1),
|
|
334
|
+
name: z.string(),
|
|
335
|
+
state: z.string().nullable(),
|
|
336
|
+
column_values: z.array(wireColumnValueSchema),
|
|
337
|
+
})
|
|
338
|
+
.loose();
|
|
339
|
+
const wireItemsPageSchema = z
|
|
340
|
+
.object({
|
|
341
|
+
cursor: z.string().nullable(),
|
|
342
|
+
items: z.array(wireItemSchema),
|
|
343
|
+
})
|
|
344
|
+
.loose();
|
|
345
|
+
const wireBoardSchema = z
|
|
346
|
+
.object({
|
|
347
|
+
id: z.string().min(1),
|
|
348
|
+
name: z.string(),
|
|
349
|
+
items_page: wireItemsPageSchema,
|
|
350
|
+
})
|
|
351
|
+
.loose();
|
|
352
|
+
const crossBoardSearchResponseSchema = z
|
|
353
|
+
.object({
|
|
354
|
+
boards: z.array(wireBoardSchema.nullable()).nullable(),
|
|
355
|
+
})
|
|
356
|
+
.loose();
|
|
357
|
+
/**
|
|
358
|
+
* Cross-board fan-out walker entry point. Per the M23 empirical-
|
|
359
|
+
* probe findings, the walker:
|
|
360
|
+
*
|
|
361
|
+
* 1. Issues one `boards(ids: [$boardId]) { items_page(query_params:
|
|
362
|
+
* { rules }) }` GraphQL call per plan (per-board rule sets
|
|
363
|
+
* can't fold into a single document; N calls preserve the
|
|
364
|
+
* static document shape + transparent per-board latency
|
|
365
|
+
* profile that Decision 5's wall-clock cap is calibrated for).
|
|
366
|
+
* 2. Walks plans sequentially so the aggregate `--limit` can
|
|
367
|
+
* short-circuit further fan-out before issuing calls whose
|
|
368
|
+
* results would be discarded.
|
|
369
|
+
* 3. Streams each item via `onItem` as it arrives (push-then-
|
|
370
|
+
* await per `pagination.ts:369`); deterministic per-board-id
|
|
371
|
+
* order matches `inputs.plans`.
|
|
372
|
+
* 4. Detects inaccessibility via Monday's silent-omit shape
|
|
373
|
+
* (`boards(ids: [<bad>])` returns `{boards: []}`). Boards
|
|
374
|
+
* missing from the response surface in
|
|
375
|
+
* `inaccessible_boards.details.missing_board_ids`.
|
|
376
|
+
* 5. Surfaces `cross_board_truncated` (Codex round-1 P1-2) when
|
|
377
|
+
* `--limit` short-circuits OR any board's `items_page.cursor`
|
|
378
|
+
* came back non-null at the v0.3 single-call surface.
|
|
379
|
+
*
|
|
380
|
+
* Boards in `boardIds` that don't appear in `plans` are NOT scanned
|
|
381
|
+
* — the column-resolution pre-pass already filtered them (with a
|
|
382
|
+
* `column_not_found_on_board` warning surfaced by the action, not
|
|
383
|
+
* the walker). The walker's contract is "fan out across `plans` and
|
|
384
|
+
* detect inaccessibility against `boardIds`", separating the two
|
|
385
|
+
* concerns for independent testability.
|
|
386
|
+
*
|
|
387
|
+
* **`source` is always `'live'`** per the Codex round-2 P2-1 fix —
|
|
388
|
+
* the action layer aggregates this with the per-board column-
|
|
389
|
+
* resolution pre-pass cache state via `SourceAggregator` and
|
|
390
|
+
* resolves the envelope's `meta.source` / `meta.cache_age_seconds`
|
|
391
|
+
* from the aggregator's resolved state.
|
|
392
|
+
*/
|
|
393
|
+
export const crossBoardSearch = async (inputs) => {
|
|
394
|
+
/* c8 ignore start */
|
|
395
|
+
// Defensive: the action layer's pre-pass filters out boards
|
|
396
|
+
// without resolvable columns before constructing
|
|
397
|
+
// CrossBoardSearchInputs; an empty boardIds array means the
|
|
398
|
+
// pre-pass found NO viable board, which the action should have
|
|
399
|
+
// surfaced as a different error (no plans → nothing to walk).
|
|
400
|
+
// The walker rejects rather than returning `{items: [], hasMore:
|
|
401
|
+
// false}` so the empty-boardIds case can't silently masquerade
|
|
402
|
+
// as a "no items matched" success.
|
|
403
|
+
if (inputs.boardIds.length === 0) {
|
|
404
|
+
throw new ApiError('internal_error', 'crossBoardSearch: boardIds is empty — the column-resolution pre-pass should ensure at least one board is scanned before calling the walker');
|
|
405
|
+
}
|
|
406
|
+
/* c8 ignore stop */
|
|
407
|
+
const pageSize = inputs.pageSize ?? 100;
|
|
408
|
+
const maxItems = inputs.maxItems;
|
|
409
|
+
// Per-board walk-state tracking for the cross_board_truncated
|
|
410
|
+
// warning. The walker writes into `walkedBoardState` only for
|
|
411
|
+
// boards it actually walked (got a wire response back). The
|
|
412
|
+
// final `per_board_state` shape is computed at end-of-walk
|
|
413
|
+
// from this map + the boardIds set (boards never reached →
|
|
414
|
+
// 'not_started'; boards walked but inaccessible → omitted,
|
|
415
|
+
// surfaced separately via `inaccessible_boards`).
|
|
416
|
+
const walkedBoardState = new Map();
|
|
417
|
+
const items = [];
|
|
418
|
+
// Boards we actually issued a GraphQL call for. Distinct from
|
|
419
|
+
// `returnedBoardIds` so we can tell "inaccessible (attempted, wire
|
|
420
|
+
// returned []) " apart from "not_started (--limit short-circuited
|
|
421
|
+
// before reaching the board)".
|
|
422
|
+
const attemptedBoardIds = new Set();
|
|
423
|
+
const returnedBoardIds = new Set();
|
|
424
|
+
let complexity = null;
|
|
425
|
+
let limitHit = false;
|
|
426
|
+
for (const plan of inputs.plans) {
|
|
427
|
+
if (maxItems !== undefined && items.length >= maxItems) {
|
|
428
|
+
limitHit = true;
|
|
429
|
+
break;
|
|
430
|
+
}
|
|
431
|
+
const boardId = plan.board_id;
|
|
432
|
+
attemptedBoardIds.add(boardId);
|
|
433
|
+
const wireRules = plan.rules.map((r) => ({
|
|
434
|
+
column_id: r.column_id,
|
|
435
|
+
compare_value: r.compare_values,
|
|
436
|
+
}));
|
|
437
|
+
// Cap the per-board page size at the remaining --limit budget
|
|
438
|
+
// so the walker doesn't fetch more items than it'll keep.
|
|
439
|
+
// Defensive `Math.max` against zero/negative — the outer
|
|
440
|
+
// `items.length >= maxItems` guard normally catches the
|
|
441
|
+
// exhausted case before we reach here.
|
|
442
|
+
const remaining = maxItems !== undefined ? maxItems - items.length : pageSize;
|
|
443
|
+
const limit = Math.max(1, Math.min(pageSize, remaining));
|
|
444
|
+
const response = await inputs.client.raw(CROSS_BOARD_SEARCH_QUERY, { boardId, rules: wireRules, limit }, { operationName: 'CrossBoardSearch' });
|
|
445
|
+
complexity = response.complexity;
|
|
446
|
+
// R-NEW-19 lift — canonical parse-failure envelope via the
|
|
447
|
+
// existing R18 `unwrapOrThrow` helper; `details.board_id`
|
|
448
|
+
// threads through as a per-call discriminant.
|
|
449
|
+
const parsedData = unwrapOrThrow(crossBoardSearchResponseSchema.safeParse(response.data), {
|
|
450
|
+
context: 'Monday cross-board search response',
|
|
451
|
+
details: { board_id: boardId },
|
|
452
|
+
hint: 'Monday may have amended the `boards(ids:) { items_page }` surface — re-probe via `scripts/probe/m23-cross-board-search-2.ts` and amend cli-design §13 v0.3 entry if so',
|
|
453
|
+
});
|
|
454
|
+
const boards = (parsedData.boards ?? []).filter((b) => b !== null);
|
|
455
|
+
const board = boards[0];
|
|
456
|
+
if (board === undefined) {
|
|
457
|
+
// Inaccessible — Monday returns `boards = []` for IDs the
|
|
458
|
+
// token can't access. We don't record a walk-state for this
|
|
459
|
+
// board; the inaccessibility surfaces separately via
|
|
460
|
+
// `inaccessible_boards` below.
|
|
461
|
+
continue;
|
|
462
|
+
}
|
|
463
|
+
returnedBoardIds.add(board.id);
|
|
464
|
+
const cursor = board.items_page.cursor;
|
|
465
|
+
for (const rawItem of board.items_page.items) {
|
|
466
|
+
if (maxItems !== undefined && items.length >= maxItems) {
|
|
467
|
+
limitHit = true;
|
|
468
|
+
break;
|
|
469
|
+
}
|
|
470
|
+
const columnValues = {};
|
|
471
|
+
for (const cv of rawItem.column_values) {
|
|
472
|
+
columnValues[cv.id] = cv.text;
|
|
473
|
+
}
|
|
474
|
+
const item = {
|
|
475
|
+
id: rawItem.id,
|
|
476
|
+
name: rawItem.name,
|
|
477
|
+
state: rawItem.state,
|
|
478
|
+
board: { id: board.id, name: board.name },
|
|
479
|
+
column_values: columnValues,
|
|
480
|
+
};
|
|
481
|
+
items.push(item);
|
|
482
|
+
if (inputs.onItem !== undefined) {
|
|
483
|
+
// M18 push-then-await: append to the buffer FIRST so a
|
|
484
|
+
// listener exception doesn't tear down the in-flight item;
|
|
485
|
+
// the walker's onItem-hook contract matches paginate's.
|
|
486
|
+
await inputs.onItem(item);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
if (limitHit) {
|
|
490
|
+
// The board still has more items beyond what we collected
|
|
491
|
+
// (the aggregate --limit fired mid-page).
|
|
492
|
+
walkedBoardState.set(boardId, 'has_more');
|
|
493
|
+
break;
|
|
494
|
+
}
|
|
495
|
+
// Drained this board's first page. v0.3 is single-call-only
|
|
496
|
+
// per board — non-null cursor → board has more items;
|
|
497
|
+
// surfaced via cross_board_truncated for agent introspection
|
|
498
|
+
// (no resumable cross-board cursor — narrow with
|
|
499
|
+
// --workspace / --favorites or use the v0.1 --board path).
|
|
500
|
+
walkedBoardState.set(boardId, cursor === null ? 'exhausted' : 'has_more');
|
|
501
|
+
}
|
|
502
|
+
// Materialise the final per_board_state shape. Boards we walked
|
|
503
|
+
// carry their actual state ('exhausted' | 'has_more'). Boards in
|
|
504
|
+
// `boardIds` that we never reached (--limit short-circuit) are
|
|
505
|
+
// 'not_started'. Boards we attempted but Monday omitted are
|
|
506
|
+
// OMITTED here — surfaced separately via `inaccessible_boards`.
|
|
507
|
+
const perBoardState = {};
|
|
508
|
+
for (const bid of inputs.boardIds) {
|
|
509
|
+
const walked = walkedBoardState.get(bid);
|
|
510
|
+
if (walked !== undefined) {
|
|
511
|
+
perBoardState[bid] = walked;
|
|
512
|
+
}
|
|
513
|
+
else if (!attemptedBoardIds.has(bid)) {
|
|
514
|
+
// Never reached — fan-out stopped before this board.
|
|
515
|
+
perBoardState[bid] = 'not_started';
|
|
516
|
+
}
|
|
517
|
+
// Else: attempted but not walked (inaccessible) → omitted.
|
|
518
|
+
}
|
|
519
|
+
const warnings = [];
|
|
520
|
+
// Inaccessibility = boards we attempted but Monday's wire response
|
|
521
|
+
// omitted. Boards we never attempted (--limit short-circuited
|
|
522
|
+
// before reaching them) don't count as inaccessible — they're
|
|
523
|
+
// surfaced via `cross_board_truncated.per_board_state` as
|
|
524
|
+
// `not_started` for agent introspection.
|
|
525
|
+
const attemptedArr = Array.from(attemptedBoardIds);
|
|
526
|
+
if (attemptedArr.length > returnedBoardIds.size) {
|
|
527
|
+
warnings.push(buildInaccessibleBoardsWarning(attemptedArr, Array.from(returnedBoardIds)));
|
|
528
|
+
}
|
|
529
|
+
const anyNotExhausted = Object.values(perBoardState).some((s) => s !== 'exhausted');
|
|
530
|
+
const hasMore = limitHit || anyNotExhausted;
|
|
531
|
+
if (hasMore) {
|
|
532
|
+
const reason = limitHit
|
|
533
|
+
? 'limit_hit'
|
|
534
|
+
: 'board_has_more';
|
|
535
|
+
warnings.push(buildCrossBoardTruncatedWarning(reason, items.length, maxItems ?? null, perBoardState));
|
|
536
|
+
}
|
|
537
|
+
return {
|
|
538
|
+
items,
|
|
539
|
+
hasMore,
|
|
540
|
+
totalReturned: items.length,
|
|
541
|
+
complexity,
|
|
542
|
+
warnings,
|
|
543
|
+
source: 'live',
|
|
544
|
+
};
|
|
545
|
+
};
|
|
546
|
+
export { BoardIdSchema };
|
|
547
|
+
//# sourceMappingURL=cross-board-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-board-search.js","sourceRoot":"","sources":["../../src/api/cross-board-search.ts"],"names":[],"mappings":"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"}
|