seclab-taskflow-agent 0.2.0__tar.gz → 0.3.0__tar.gz

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 (149) hide show
  1. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.github/workflows/publish-to-pypi.yaml +7 -8
  2. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.github/workflows/publish-to-testpypi.yaml +7 -8
  3. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/PKG-INFO +127 -10
  4. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/README.md +114 -2
  5. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/doc/GRAMMAR.md +37 -2
  6. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/model_configs/model_config.yaml +1 -3
  7. seclab_taskflow_agent-0.3.0/examples/model_configs/responses_api.yaml +17 -0
  8. seclab_taskflow_agent-0.3.0/examples/taskflows/comprehensive_test.yaml +125 -0
  9. seclab_taskflow_agent-0.3.0/examples/taskflows/echo_responses_api.yaml +20 -0
  10. seclab_taskflow_agent-0.3.0/examples/taskflows/edge_case_test.yaml +69 -0
  11. seclab_taskflow_agent-0.3.0/examples/taskflows/example_responses_api.yaml +19 -0
  12. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/pyproject.toml +92 -72
  13. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/__about__.py +1 -1
  14. seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/__init__.py +50 -0
  15. seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/__main__.py +28 -0
  16. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/agent.py +71 -28
  17. seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/available_tools.py +167 -0
  18. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/banner.py +8 -2
  19. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/capi.py +43 -35
  20. seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/cli.py +178 -0
  21. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/env_utils.py +11 -3
  22. seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/mcp_lifecycle.py +167 -0
  23. seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/mcp_prompt.py +105 -0
  24. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/client.py +1 -0
  25. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/jsonrpyc/__init__.py +1 -1
  26. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/memcache/memcache_backend/dictionary_file.py +2 -2
  27. seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/mcp_transport.py +313 -0
  28. seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/mcp_utils.py +282 -0
  29. seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/models.py +228 -0
  30. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/path_utils.py +21 -3
  31. seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/prompt_parser.py +73 -0
  32. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/render_utils.py +11 -5
  33. seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/runner.py +733 -0
  34. seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/session.py +136 -0
  35. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/shell_utils.py +15 -4
  36. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/template_utils.py +19 -7
  37. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/test_api_endpoint_config.py +6 -7
  38. seclab_taskflow_agent-0.3.0/tests/test_capi_extended.py +97 -0
  39. seclab_taskflow_agent-0.3.0/tests/test_cli.py +84 -0
  40. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/test_cli_parser.py +8 -8
  41. seclab_taskflow_agent-0.3.0/tests/test_mcp_transport.py +45 -0
  42. seclab_taskflow_agent-0.3.0/tests/test_models.py +324 -0
  43. seclab_taskflow_agent-0.3.0/tests/test_prompt_parser_edge.py +123 -0
  44. seclab_taskflow_agent-0.3.0/tests/test_runner.py +443 -0
  45. seclab_taskflow_agent-0.3.0/tests/test_session.py +94 -0
  46. seclab_taskflow_agent-0.3.0/tests/test_session_edge.py +107 -0
  47. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/test_template_utils.py +1 -1
  48. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/test_yaml_parser.py +18 -17
  49. seclab_taskflow_agent-0.2.0/src/seclab_taskflow_agent/__main__.py +0 -671
  50. seclab_taskflow_agent-0.2.0/src/seclab_taskflow_agent/available_tools.py +0 -111
  51. seclab_taskflow_agent-0.2.0/src/seclab_taskflow_agent/mcp_servers/memcache/memcache_backend/__init__.py +0 -2
  52. seclab_taskflow_agent-0.2.0/src/seclab_taskflow_agent/mcp_utils.py +0 -467
  53. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.devcontainer/Dockerfile +0 -0
  54. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.devcontainer/devcontainer.json +0 -0
  55. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.devcontainer/post-attach.sh +0 -0
  56. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.devcontainer/post-create.sh +0 -0
  57. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.dockerignore +0 -0
  58. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.github/workflows/ci.yml +0 -0
  59. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.github/workflows/codeql.yml +0 -0
  60. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.github/workflows/release.yml +0 -0
  61. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.github/workflows/smoketest.yaml +0 -0
  62. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/.gitignore +0 -0
  63. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/CODEOWNERS +0 -0
  64. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/CODE_OF_CONDUCT.md +0 -0
  65. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/CONTRIBUTING.md +0 -0
  66. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/LICENSE +0 -0
  67. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/NOTICE +0 -0
  68. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/SECURITY.md +0 -0
  69. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/SUPPORT.md +0 -0
  70. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/doc/MIGRATION.md +0 -0
  71. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/docker/Dockerfile +0 -0
  72. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/docker/run.sh +0 -0
  73. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/personalities/apple_expert.yaml +0 -0
  74. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/personalities/banana_expert.yaml +0 -0
  75. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/personalities/echo.yaml +0 -0
  76. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/personalities/example_triage_agent.yaml +0 -0
  77. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/personalities/fruit_expert.yaml +0 -0
  78. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/personalities/orange_expert.yaml +0 -0
  79. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/prompts/example_prompt.yaml +0 -0
  80. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/CVE-2023-2283.yaml +0 -0
  81. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/echo.yaml +0 -0
  82. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example.yaml +0 -0
  83. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_globals.yaml +0 -0
  84. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_inputs.yaml +0 -0
  85. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_large_list_result_iter.yaml +0 -0
  86. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_repeat_prompt.yaml +0 -0
  87. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_repeat_prompt_async.yaml +0 -0
  88. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_repeat_prompt_dictionary.yaml +0 -0
  89. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_reusable_prompt.yaml +0 -0
  90. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_reusable_taskflows.yaml +0 -0
  91. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/example_triage_taskflow.yaml +0 -0
  92. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/examples/taskflows/single_step_taskflow.yaml +0 -0
  93. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/misc/codeql_fetch_db.sh +0 -0
  94. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/release_tools/HOWTO.md +0 -0
  95. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/release_tools/copy_files.py +0 -0
  96. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/release_tools/publish_docker.py +0 -0
  97. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/release_tools/release.sh +0 -0
  98. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/release_tools/version_bump.sh +0 -0
  99. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/release_tools/version_tag.sh +0 -0
  100. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/scripts/migrate_to_jinja2.py +0 -0
  101. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/scripts/test_examples.sh +0 -0
  102. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/jsonrpyc/LICENSE +0 -0
  103. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/jsonrpyc/__meta__.py +0 -0
  104. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/jsonrpyc/py.typed +0 -0
  105. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/mcp_server.py +0 -0
  106. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/README.md +0 -0
  107. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/absolute_to_relative.ql +0 -0
  108. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/call_graph_from.ql +0 -0
  109. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/call_graph_from_to.ql +0 -0
  110. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/call_graph_to.ql +0 -0
  111. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/codeql-pack.lock.yml +0 -0
  112. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/declaration_location_for_variable.ql +0 -0
  113. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/definition_location_for_function.ql +0 -0
  114. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/list_functions.ql +0 -0
  115. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/locations.qll +0 -0
  116. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/qlpack.yml +0 -0
  117. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/relative_to_absolute.ql +0 -0
  118. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-cpp/stmt_location.ql +0 -0
  119. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-js/absolute_to_relative.ql +0 -0
  120. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-js/call_graph_from.ql +0 -0
  121. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-js/call_graph_to.ql +0 -0
  122. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-js/definition_location_for_function.ql +0 -0
  123. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-js/locations.qll +0 -0
  124. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-js/qlpack.yml +0 -0
  125. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/codeql/queries/mcp-js/relative_to_absolute.ql +0 -0
  126. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/echo/echo.py +0 -0
  127. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/logbook/logbook.py +0 -0
  128. {seclab_taskflow_agent-0.2.0/src/seclab_taskflow_agent → seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/mcp_servers/memcache}/__init__.py +0 -0
  129. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/memcache/memcache.py +0 -0
  130. {seclab_taskflow_agent-0.2.0/src/seclab_taskflow_agent/mcp_servers/memcache → seclab_taskflow_agent-0.3.0/src/seclab_taskflow_agent/mcp_servers/memcache/memcache_backend}/__init__.py +0 -0
  131. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/memcache/memcache_backend/backend.py +0 -0
  132. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/memcache/memcache_backend/sql_models.py +0 -0
  133. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/mcp_servers/memcache/memcache_backend/sqlite.py +0 -0
  134. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/personalities/assistant.yaml +0 -0
  135. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/personalities/c_auditer.yaml +0 -0
  136. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/toolboxes/codeql.yaml +0 -0
  137. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/toolboxes/echo.yaml +0 -0
  138. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/toolboxes/github_official.yaml +0 -0
  139. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/toolboxes/logbook.yaml +0 -0
  140. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/src/seclab_taskflow_agent/toolboxes/memcache.yaml +0 -0
  141. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/README.md +0 -0
  142. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/__init__.py +0 -0
  143. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/data/test_globals_taskflow.yaml +0 -0
  144. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/data/test_prompt_with_variables.yaml +0 -0
  145. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/data/test_reusable_taskflow_with_variables.yaml +0 -0
  146. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/data/test_taskflow_using_reusable.yaml +0 -0
  147. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/data/test_version_float.yaml +0 -0
  148. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/data/test_version_integer.yaml +0 -0
  149. {seclab_taskflow_agent-0.2.0 → seclab_taskflow_agent-0.3.0}/tests/data/test_yaml_parser_personality000.yaml +0 -0
@@ -21,6 +21,7 @@ jobs:
21
21
  permissions:
22
22
  contents: write
23
23
  id-token: write # For trusted publishing
24
+ attestations: write # For artifact attestation
24
25
 
25
26
  steps:
26
27
  - name: Checkout repository
@@ -39,24 +40,22 @@ jobs:
39
40
  - name: Build the wheel
40
41
  run: python3 -m hatch build
41
42
 
43
+ - name: Attest build provenance
44
+ uses: actions/attest-build-provenance@96278af6caaf10aea03fd8d33a09a777ca52d62f # v3.2.0
45
+ with:
46
+ subject-path: ./dist/*
47
+
42
48
  - name: Upload artifacts
43
49
  uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
44
50
  with:
45
51
  name: python-package-distributions
46
- path: dist/
52
+ path: ./dist/
47
53
 
48
54
  - name: Publish to PyPI
49
55
  uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
50
56
  with:
51
57
  verbose: true
52
58
 
53
- - name: Sign with sigstore
54
- uses: sigstore/gh-action-sigstore-python@f832326173235dcb00dd5d92cd3f353de3188e6c # v3.1.0
55
- with:
56
- inputs: >-
57
- ./dist/*.tar.gz
58
- ./dist/*.whl
59
-
60
59
  - name: Create GitHub Release
61
60
  env:
62
61
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -18,6 +18,7 @@ jobs:
18
18
  permissions:
19
19
  contents: write
20
20
  id-token: write # For trusted publishing
21
+ attestations: write # For artifact attestation
21
22
 
22
23
  steps:
23
24
  - name: Checkout repository
@@ -51,11 +52,16 @@ jobs:
51
52
  - name: Build the wheel
52
53
  run: python3 -m hatch build
53
54
 
55
+ - name: Attest build provenance
56
+ uses: actions/attest-build-provenance@96278af6caaf10aea03fd8d33a09a777ca52d62f # v3.2.0
57
+ with:
58
+ subject-path: ./dist/*
59
+
54
60
  - name: Upload artifacts
55
61
  uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
56
62
  with:
57
63
  name: python-package-distributions
58
- path: dist/
64
+ path: ./dist/
59
65
 
60
66
  - name: Publish to TestPyPI
61
67
  uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
@@ -63,13 +69,6 @@ jobs:
63
69
  repository-url: https://test.pypi.org/legacy/
64
70
  verbose: true
65
71
 
66
- - name: Sign with sigstore
67
- uses: sigstore/gh-action-sigstore-python@f832326173235dcb00dd5d92cd3f353de3188e6c # v3.1.0
68
- with:
69
- inputs: >-
70
- ./dist/*.tar.gz
71
- ./dist/*.whl
72
-
73
72
  - name: Create GitHub Release
74
73
  env:
75
74
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seclab-taskflow-agent
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: A taskflow agent for the SecLab project, enabling secure and automated workflow execution.
5
5
  Project-URL: Source, https://github.com/GitHubSecurityLab/seclab-taskflow-agent
6
6
  Project-URL: Issues, https://github.com/GitHubSecurityLab/seclab-taskflow-agent/issues
@@ -8,25 +8,30 @@ Author-email: GitHub Security Lab <securitylab@github.com>
8
8
  License-Expression: MIT
9
9
  License-File: LICENSE
10
10
  License-File: NOTICE
11
+ Keywords: agentic-workflows,mcp,openai-agents,pydantic,security-research,taskflow,yaml
11
12
  Classifier: Development Status :: 4 - Beta
13
+ Classifier: Intended Audience :: Developers
12
14
  Classifier: Programming Language :: Python
13
15
  Classifier: Programming Language :: Python :: 3.10
14
16
  Classifier: Programming Language :: Python :: 3.11
15
17
  Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
16
19
  Classifier: Programming Language :: Python :: Implementation :: CPython
17
20
  Classifier: Programming Language :: Python :: Implementation :: PyPy
21
+ Classifier: Topic :: Security
22
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
18
23
  Requires-Python: >=3.10
19
24
  Requires-Dist: aiofiles==24.1.0
20
25
  Requires-Dist: annotated-types==0.7.0
21
26
  Requires-Dist: anyio==4.9.0
22
27
  Requires-Dist: attrs==25.3.0
23
- Requires-Dist: authlib==1.6.6
28
+ Requires-Dist: authlib==1.6.9
24
29
  Requires-Dist: certifi==2025.6.15
25
30
  Requires-Dist: cffi==2.0.0
26
31
  Requires-Dist: charset-normalizer==3.4.2
27
32
  Requires-Dist: click==8.2.1
28
33
  Requires-Dist: colorama==0.4.6
29
- Requires-Dist: cryptography==46.0.5
34
+ Requires-Dist: cryptography==46.0.6
30
35
  Requires-Dist: cyclopts==4.0.0
31
36
  Requires-Dist: distro==1.9.0
32
37
  Requires-Dist: dnspython==2.8.0
@@ -34,7 +39,7 @@ Requires-Dist: docstring-parser==0.17.0
34
39
  Requires-Dist: docutils==0.22
35
40
  Requires-Dist: email-validator==2.3.0
36
41
  Requires-Dist: exceptiongroup==1.3.0
37
- Requires-Dist: fastmcp==2.14.0
42
+ Requires-Dist: fastmcp==2.14.2
38
43
  Requires-Dist: griffe==1.7.3
39
44
  Requires-Dist: h11==0.16.0
40
45
  Requires-Dist: httpcore==1.0.9
@@ -52,7 +57,7 @@ Requires-Dist: jsonschema==4.24.0
52
57
  Requires-Dist: lazy-object-proxy==1.12.0
53
58
  Requires-Dist: markdown-it-py==3.0.0
54
59
  Requires-Dist: markupsafe==3.0.2
55
- Requires-Dist: mcp==1.23.1
60
+ Requires-Dist: mcp==1.24.0
56
61
  Requires-Dist: mdurl==0.1.2
57
62
  Requires-Dist: more-itertools==10.8.0
58
63
  Requires-Dist: openai-agents==0.2.11
@@ -70,7 +75,7 @@ Requires-Dist: pycparser==2.23
70
75
  Requires-Dist: pydantic-core==2.33.2
71
76
  Requires-Dist: pydantic-settings==2.10.1
72
77
  Requires-Dist: pydantic==2.11.7
73
- Requires-Dist: pygments==2.19.2
78
+ Requires-Dist: pygments==2.20.0
74
79
  Requires-Dist: pyperclip==1.9.0
75
80
  Requires-Dist: python-dotenv==1.1.1
76
81
  Requires-Dist: python-lsp-jsonrpc==1.1.2
@@ -78,7 +83,7 @@ Requires-Dist: python-lsp-server==1.12.2
78
83
  Requires-Dist: python-multipart==0.0.22
79
84
  Requires-Dist: pyyaml==6.0.2
80
85
  Requires-Dist: referencing==0.36.2
81
- Requires-Dist: requests==2.32.4
86
+ Requires-Dist: requests==2.33.0
82
87
  Requires-Dist: rfc3339-validator==0.1.4
83
88
  Requires-Dist: rich-rst==1.3.1
84
89
  Requires-Dist: rich==14.0.0
@@ -95,7 +100,7 @@ Requires-Dist: typer==0.16.0
95
100
  Requires-Dist: types-requests==2.32.4.20250611
96
101
  Requires-Dist: typing-extensions==4.15.0
97
102
  Requires-Dist: typing-inspection==0.4.1
98
- Requires-Dist: ujson==5.10.0
103
+ Requires-Dist: ujson==5.12.0
99
104
  Requires-Dist: urllib3==2.6.3
100
105
  Requires-Dist: uvicorn==0.35.0
101
106
  Requires-Dist: zipp==3.23.0
@@ -103,9 +108,12 @@ Description-Content-Type: text/markdown
103
108
 
104
109
  # GitHub Security Lab Taskflow Agent
105
110
 
106
- The Security Lab Taskflow Agent is an MCP enabled multi-Agent framework.
111
+ The Security Lab Taskflow Agent is an MCP-enabled multi-Agent framework for
112
+ declarative, YAML-driven agentic workflows.
107
113
 
108
- The Taskflow Agent is built on top of the [OpenAI Agents SDK](https://openai.github.io/openai-agents-python/).
114
+ Built on top of the [OpenAI Agents SDK](https://openai.github.io/openai-agents-python/),
115
+ it uses [Pydantic](https://docs.pydantic.dev/) for grammar validation and
116
+ [Jinja2](https://jinja.palletsprojects.com/) for template rendering.
109
117
 
110
118
  ## Core Concepts
111
119
 
@@ -119,6 +127,115 @@ Agents can cooperate to complete sequences of tasks through so-called [taskflows
119
127
 
120
128
  You can find a detailed overview of the taskflow grammar [here](doc/GRAMMAR.md) and example taskflows [here](examples/taskflows/).
121
129
 
130
+ ## Architecture
131
+
132
+ ```
133
+ ┌─────────────────────────────────────────────────────┐
134
+ │ CLI (cli.py) │
135
+ │ Typer-based entry point: -p, -t, -l, -g, --resume │
136
+ └─────────────────────┬───────────────────────────────┘
137
+
138
+ ┌─────────────────────▼───────────────────────────────┐
139
+ │ Runner (runner.py) │
140
+ │ Taskflow execution loop, model resolution, │
141
+ │ template rendering, session checkpointing │
142
+ └─────────────────────┬───────────────────────────────┘
143
+
144
+ ┌─────────────────────▼───────────────────────────────┐
145
+ │ MCP Lifecycle (mcp_lifecycle.py) │
146
+ │ Server connection, cleanup, process management │
147
+ └─────────────────────┬───────────────────────────────┘
148
+
149
+ ┌─────────────────────▼───────────────────────────────┐
150
+ │ Agent (agent.py) │
151
+ │ TaskAgent wrapper, hooks, OpenAI Agents SDK bridge │
152
+ └─────────────────────────────────────────────────────┘
153
+
154
+ Supporting modules:
155
+ models.py — Pydantic v2 grammar models (validation)
156
+ session.py — Task-level checkpoint / resume
157
+ available_tools.py — YAML resource loader with caching
158
+ template_utils.py — Jinja2 template environment
159
+ mcp_utils.py — MCP client parameter resolution
160
+ mcp_transport.py — MCP transport implementations (stdio, streamable)
161
+ mcp_prompt.py — System prompt construction
162
+ prompt_parser.py — Legacy prompt argument parser
163
+ capi.py — AI API endpoint and token management
164
+ path_utils.py — Platform-aware data/log directories
165
+ ```
166
+
167
+ ### API Types
168
+
169
+ The agent supports both the **Chat Completions** and **Responses** OpenAI APIs.
170
+ The API type can be configured globally or per model in a `model_config` file:
171
+
172
+ ```yaml
173
+ seclab-taskflow-agent:
174
+ version: "1.0"
175
+ filetype: model_config
176
+ api_type: chat_completions # default for all models
177
+ models:
178
+ gpt_default: gpt-4.1
179
+ gpt_responses: gpt-5.1
180
+ model_settings:
181
+ gpt_responses:
182
+ api_type: responses # override for this model
183
+ endpoint: https://api.githubcopilot.com
184
+ token: CAPI_TOKEN # env var name containing the API key
185
+ ```
186
+
187
+ Per-model `model_settings` can include:
188
+ - **`api_type`** — `"chat_completions"` (default) or `"responses"`
189
+ - **`endpoint`** — API base URL override for this model
190
+ - **`token`** — name of an environment variable containing the API key
191
+
192
+ ### Session Recovery
193
+
194
+ Taskflow runs are automatically checkpointed at the task level. If a task
195
+ fails after exhausting retries, the session is saved and can be resumed:
196
+
197
+ ```
198
+ ** 🤖💾 Session saved: abc123def456
199
+ ** 🤖💡 Resume with: --resume abc123def456
200
+ ```
201
+
202
+ Resume from the last successful checkpoint:
203
+
204
+ ```bash
205
+ python -m seclab_taskflow_agent --resume abc123def456
206
+ ```
207
+
208
+ Failed tasks are automatically retried up to 3 times with increasing backoff
209
+ before the session is saved. Session checkpoints are stored in the
210
+ platform-specific application data directory.
211
+
212
+ ### Error Output
213
+
214
+ By default, errors are shown as concise one-line messages. Use `--debug` (or
215
+ set `TASK_AGENT_DEBUG=1`) for full tracebacks:
216
+
217
+ ```bash
218
+ # Concise (default)
219
+ Error: [BadRequestError] model 'foo' not found
220
+ (use --debug for full traceback)
221
+
222
+ # Full traceback
223
+ python -m seclab_taskflow_agent --debug -t examples.taskflows.echo
224
+ ```
225
+
226
+ ### MCP Environment Denylist
227
+
228
+ By default, MCP server subprocesses inherit the parent environment. To prevent
229
+ specific variables from leaking to MCP servers, set `TASKFLOW_ENV_DENYLIST` to
230
+ a comma-separated list of variable names:
231
+
232
+ ```bash
233
+ export TASKFLOW_ENV_DENYLIST="MY_SECRET_TOKEN,PRIVATE_KEY,OTHER_CREDENTIAL"
234
+ ```
235
+
236
+ Toolbox-level `env:` declarations in YAML still inject exactly what each server
237
+ needs, so explicitly configured variables are unaffected.
238
+
122
239
  ## Use Cases and Examples
123
240
 
124
241
  The Seclab Taskflow Agent framework was primarily designed to fit the iterative feedback loop driven work involved in Agentic security research workflows and vulnerability triage tasks.
@@ -1,8 +1,11 @@
1
1
  # GitHub Security Lab Taskflow Agent
2
2
 
3
- The Security Lab Taskflow Agent is an MCP enabled multi-Agent framework.
3
+ The Security Lab Taskflow Agent is an MCP-enabled multi-Agent framework for
4
+ declarative, YAML-driven agentic workflows.
4
5
 
5
- The Taskflow Agent is built on top of the [OpenAI Agents SDK](https://openai.github.io/openai-agents-python/).
6
+ Built on top of the [OpenAI Agents SDK](https://openai.github.io/openai-agents-python/),
7
+ it uses [Pydantic](https://docs.pydantic.dev/) for grammar validation and
8
+ [Jinja2](https://jinja.palletsprojects.com/) for template rendering.
6
9
 
7
10
  ## Core Concepts
8
11
 
@@ -16,6 +19,115 @@ Agents can cooperate to complete sequences of tasks through so-called [taskflows
16
19
 
17
20
  You can find a detailed overview of the taskflow grammar [here](doc/GRAMMAR.md) and example taskflows [here](examples/taskflows/).
18
21
 
22
+ ## Architecture
23
+
24
+ ```
25
+ ┌─────────────────────────────────────────────────────┐
26
+ │ CLI (cli.py) │
27
+ │ Typer-based entry point: -p, -t, -l, -g, --resume │
28
+ └─────────────────────┬───────────────────────────────┘
29
+
30
+ ┌─────────────────────▼───────────────────────────────┐
31
+ │ Runner (runner.py) │
32
+ │ Taskflow execution loop, model resolution, │
33
+ │ template rendering, session checkpointing │
34
+ └─────────────────────┬───────────────────────────────┘
35
+
36
+ ┌─────────────────────▼───────────────────────────────┐
37
+ │ MCP Lifecycle (mcp_lifecycle.py) │
38
+ │ Server connection, cleanup, process management │
39
+ └─────────────────────┬───────────────────────────────┘
40
+
41
+ ┌─────────────────────▼───────────────────────────────┐
42
+ │ Agent (agent.py) │
43
+ │ TaskAgent wrapper, hooks, OpenAI Agents SDK bridge │
44
+ └─────────────────────────────────────────────────────┘
45
+
46
+ Supporting modules:
47
+ models.py — Pydantic v2 grammar models (validation)
48
+ session.py — Task-level checkpoint / resume
49
+ available_tools.py — YAML resource loader with caching
50
+ template_utils.py — Jinja2 template environment
51
+ mcp_utils.py — MCP client parameter resolution
52
+ mcp_transport.py — MCP transport implementations (stdio, streamable)
53
+ mcp_prompt.py — System prompt construction
54
+ prompt_parser.py — Legacy prompt argument parser
55
+ capi.py — AI API endpoint and token management
56
+ path_utils.py — Platform-aware data/log directories
57
+ ```
58
+
59
+ ### API Types
60
+
61
+ The agent supports both the **Chat Completions** and **Responses** OpenAI APIs.
62
+ The API type can be configured globally or per model in a `model_config` file:
63
+
64
+ ```yaml
65
+ seclab-taskflow-agent:
66
+ version: "1.0"
67
+ filetype: model_config
68
+ api_type: chat_completions # default for all models
69
+ models:
70
+ gpt_default: gpt-4.1
71
+ gpt_responses: gpt-5.1
72
+ model_settings:
73
+ gpt_responses:
74
+ api_type: responses # override for this model
75
+ endpoint: https://api.githubcopilot.com
76
+ token: CAPI_TOKEN # env var name containing the API key
77
+ ```
78
+
79
+ Per-model `model_settings` can include:
80
+ - **`api_type`** — `"chat_completions"` (default) or `"responses"`
81
+ - **`endpoint`** — API base URL override for this model
82
+ - **`token`** — name of an environment variable containing the API key
83
+
84
+ ### Session Recovery
85
+
86
+ Taskflow runs are automatically checkpointed at the task level. If a task
87
+ fails after exhausting retries, the session is saved and can be resumed:
88
+
89
+ ```
90
+ ** 🤖💾 Session saved: abc123def456
91
+ ** 🤖💡 Resume with: --resume abc123def456
92
+ ```
93
+
94
+ Resume from the last successful checkpoint:
95
+
96
+ ```bash
97
+ python -m seclab_taskflow_agent --resume abc123def456
98
+ ```
99
+
100
+ Failed tasks are automatically retried up to 3 times with increasing backoff
101
+ before the session is saved. Session checkpoints are stored in the
102
+ platform-specific application data directory.
103
+
104
+ ### Error Output
105
+
106
+ By default, errors are shown as concise one-line messages. Use `--debug` (or
107
+ set `TASK_AGENT_DEBUG=1`) for full tracebacks:
108
+
109
+ ```bash
110
+ # Concise (default)
111
+ Error: [BadRequestError] model 'foo' not found
112
+ (use --debug for full traceback)
113
+
114
+ # Full traceback
115
+ python -m seclab_taskflow_agent --debug -t examples.taskflows.echo
116
+ ```
117
+
118
+ ### MCP Environment Denylist
119
+
120
+ By default, MCP server subprocesses inherit the parent environment. To prevent
121
+ specific variables from leaking to MCP servers, set `TASKFLOW_ENV_DENYLIST` to
122
+ a comma-separated list of variable names:
123
+
124
+ ```bash
125
+ export TASKFLOW_ENV_DENYLIST="MY_SECRET_TOKEN,PRIVATE_KEY,OTHER_CREDENTIAL"
126
+ ```
127
+
128
+ Toolbox-level `env:` declarations in YAML still inject exactly what each server
129
+ needs, so explicitly configured variables are unaffected.
130
+
19
131
  ## Use Cases and Examples
20
132
 
21
133
  The Seclab Taskflow Agent framework was primarily designed to fit the iterative feedback loop driven work involved in Agentic security research workflows and vulnerability triage tasks.
@@ -89,7 +89,7 @@ Tasks can optionally specify which Model to use on the configured inference endp
89
89
  This is a user prompt.
90
90
  ```
91
91
 
92
- Note that model identifiers may differ between OpenAI compatible endpoint providers, make sure you change your model identifier accordingly when switching providers. If not specified, a default LLM model (`gpt-4o`) is used.
92
+ Note that model identifiers may differ between OpenAI compatible endpoint providers, make sure you change your model identifier accordingly when switching providers. If not specified, a default LLM model (such as `gpt-4.1`) is used.
93
93
 
94
94
  Parameters to the model can also be specified in the task using the `model_settings` section:
95
95
 
@@ -509,4 +509,39 @@ When `gpt_latest` is used in the taskflow to specify a model, the value `gpt-5`
509
509
 
510
510
  ```
511
511
 
512
- This provides a easy way to update model versions in a taskflow.
512
+ This provides an easy way to update model versions in a taskflow.
513
+
514
+ #### Per-model settings
515
+
516
+ A `model_config` file can include per-model settings via `model_settings` and a
517
+ global `api_type` that applies to all models unless overridden:
518
+
519
+ ```yaml
520
+ seclab-taskflow-agent:
521
+ version: "1.0"
522
+ filetype: model_config
523
+ api_type: chat_completions # default for all models
524
+ models:
525
+ gpt_default: gpt-4.1
526
+ gpt_responses: gpt-5.1
527
+ model_settings:
528
+ gpt_default:
529
+ temperature: 0.7
530
+ gpt_responses:
531
+ api_type: responses # use the Responses API for this model
532
+ endpoint: https://api.githubcopilot.com
533
+ token: CAPI_TOKEN # env var name containing the API key
534
+ temperature: 0.5
535
+ ```
536
+
537
+ The following keys in `model_settings` are handled by the engine and are not
538
+ passed to the underlying model provider:
539
+
540
+ | Key | Description | Default |
541
+ |-----|-------------|---------|
542
+ | `api_type` | `"chat_completions"` or `"responses"` | Inherited from top-level `api_type`, or `"chat_completions"` |
543
+ | `endpoint` | API base URL for this model | The global `AI_API_ENDPOINT` env var |
544
+ | `token` | Name of an environment variable containing the API key | Uses `AI_API_TOKEN` / `COPILOT_TOKEN` |
545
+
546
+ All other keys (e.g. `temperature`, `top_p`) are passed through as model
547
+ parameters to the OpenAI SDK.
@@ -5,7 +5,5 @@ seclab-taskflow-agent:
5
5
  version: "1.0"
6
6
  filetype: model_config
7
7
  models:
8
- sonnet_default: claude-sonnet-4
9
- sonnet_latest: claude-sonnet-4.5
10
8
  gpt_default: gpt-4.1
11
- gpt_latest: gpt-5
9
+
@@ -0,0 +1,17 @@
1
+ # SPDX-FileCopyrightText: GitHub, Inc.
2
+ # SPDX-License-Identifier: MIT
3
+
4
+ # Example: per-model API type and endpoint configuration.
5
+ # gpt_responses uses the Responses API on the CAPI endpoint,
6
+ # reading its token from the CAPI_TOKEN env var.
7
+
8
+ seclab-taskflow-agent:
9
+ version: "1.0"
10
+ filetype: model_config
11
+ models:
12
+ gpt_responses: gpt-5.1
13
+ model_settings:
14
+ gpt_responses:
15
+ api_type: responses
16
+ endpoint: https://api.githubcopilot.com
17
+ token: CAPI_TOKEN
@@ -0,0 +1,125 @@
1
+ # SPDX-FileCopyrightText: GitHub, Inc.
2
+ # SPDX-License-Identifier: MIT
3
+
4
+ # Comprehensive test taskflow that exercises every grammar feature:
5
+ # - model_config reference with model aliases
6
+ # - globals (with CLI override via -g)
7
+ # - inputs (task-level template variables)
8
+ # - env (task-scoped environment variables)
9
+ # - must_complete
10
+ # - exclude_from_context
11
+ # - max_steps
12
+ # - MCP toolboxes (echo)
13
+ # - shell task (run)
14
+ # - repeat_prompt + async iteration
15
+ # - reusable tasks (uses)
16
+ # - reusable prompts ({% include %})
17
+ # - agent handoffs (multi-agent)
18
+ # - headless mode
19
+ # - blocked_tools
20
+
21
+ seclab-taskflow-agent:
22
+ version: "1.0"
23
+ filetype: taskflow
24
+
25
+ model_config: examples.model_configs.model_config
26
+
27
+ globals:
28
+ topic: fruit
29
+ detail_level: brief
30
+
31
+ taskflow:
32
+ # ---------------------------------------------------------------
33
+ # Task 1: Shell task — produces a JSON array for repeat_prompt
34
+ # Features: run, must_complete
35
+ # ---------------------------------------------------------------
36
+ - task:
37
+ name: generate-items
38
+ must_complete: true
39
+ run: |
40
+ echo '[{"name": "apple", "color": "red"}, {"name": "banana", "color": "yellow"}, {"name": "orange", "color": "orange"}]'
41
+
42
+ # ---------------------------------------------------------------
43
+ # Task 2: Repeat prompt over shell output, async iteration
44
+ # Features: repeat_prompt, async, async_limit, exclude_from_context,
45
+ # model (alias), inputs, globals, env, max_steps
46
+ # ---------------------------------------------------------------
47
+ - task:
48
+ name: describe-items
49
+ repeat_prompt: true
50
+ async: true
51
+ async_limit: 3
52
+ exclude_from_context: true
53
+ must_complete: true
54
+ model: gpt_default
55
+ max_steps: 10
56
+ agents:
57
+ - examples.personalities.fruit_expert
58
+ inputs:
59
+ format: one-sentence
60
+ env:
61
+ FRUIT_MODE: "analysis"
62
+ user_prompt: |
63
+ The topic is {{ globals.topic }} at {{ globals.detail_level }} detail level.
64
+ Describe the {{ result.name }} (which is {{ result.color }}) in {{ inputs.format }} format.
65
+
66
+ # ---------------------------------------------------------------
67
+ # Task 3: MCP tool call with echo server
68
+ # Features: toolboxes, headless, blocked_tools
69
+ # ---------------------------------------------------------------
70
+ - task:
71
+ name: echo-test
72
+ must_complete: true
73
+ headless: true
74
+ agents:
75
+ - examples.personalities.echo
76
+ user_prompt: |
77
+ Echo the following message: "All {{ globals.topic }} items processed successfully"
78
+ blocked_tools:
79
+ - nonexistent_tool_to_test_filtering
80
+
81
+ # ---------------------------------------------------------------
82
+ # Task 4: Reusable task via `uses`
83
+ # Features: uses (inherits from single_step_taskflow)
84
+ # ---------------------------------------------------------------
85
+ - task:
86
+ name: reusable-task
87
+ uses: examples.taskflows.single_step_taskflow
88
+ model: gpt_default
89
+
90
+ # ---------------------------------------------------------------
91
+ # Task 5: Reusable prompt via {% include %}
92
+ # Features: Jinja2 include directive, reusable prompts
93
+ # ---------------------------------------------------------------
94
+ - task:
95
+ name: include-prompt
96
+ agents:
97
+ - examples.personalities.fruit_expert
98
+ model: gpt_default
99
+ max_steps: 5
100
+ user_prompt: |
101
+ Tell me about apples.
102
+
103
+ {% include 'examples.prompts.example_prompt' %}
104
+
105
+ Keep your answer to two sentences per fruit.
106
+
107
+ # ---------------------------------------------------------------
108
+ # Task 6: Agent handoffs (multi-agent)
109
+ # Features: multiple agents (first=primary, rest=handoff targets)
110
+ # ---------------------------------------------------------------
111
+ - task:
112
+ name: handoff-test
113
+ model: gpt_default
114
+ max_steps: 15
115
+ agents:
116
+ - examples.personalities.fruit_expert
117
+ - examples.personalities.apple_expert
118
+ - examples.personalities.banana_expert
119
+ - examples.personalities.orange_expert
120
+ user_prompt: |
121
+ You are a fruit coordinator. I need specific expert advice on each fruit.
122
+ Please hand off to the apple expert for a one-sentence fact about apples,
123
+ then to the banana expert for a one-sentence fact about bananas,
124
+ then to the orange expert for a one-sentence fact about oranges.
125
+ Each expert should provide exactly one interesting fact.
@@ -0,0 +1,20 @@
1
+ # SPDX-FileCopyrightText: GitHub, Inc.
2
+ # SPDX-License-Identifier: MIT
3
+
4
+ # Echo taskflow using the Responses API with MCP tool calls.
5
+
6
+ seclab-taskflow-agent:
7
+ version: "1.0"
8
+ filetype: taskflow
9
+
10
+ model_config: examples.model_configs.responses_api
11
+
12
+ taskflow:
13
+ - task:
14
+ max_steps: 5
15
+ must_complete: true
16
+ agents:
17
+ - examples.personalities.echo
18
+ model: gpt_responses
19
+ user_prompt: |
20
+ Hello from the Responses API